【发布时间】:2019-01-29 20:36:57
【问题描述】:
当我尝试使用带有 OpenTK 的 GLSL 着色器渲染带纹理的 3D 模型时,纹理块之间的接缝非常难看。有谁知道如何删除它们?
3D模型来自sketchfab.com,
【问题讨论】:
-
欢迎来到 SO!您应该阅读tour,尤其是Minimal, Complete, and Verifiable example。如果没有看到你的代码,没有人能帮上大忙,但只是做一些猜测。
当我尝试使用带有 OpenTK 的 GLSL 着色器渲染带纹理的 3D 模型时,纹理块之间的接缝非常难看。有谁知道如何删除它们?
3D模型来自sketchfab.com,
【问题讨论】:
从这个屏幕截图中很难判断问题是 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,并查看它是否提到顶点重复、纹理坐标等。
【讨论】: