2015-09-04 83 views
2

我知道这可以通过对给定的纹理使用GL_REPEAT并将纹理坐标适当地映射到顶点上来轻松实现。我想知道如果可以做同样的不是为了整个纹理,而是从它裁剪出来的图像?唯一的办法似乎是以编程方式创建一个单独的纹理来适应图像,然后使用它...有没有更好的解决方案?如何使用从纹理裁剪的可重复图像填充多边形?

+0

除非我误解了这个问题,这不就是操纵uv坐标的问题吗?缩放uv范围以匹配裁剪的宽度和高度,然后添加裁剪矩形相对于纹理的uv原点的正确偏移量。在着色器中,您可以根据fragCoord选择/放弃要渲​​染的像素,并且如果希望最终结果包含边框,也可以在那里进行更多边框匹配。 – StarShine

+0

嗯我猜这是行不通的。以一个大矩形为例,包含4个顶点的1024x600像素。假设我想用图像32x32px填充它。如果从纹理中裁剪出这样的图像,则目标矩形的4个顶点不足以正确映射纹理坐标以均匀地填充整个矩形。如果纹理完整,可以考虑没有额外的偏移量......这就是我至少想到的。 – Savail

回答

3

比方说,你大源纹理的尺寸为TX,泰

比方说,你复种面积尺寸为TX,TY与偏移牛,OY。 (在你的情况下,TX,TY是32×32)

假设目标四有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)

  • 把它放回用于采样源位置坐标的四,同样在[0..1,0..1]

    (SU,SV)=(((U,V)* (1024,600))%(32,32)+(OX,OY))/(TX,泰)

所以,现在当你写,你可以用它来发现在一个像素着色器GLSL裁剪后的窗口与您想要的窗口匹配,用于每个片段。截断操作'%'将使片段(u,v)对于每个片段上升到1,并且一次又一次地重复。

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

好吧现在我完全理解你的方法。我还没有尝试过,但看起来很有希望。是否有可能为任何多边形扩展这种方法?不只是一个矩形四边形? – Savail

+0

我想通了!只是一个uv操纵的问题。非常感谢! – Savail

+0

我最终在片段着色器中使用了这样一行代码(伪代码),从我的纹理图集uv中计算出合适的UV坐标。xy =(vertex_position.xy%image_size.xy + image_offset.xy)/ tex_size.xy;然而,不管我做什么,这都会在瓦片之间引入空间。我尝试将图像大小扩大1 px或缩小图像以仅采用不受混合影响的区域,但问题仍然存在。我想它与浮点精度有关,所以你认为它可以以某种方式修复?在GL_REPEAT中使用整个纹理填充多边形时,不存在这样的问题 – Savail