为什么球体纹理贴图实际上不能匹配

时间:2013-10-31 09:06:46

标签: directx shader

我的3D项目中有一个球体,我有一个地球纹理,我使用wiki中的算法来计算纹理坐标。 我的效果文件中的代码如下所示:

float pi = 3.14159265359f;
output.uvCoords.x = 0.5 + atan2(input.normal.z, input.normal.x) / (2 * pi);
output.uvCoords.y = 0.5f - asin(input.normal.y) / pi;

结果如下图所示:

  1. 从左边看(有一条线,这是我的问题) enter image description here

  2. 从前面看

  3. enter image description here

    3.从右边看

    enter image description here

2 个答案:

答案 0 :(得分:1)

根本没有假装完整的答案,但有一些想法:

  • 6.28代替6.18,因为3.14 * 2 = 6.28。创建变量或宏而不是普通数字总是一个好主意,以防止将来出现这样的悲伤错误
  • 尝试使用更精确的Pi值(小数点右侧的数字)
  • 尝试在计算前标准化法向量
  • 更好地一次性计算CPU上的texcoords,而不是计算每个着色器调用。您可以将任何资产库用于此目的,或者只需将HLSL快速移动到主代码即可。

    #define PI          3.14159265359f
    #define PImul2      6.28318530718f  // pi*2
    #define PIdiv2      1.57079632679f  // pi/2
    #define PImul3div2  2.09439510239   // 3*pi/2
    #define PIrev       0.31830988618f  // 1/pi
    ...
    

希望它有所帮助。

答案 1 :(得分:1)

最后我自己弄明白了,问题在于,我在计算顶点着色器中的纹理坐标。问题是一个顶点位于纹理的最右侧,而三角形的另外两个顶点位于纹理的最左侧,这导致几乎整个纹理在这样的三角形上可见。所以有一排杂乱的纹理坐标。解决方案是我应该将法线发送到像素着色器并计算像素着色器中的纹理坐标