如何使用从纹理裁剪的可重复图像填充多边形?

时间:2015-09-04 14:11:08

标签: opengl-es opengl-es-2.0

我知道通过将GL_REPEAT用于给定纹理并将纹理坐标适当地映射到顶点上,可以轻松实现这一点。我想知道是否有可能做同样的不是整个纹理,但只是从它裁剪的图像?在我看来,唯一的方法是以编程方式创建一个单独的纹理以适合图像,然后使用它......有没有更好的解决方案?

1 个答案:

答案 0 :(得分:3)

假设您的大型源纹理具有尺寸Tx,Ty

假设您的裁剪区域尺寸为tx,ty为偏移牛,oy。 (在你的情况下,tx,ty将是32x32)

假设目标四边形具有UV空间[0..1,0..1](在您的情况下,四边形的单位尺寸为1024x600)

  • 首先,您需要在片段着色器中计算实际片段的(u,v)。值将位于目标四元组的UV空间中。

    (su,sv)=(u,v)

  • 乘以四边形的尺寸(将其转换为像素单位)

    (su,sv)=(u,v)*(1024,600)

  • 这将用于从裁剪区域进行采样,因此首先截断到裁剪区域尺寸,然后将裁剪窗口偏移到源纹理位置

    (su,sv)=((u,v)*(1024,600))%(32,32)+(ox,oy)

  • 将其带回到源位置quad的坐标中进行采样,同样在[0..1,0..1]

    (su,sv)=(((u,v)*(1024,600))%(32,32)+(ox,oy))/(Tx,Ty)

所以现在当您编写glsl着色器时,您可以使用它来查找裁剪窗口中与每个片段匹配的像素。截断操作'%'将使其一遍又一遍地重复,因为片段(u,v)对于每个片段都会升至1。

color = texture(sampler, (su,sv))