片段着色器中的球面映射
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 值乘以相机的右和上向量,这一切都很完美。
【讨论】:
以上是关于片段着色器中的球面映射的主要内容,如果未能解决你的问题,请参考以下文章