片段着色器中的球面映射

Posted

技术标签:

【中文标题】片段着色器中的球面映射【英文标题】:Spherical Mapping in Fragment Shader 【发布时间】:2019-04-04 01:59:04 【问题描述】:

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

好的。我做了一个傻事。问题是我的offset 值是在相机空间中计算的,但被应用于世界空间。在应用之前,我只需将 x 和 y 值乘以相机的右和上向量,这一切都很完美。

【讨论】:

以上是关于片段着色器中的球面映射的主要内容,如果未能解决你的问题,请参考以下文章

顶点着色器 glsl qt 中的纹理映射

从片段着色器中的地形高程数据计算法线

如何在片段着色器中找到 4 个顶点之间的插值位置?

在顶点和片段着色器中访问同名统一失败

在片段着色器中使用 textureCube 访问环境贴图失败

在片段着色器中绘制别名像素完美线?