片段着色器中的球形映射

问题描述 投票:0回答:1

所以,我正在尝试创建类似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;
}

这是我的着色器,它产生了这种非常奇怪的行为。

为了澄清,我不是在一个实际的球体上渲染它,而是一个简单的四边形,我打算将球形图像投射到其上。我用这种方式工作的原因有很多,而不仅仅是使用实际的倒置球体。

任何人都可以帮我解决为什么我的着色器表现得如此奇怪吗?

rendering shader projection
1个回答
0
投票

好的。我做了一个傻瓜。问题是我的offset值是在相机空间中计算的,但是应用于世界空间。在应用之前,我只需要通过相机的向上和向上矢量来倍增x和y值,这一切都完美无缺。

© www.soinside.com 2019 - 2024. All rights reserved.