从以下位置开始阅读本教程:
https://learnopengl.com/PBR/IBL/Diffuse-irradiance

我遇到了这段代码:

const vec2 invAtan = vec2(0.1591, 0.3183);
vec2 SampleSphericalMap(vec3 direction)
{
    vec2 uv = vec2(atan(direction.z, direction.x), asin(direction.y));
    uv *= invAtan;
    uv += 0.5;
    return uv;
}

要对看起来像这样的图像进行采样:
glsl - 此代码如何从球面图中采样?-LMLPHP

我的问题是,这和魔术“invAtan”常数从何而来?

最佳答案

您发布的图像是equirectangular projection旁边拍摄的360度照片中的Colosseum in Rome, Italy
invAtan常数是2PIPIreciprocal(or multiplicative inverse):
0.1591 = 1/6.28319(=> 2PI)= 360度(弧度)
0.3183 = 1/3.14159(=> PI)= 180度(弧度)

因此,您从cartesian coordinatespolar angles到uvs,请参阅this great resource(headline: Direct Polar)。用更实际的术语来说,假设给定的direction被规范化(因此映射到unit-sphere),再乘以invAtan会将值转换为[-.5,.5]范围,然后在.5范围内的uv查找坐标中添加[0,1]结果。

09-08 08:03