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

How to fill a polygon with a repeatable image cropped from a texture?

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

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

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

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

  • 首先,您需要在片段着色器中计算实际片段的 (u,v)。这些值将位于目标四边形的 UV space 中。

    (su,sv) = (u,v)

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

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

  • 这将用于从裁剪区域采样,所以先截断到裁剪区域尺寸,并将裁剪window偏移到源纹理位置

    (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 着色器时,您可以使用它在裁剪后的 window 中找到与您想要的像素匹配的每个片段的像素。截断操作 '%' 将使其一遍又一遍地重复,因为片段 (u,v) 对于每个片段都上升到 1。

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