我有一张地球的纹理图,想要将其映射到一个球体上。 由于球体是单位球,模型本身没有纹理坐标,我能想到的最简单的方法就是为每个顶点计算球面坐标,并将其用作纹理坐标。
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,而不是介于两者之间。
是否有一种方法可以使用球面坐标作为纹理坐标而不会出现上述效果?(如果可能,而不更改模型)