如何摆脱纹理包缝?

SIM*_*MON 1 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  };
Run Code Online (Sandbox Code Playgroud)

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
Run Code Online (Sandbox Code Playgroud)

我可以在这里做什么来消除非常明显的接缝?

小智 5

您遇到的问题正是通过这种技术解决的,该技术实现起来非常简单:

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 的三角形连接点会一直向后插值穿过圆柱体,而不是向前插值穿过接缝。

  • 在“切割”(纹理接缝)上复制顶点将适用于静态几何体,其中纹理坐标作为属性发送(但是,即使如此,缺点也很多:引入复制,并且接缝破坏几何体:几何体的两侧)纹理切割将在拓扑上断开)。在这种情况下,纹理坐标是按程序生成的,因此这甚至不是一个选项。