0

我的 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. 从左边看(有一条线,这是我的问题) 在此处输入图像描述

  2. 从前面看

在此处输入图像描述

3.从右边看

在此处输入图像描述

4

2 回答 2

1

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

  • 试试6.286.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
    ...
    

希望能帮助到你。

于 2013-10-31T12:07:30.733 回答
1

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

于 2013-10-31T17:33:10.510 回答