在Cg着色器中纹理球体

时间:2012-06-08 16:03:25

标签: geometry mapping textures cg

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

由于反三角函数的结果是角度,它们[-Pi, Pi] u[0, Pi] v(尽管你不能搜索几小时)至少从学校获得的三角学基础知识)。所以你只需要适当地缩放它们。 u /= 2*Piv /= Pi应该这样做,假设你有GL_REPEAT(或等效的D3D)作为纹理坐标包装模式(你的描述听起来像)。