当形状的 uv 坐标超出纹理时,改变纹理的行为方式。
为了使 texture() 正常工作,一个形状需要一种将其表面上的点映射到图像中的像素的方法。内置的形状,如 rect() 和 box(),已经根据它们的顶点具有了这些纹理映射。使用 vertex() 创建的自定义形状需要将纹理映射传递为 uv 坐标。
每次调用 vertex() 都必须包括 5 个参数,如 vertex(x, y, z, u, v)
,以将坐标 (x, y, z)
处的顶点映射到图像中坐标 (u, v)
的像素。例如,矩形图像的角落默认映射到矩形的角落:
// 应用图像作为纹理。 texture(img); <p>// 绘制矩形。 rect(0, 0, 30, 50); </p>
如果上面代码片段中的图像尺寸为 300 x 500 像素,则可以通过以下方式获得相同的结果:
// 应用图像作为纹理。 texture(img); <p>// 绘制矩形。 beginShape();</p> <p>// 左上角。 // u: 0, v: 0 vertex(0, 0, 0, 0, 0);</p> <p>// 右上角。 // u: 300, v: 0 vertex(30, 0, 0, 300, 0);</p> <p>// 右下角。 // u: 300, v: 500 vertex(30, 50, 0, 300, 500);</p> <p>// 左下角。 // u: 0, v: 500 vertex(0, 50, 0, 0, 500);</p> <p>endShape(); </p>
textureWrap()
控制纹理在其 uv 坐标超出纹理时的行为。这样做可以产生有趣的视觉效果,如平铺。例如,上面的自定义形状可能具有超出图像宽度的 u 坐标:
// 应用图像作为纹理。 texture(img); <p>// 绘制矩形。 beginShape(); vertex(0, 0, 0, 0, 0);</p> <p>// 右上角。 // u: 600 vertex(30, 0, 0, 600, 0);</p> <p>// 右下角。 // u: 600 vertex(30, 50, 0, 600, 500);</p> <p>vertex(0, 50, 0, 0, 500); endShape(); </p>
600 的 u 坐标大于 300 的纹理图像宽度,这就带来了一些有趣的可能性。
第一个参数 wrapX
接受三种可能的常量。如果传递 CLAMP
,如 textureWrap(CLAMP)
中所示,则纹理边缘的像素将延伸到形状的边缘。如果传递 REPEAT
,如 textureWrap(REPEAT)
中所示,则纹理将重复平铺直到达到形状的边缘。如果传递 MIRROR
,如 textureWrap(MIRROR)
中所示,则纹理将重复平铺直到达到形状的边缘,同时在平铺之间翻转其方向。默认情况下,纹理使用 CLAMP
模式。
第二个参数 wrapY
是可选的。它接受相同的三个常量:CLAMP
、REPEAT
和 MIRROR
。如果传递了其中一个常量,如 textureWRAP(MIRROR, REPEAT)
,那么纹理将在水平方向上 MIRROR
,在垂直方向上 REPEAT
。默认情况下,wrapY
将被设置为与 wrapX
相同的值。
注意:textureWrap()
只能在 WebGL 模式下使用。
示例
语法
textureWrap(wrapX, [wrapY])
参数
可以是 CLAMP、REPEAT 或 MIRROR
可以是 CLAMP、REPEAT 或 MIRROR