OpenGL: 使用球坐标映射纹理到球体上

4

我有一张地球的纹理图,想要将其映射到一个球体上。 由于球体是单位球,模型本身没有纹理坐标,我能想到的最简单的方法就是为每个顶点计算球面坐标,并将其用作纹理坐标。

textureCoordinatesVarying = vec2(atan(modelPositionVarying.y, modelPositionVarying.x)/(2*M_PI)+.5, acos(modelPositionVarying.z/sqrt(length(modelPositionVarying.xyz)))/M_PI);

在片元着色器中进行此操作时,由于我从(插值的)顶点位置计算纹理坐标,因此这很好运行。
但是当我在顶点着色器中执行此操作时,如果模型本身具有纹理坐标,则会得到如下图所示的结果。顶点显示为点,小于0.5的纹理坐标(u)为红色,而所有其他坐标为蓝色。
所以看起来相邻的红/蓝顶点的纹理坐标(u)的值接近1.0和0.0。然后变量平滑地插值,因此产生介于0.0和1.0之间的值。当然,这是错误的,因为该值应为1.0或0.0,而不是介于两者之间。
是否有一种方法可以使用球面坐标作为纹理坐标而不会出现上述效果?(如果可能,而不更改模型)
1个回答

4
这是一个常见的问题。在两个纹理坐标拓扑之间的接缝处,您希望纹理坐标无缝地从 1.0 跳转到 0.0,因此需要正确处理网格。为此,必须沿着接缝线复制每个顶点。其中一个顶点将具有 0.0 纹理坐标,并将连接到从右侧来的顶点(在您的示例中)。另一个顶点将具有 1.0 纹理坐标,并将连接到从左侧来的顶点(在您的示例中)。
这是网格问题,最好在网格本身中解决。同一位置需要两个不同的纹理坐标,因此必须复制该位置。
或者,您可以让片段着色器从插值的顶点法线生成纹理坐标。当然,这样做更加计算密集,因为它需要将方向转换为一对角度(然后转换为 [0,1] 纹理坐标范围)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接