从以下位置开始阅读本教程:
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;
}
要对看起来像这样的图像进行采样:
我的问题是,这和魔术“invAtan”常数从何而来?
最佳答案
您发布的图像是equirectangular projection旁边拍摄的360度照片中的Colosseum in Rome, Italy。invAtan
常数是2PI
和PI
的reciprocal(or multiplicative inverse):0.1591
= 1/6.28319
(=> 2PI
)= 360度(弧度)0.3183
= 1/3.14159
(=> PI
)= 180度(弧度)
因此,您从cartesian coordinates到polar angles到uvs,请参阅this great resource(headline: Direct Polar)。用更实际的术语来说,假设给定的direction
被规范化(因此映射到unit-sphere),再乘以invAtan
会将值转换为[-.5,.5]
范围,然后在.5
范围内的uv查找坐标中添加[0,1]
结果。