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

Opengl es 如何用从纹理裁剪的可重复图像填充多边形?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我知道,通过对给定纹理使用GL_REPEAT并将纹理坐标适当地映射到顶点,可以轻松实现这一点。但是,我想知道是否有可能不针对整个纹理,而只是针对从中裁剪的图像执行相同的操作?在我看来,唯一的方法似乎是以编程方式创建一个单独的纹理以适合图像,然后使用它。。。有更好的解决方案吗?假设您的大源纹理具有尺寸Tx,Ty 假设裁剪区域尺寸为tx,ty,偏移量为ox,oy。(在您的情况下,tx,ty为32x32) 假设目标四边形具有UV空间[0..1,0..1](在您的示例中,四边形的单位大小为1024x60

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

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

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

假设目标四边形具有UV空间[0..1,0..1](在您的示例中,四边形的单位大小为1024x600)

  • 首先,需要在片段着色器中计算实际片段的(u,v)。这些值将以目标四边形的UV空间的形式显示

    (su,sv)=(u,v)

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

    (su,sv)=(u,v)*(1024600)

  • 这将用于从裁剪区域采样,因此首先截断到裁剪区域标注,并将裁剪窗口偏移到源纹理位置

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

  • 将其带回源位置四元体的坐标中进行采样,也在[0..1,0..1]中

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

因此,现在当您编写glsl着色器时,可以使用它在裁剪窗口中为每个片段找到与所需像素匹配的像素。截断操作“%”将使其在片段(u,v)上升到1时一次又一次地重复

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

除非我误解了这个问题,这不只是操纵uv坐标的问题吗?缩放uv范围以匹配裁剪宽度和高度,然后添加裁剪矩形相对于纹理uv原点的正确偏移。在着色器中,您可以根据fragCoord选择/放弃要渲染的像素,如果您希望最终结果包括边框,也可以在那里进行更多的边框匹配。嗯,我想这不起作用。以一个大矩形为例,1024x600px由4个顶点组成。假设我想用一个32x32px的图像填充它。对于从纹理裁剪的图像,目标矩形的4个顶点不足以适当映射纹理坐标以均匀填充整个矩形。在一个完整的纹理的情况下,这是可能的,因为没有额外的偏移。。。至少我是这么想的。好吧,现在我完全理解你的方法了。我还没试过,但看起来很有希望。是否有可能将此方法扩展到任何多边形?不仅仅是一个长方形的四边形?我想出来了!只是紫外线操纵的问题。谢谢!最后,我在片段着色器中使用了这样一行代码(伪代码)来从纹理图集计算适当的UV坐标:UV.xy=(顶点位置xy%图像大小xy+图像大小偏移xy)/tex大小xy;然而,无论我做什么,这都会在瓷砖之间引入空格。我尝试将图像大小扩大1px或缩小到只包含不受混合影响的区域,但问题仍然存在。我猜它和浮点精度有关,所以你认为它可以被修复吗?当使用带有GL_REPEAT的整个纹理填充多边形时,没有这样的问题。如果是浮点精度,最好确保使用的值在[-1000,1000]范围内。在这里,尾数将有足够的位以足够的精度表示大多数自然数,以便将它们四舍五入得到正确的结果。这在加法/减法或进行模运算(%)时尤其如此。至少同样重要的是在texel的中心进行采样的概念,因此如果宽度为1024个像素,则第一个像素应在(0.5,0.5)处采样,而不是在0处采样。