如何摆脱纹理包缝?

时间:2011-01-26 00:51:03

标签: opengl textures

看看下面的图片 - 你会看到背景中的云层有一个非常烦人的缝隙:

http://simoneschbach.com/seam.png

当发生环绕时发生这种接缝,因为我使用以下代码以编程方式提供纹理坐标:

gBackgroundPos += 0.0003f;  // gBackgroundPos climbs indefinitely...
GLfloat bgCoords[] = {  gBackgroundPos, 1.0, 
            gBackgroundPos + 0.5f,  1.0, 
            gBackgroundPos, 0.0, 
            gBackgroundPos + 0.5f,  0.0  };

我在纹理初始化期间启用了纹理包装,如下所示:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

我能在这里做些什么来摆脱非常明显的缝隙?

5 个答案:

答案 0 :(得分:4)

这个技术完全解决了你所遇到的问题,这个技术非常简单:

http://vcg.isti.cnr.it/~tarini/no-seams/

该链接有一个开源演示,它公开了使用过的片段着色器。

即使没有完全理解它的工作原理,这个技巧很容易被采用,但它在图形工具期刊中的文章中得到了充分的解释: "没有顶点接缝的圆柱和环形参数化" 例如,可以在...找到 http://vcg.isti.cnr.it/Publications/2012/Tar12/

不幸的是,此处列出的其他解决方案不起作用:

  • GL_REPEAT(作为GL_TEXTURE_WRAP),单独做做你需要的。如上所述,问题在于连接点S = 0.9和S = 0.1的三角形在整个圆柱体上一直向内插入,而不是向前穿过接缝。

  • 在" cut"上复制顶点(纹理接缝)可用于静态几何,其中纹理坐标作为属性发送(但即便如此,缺点很多:引入复制,接缝打破几何:纹理切割的两边将在拓扑上断开连接) 。在这种情况下,特定情况下,纹理坐标是程序生成的,因此它甚至不是一个选项。

答案 1 :(得分:3)

这是一个老问题,但我最近不得不处理同样的问题。

当纹理环绕一个圆柱体时,会在地图边缘相遇的地方出现自然缝。

穿过该边界的三角形条带最终具有纹理坐标,该纹理坐标使渲染器将整个纹理向后挤压到这些三角形中。

只看U坐标:没有穿过纹理边缘的三角形将具有逆时针顺序的纹理坐标。但是,当三角形穿过边框时(例如),您会以相反的绕线顺序卷起,因为穿过边框的点会被映射回纹理的另一侧。您通常会看到一个三角形在0.9-0.9999 U范围内有一个或两个纹理坐标,其余坐标在0-0.1范围内。

当渲染器看到它时,它完全符合它的预期:它将面部的纹理坐标从0.9向下插入到0.1,其中包括大部分纹理。你的接缝就是当它被向后挤压到一个小空间时纹理的样子。

解决方案是分割越过边框的顶点,以便每个受影响的顶点在列表中出现两次。第一个将在地图的左端具有纹理坐标,而另一个将在另一端具有其所有纹理坐标,因此没有单个边缘跨越纹理。

请注意,您没有更改顶点的XYZ值:只是UV。

另请注意,对于不在不同边缘之间共享顶点的曲面,不会发生这种情况。飞机免疫。您的示例图像不再在线,因此我无法验证这是发生在您身上的情况,但似乎可能基于您的粗略描述。

答案 2 :(得分:2)

如果那个评论是一个答案,我会投票支持Shezan Baig。

GL_REPEAT旨在完全按照您的意愿行事。如果没有,很可能是因为你的纹理本身有接缝,或者加载纹理的工具链会引入接缝(例如因为源纹理不是两种尺寸的力量,例如)。 p>

答案 3 :(得分:1)

这只是猜测,它可能无效。您是否尝试在GL_LINEAR和GL_NEAREST之间更改GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?另外,您是否启用了mipmap(例如使用gluBuild2DMipmaps)?如果有,请尝试禁用它们。

答案 4 :(得分:0)

您可以利用纹理边框(2 ^ m + 1 x 2 ^ n + 1个纹理,而不是2 ^ mx 2 ^ n)并将数据从对面复制到边框像素中纹理循环。

您还需要更改GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER以使用线性插值或更好(可能是GL_LINEAR_MIPMAP_LINEAR以获得最佳效果)。