如何从纹理图集去除斑块边界之间的丑陋接缝?

时间:2018-08-23 12:49:20

标签: opengl textures seam

当我尝试使用带有OpenTK的GLSL着色器渲染带纹理的3D模型时,纹理补丁之间的接缝非常难看。有谁知道如何删除它们?

This picture is my rendering result

This picture is the texture atlas

3D模型来自sketchfab.com

1 个答案:

答案 0 :(得分:0)

很难从此屏幕截图中分辨出问题是出在映射问题还是缺少网格划分,所以我将对两者进行回应。

可能性1:映射错误

确保在地图集上关闭了mipmapping。在GL中,这意味着您的缩小过滤器应为线性过滤器或最接近过滤器,但不是 mipmapped变体。

glBindTexture(GL_TEXTURE_2D, texAtlas);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);

该地图集非常紧密地包装在一起,标准的Mip生成将在补丁边界上模糊化,从而导致接缝。

可能性2:缺少网格​​分割

也可能是模型(作为不正确的方式)作为一个连续的网格被加载,而纹理图集清楚地表明应将网格分解为许多部分。

丑陋的接缝是由于OpenGL在要使网格不连续的边界上插补纹理坐标(UV)而产生的。纹理图集中的每个小“块”都应对应于网格上的一个不同补丁,并且与该补丁边缘对应的顶点不得与其他顶点共享,因为纹理坐标是不连续的。

某些网格格式(例如常见的.obj)可以以怪异的方式指定顶点,必须谨慎处理这些顶点才能在OpenGL中正常工作。例如,一个顶点可以与两个不同的纹理坐标关联。为了正确地渲染模型,我们必须复制这样一个顶点,为每组纹理坐标创建一个唯一的顶点。查看文档以了解用于加载模型的任何API,并查看其是否提及顶点重复,纹理坐标等。