片段着色器中的球形映射

时间:2019-04-04 01:59:04

标签: rendering shader projection

因此,我正在尝试创建一个像SkySphere这样的东西-一个倒置的球体,位于无限远处,其纹理平滑地映射到其上。

但是,我在调低球面坐标映射时遇到了一些麻烦。我尝试了各种映射,包括纬度/经度映射,但是当我围绕场景旋转时(它们围绕图像旋转而不是正确映射到球体),它们似乎总是会产生这种渐近行为。我不确定自己在做什么错。

#version 120
uniform sampler2D iChannel0;

uniform vec3 direction;

#define PI 3.141592653
#define TWOPI (2*PI)

void main()
{

    vec3 offset = vec3(gl_TexCoord[0].xy-0.5,0)*2;
    vec3 d = normalize(direction + offset);
    vec2 tx = vec2(0.5 + atan(d.z, sqrt(d.x*d.x + d.y*d.y))/TWOPI, 0.5 + atan(d.y, d.x)/TWOPI);

    vec4 c = texture2D( iChannel0, tx);

    gl_FragColor = c*gl_Color;
}

这是我目前的着色器,并且正在产生这种极其奇怪的行为。

为澄清起见,我不是在实际的球体上渲染它,而是在一个简单的四边形上进行渲染,我打算将其投影到一个类似球形的图像上。我采用这种方法的原因有很多,而不仅仅是使用实际的倒置球体。

有人可以帮助我弄清楚为什么我的着色器表现得如此奇怪吗?

1 个答案:

答案 0 :(得分:0)

好的。我做的很蠢。问题是我的offset值是在摄影机空间中计算的,但在世界空间中应用了。在应用之前,我只需要将x和y值乘以相机的左右向量,就可以完美工作。