从以下位置浏览本教程: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”常数从何而来?
您发布的图像是在意大利罗马竞技场附近拍摄的360度照片的等角投影。
该invAtan常数是倒数(或乘法逆)的2PI和PI:
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]。