所以,我正在尝试创建类似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;
}
这是我的着色器,它产生了这种非常奇怪的行为。
为了澄清,我不是在一个实际的球体上渲染它,而是一个简单的四边形,我打算将球形图像投射到其上。我用这种方式工作的原因有很多,而不仅仅是使用实际的倒置球体。
任何人都可以帮我解决为什么我的着色器表现得如此奇怪吗?
好的。我做了一个傻瓜。问题是我的offset
值是在相机空间中计算的,但是应用于世界空间。在应用之前,我只需要通过相机的向上和向上矢量来倍增x和y值,这一切都完美无缺。