这个代码如何从球形图中采样?

时间:2018-01-29 04:26:48

标签: glsl trigonometry

通过以下教程完成本教程: 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;
}

要对如下图像进行采样: Image

我的问题是它来自何处以及魔法" invAtan"常数β

1 个答案:

答案 0 :(得分:4)

您发布的图片是equirectangular projection旁边拍摄的360度照片的Colosseum in Rome, Italy

invAtan常量是2PIPI的{​​{3}}:

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

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

所以你从reciprocal(or multiplicative inverse)cartesian coordinates转到uvs,请参阅polar angles。在更实际的术语中,假设给定direction被归一化(因此映射到this great resource(headline: Direct Polar))乘以invAtan将值转换为[-.5,.5]范围,添加.5 }导致uv查找坐标的范围为[0,1]