首页 > 解决方案 > how to remove those ugly seams between patch boundaries from the texture atlas?

问题描述

When I try to render a textured 3D model with a GLSL shader with OpenTK, I get very ugly seams between texture patches. Does anyone know how to remove them?

This picture is my rendering result

This picture is the texture atlas

the 3D model comes from the sketchfab.com,

标签: opengltexturesseam

解决方案


从这个屏幕截图中很难判断问题是 mipmapping 还是缺少网格分割,所以我会同时回复。

可能性一:Mipmapping

确保在地图集上关闭 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,并查看它是否提到顶点重复、纹理坐标等。


推荐阅读