1

所以我需要从 Cg 中的像素/片段着色器中将纹理映射到球体。

我在每次传递中作为“输入”的是笛卡尔坐标 x、y、z,用于球体上我希望对纹理进行采样的点。然后我将这些坐标转换为球坐标,并分别使用角度 Phi 和 Theta 作为 U 和 V 坐标,如下所示:

u = atan2(y, z)
v = acos(x/sqrt(x*x + y*y + z*z))

我知道这个简单的映射会在球体的两极产生接缝,但目前,我的问题是纹理在球体上重复了几次。我想要和需要的是整个纹理恰好围绕球体缠绕一次。

我已经摆弄了着色器并搜索了几个小时,但我找不到解决方案。我想我需要在某处应用某种缩放,但在哪里?或者,也许我完全走错了路,我对 Cg 和着色器编程很陌生……感谢您的帮助!

4

1 回答 1

0

由于反三角函数的结果是角度,因此它们将在[-Pi, Pi]foru[0, Pi]for 中出现v(尽管您至少可以通过从学校获得的三角学基本知识搜索数小时)。所以你只需要适当地缩放它们。u /= 2*Pi并且v /= Pi应该这样做,假设您具有GL_REPEAT(或等效的 D3D)作为纹理坐标包装模式(您的描述听起来像)。

于 2012-06-08T19:39:08.680 回答