看看下面的图片 - 你会看到背景中的云层有一个非常烦人的缝隙:
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);
我能在这里做些什么来摆脱非常明显的缝隙?
答案 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)
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以获得最佳效果)。