【发布时间】:2021-09-16 13:57:24
【问题描述】:
我正在尝试使用简单的片段着色器将 360° 纹理实现到 OpenGL 3D 项目中,在其中我从相机的位置向每个像素的方向发送一个单位向量,并通过使用一些三角函数我得到像素的纹理坐标。起初,一切正常,但在一个方向(负 x)有一些像素颜色错误(它们具有纹理底部的颜色,它们通常不应该具有)。在尝试调试时,我发现:
有了这段代码,像素问题就出现了:
vec2 textureCoords = vec2(
((unitV.x < 0.0 ? 0.0 : 0.5) + (atan(unitV.z / unitV.x) / TOWPI)),
(0.5 - (asin(unitV.y) / PI))
out_Color = texture(skyTexture, textureCoords);
但是使用这段代码它工作得很好:
if(unitV.x < 0.0)
out_Color = texture(skyTexture, vec2(0.0 + (atan(unitV.z / unitV.x) / TOWPI), (0.5 - (asin(unitV.y) / PI))));
else
out_Color = texture(skyTexture, vec2(0.5 + (atan(unitV.z / unitV.x) / TOWPI), (0.5 - (asin(unitV.y) / PI))));
(vec3 unitV; 是像素从相机位置的归一化方向向量,它是针对每个像素作为局部变量从制服中计算出来的。)
如果我没有忽略一些非常基本的东西,这两个版本应该是完全一样的,但是结果是不同的......
注意:我的主要问题不是像素有时是错误的,而只是这两个,在我看来,确切的代码位会始终导致不同的结果。
【问题讨论】:
-
什么是
unitV?制服?属性?它有哪个范围?我问是因为第二个版本要求unitV.x是动态统一的。
标签: opengl glsl conditional-operator