该代码如何从球面图中采样?

Jam*_*mes 2 trigonometry glsl

从以下位置浏览本教程: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;
}
Run Code Online (Sandbox Code Playgroud)

要对看起来像这样的图像进行采样: 图片

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

LJᛃ*_*LJᛃ 5

您发布的图像是在意大利罗马竞技场附近拍摄的360度照片的等角投影

invAtan常数是倒数(或乘法逆)2PIPI

0.1591= 1/6.28319(=> 2PI)= 360度(弧度)

0.3183= 1/3.14159(=> PI)= 180度(弧度)

因此,您可以从笛卡尔坐标系极角到uvs,请参阅此资源(标题:Direct Polar)。用更实际的术语来说,假设给定direction是归一化的(因此映射到单位球体),invAtan则将乘以将值转换为[-.5,.5]范围,将.5结果添加到范围为的uv查找坐标中[0,1]