我认为会很快的一种选择是使用基本的片段着色器。
幸运的是,你有一个非常接近你需要的例子,通过File > Examples > Topics > Shaders > Infinite Tiles处理
我将无法有效地提供一个体面的从头到尾的指南,但如果您从头开始,Processing 网站上有一个详尽的 PShader 教程。
您需要的一个非常粗略的要点:
- 着色器是在 GPU 上运行得非常快且并行化的程序,分为两个:顶点着色器(主要处理 3d 几何图形)、片段着色器(主要处理“片段”(即将成为屏幕上的像素))。你会想玩一个片段着色器
- 该语言称为 GLSL,有点不同(类型更少,更严格,语法更简单),但并非完全陌生(类似 C 类型的声明变量、函数、条件、循环等)
- 如果您想在处理中使 GLSL 程序中的变量可访问,请在其前面加上关键字
uniform
- 使用textureWrap(REPEAT)包裹边缘
- 要缩放图像并包装它,您需要缩放纹理采样坐标:
InfiniteTiles 滚动着色器如下所示:
//---------------------------------------------------------
// Display endless moving background using a tile texture.
// Contributed by martiSteiger
//---------------------------------------------------------
uniform float time;
uniform vec2 resolution;
uniform sampler2D tileImage;
#define TILES_COUNT_X 4.0
void main() {
vec2 pos = gl_FragCoord.xy - vec2(4.0 * time);
vec2 p = (resolution - TILES_COUNT_X * pos) / resolution.x;
vec3 col = texture2D (tileImage, p).xyz;
gl_FragColor = vec4 (col, 1.0);
}
您可以稍微简化一下,因为您不需要滚动。此外,您可以简单地相乘,而不是减法和乘法(- TILES_COUNT_X * pos
):
//---------------------------------------------------------
// Display endless moving background using a tile texture.
// Contributed by martiSteiger
//---------------------------------------------------------
uniform float scale;
uniform vec2 resolution;
uniform sampler2D tileImage;
void main() {
vec2 pos = gl_FragCoord.xy * vec2(scale);
vec2 p = (resolution - pos) / resolution.x;
vec3 col = texture2D (tileImage, p).xyz;
gl_FragColor = vec4 (col, 1.0);
}
请注意,我已将time
变量重新用于成为scale
,因此访问此统一变量的处理代码也必须更改:
//-------------------------------------------------------------
// Display endless moving background using a tile texture.
// Contributed by martiSteiger
//-------------------------------------------------------------
PImage tileTexture;
PShader tileShader;
void setup() {
size(640, 480, P2D);
textureWrap(REPEAT);
tileTexture = loadImage("penrose.jpg");
loadTileShader();
}
void loadTileShader() {
tileShader = loadShader("scroller.glsl");
tileShader.set("resolution", float(width), float(height));
tileShader.set("tileImage", tileTexture);
}
void draw() {
tileShader.set("scale", map(mouseX,0,width,-3.0,3.0));
shader(tileShader);
rect(0, 0, width, height);
}
移动鼠标改变比例:
更新您可以在这里使用非常相似的着色器: