OpenGL 为什么立方体贴图在环顾四周时会变形?

OpenGL why is the cube map warping while looking around?

在实现着色器立方体贴图之前,我尝试手动制作一个周围有六个纹理的天空盒,但在旋转时出现变形。

在使用立方体贴图制服的 GL 3.3 中,相对于创建六个平面并手动向每一面应用纹理,幕后是否添加了一些数学魔法(抵消失真)?

例子
这是一张使用六个单独纹理的天空图。当场景旋转时,您可以看到立体角处的变形

当然,立方体贴图只能以 90° fov 创建(至少在相机位于立方体中心时)。否则,您将得不到立方体。如果减小 fov,边缘周围会出现空白区域。如果你增加它,你会得到重叠的区域。您也可以从非 90° fovs 创建一个长方体,但这不值得付出努力。

OpenGL 中立方体贴图的寻址模式与用于普通二维纹理的寻址模式不同。您可以使用 2D 纹理坐标访问 2D 纹理。通过 3D 方向向量访问立方体贴图。 OpenGL然后使用这个方向向量来计算要使用的子纹理和这个子纹理的纹理坐标。

天空盒也可以很容易地用六个普通纹理实现。事实上,在这种情况下,高级寻址模式甚至可能成为劣势。如果您使用不同的天空载体对象(例如,我曾经使用过 sky tetrahedron),情况会有所不同。如果有失真,那么您的代码中一定有一些错误。基本原理有效。

在 3D 建模应用程序上进行设置并进行一些实验后,我觉得我可以回答我自己的问题了。

立方体贴图仅适用于第一人称视角。重要的是 eye/camera 恰好位于立方体的中心并且相机目标围绕其旋转。 例如:

在相反的情况下,目标恰好位于中心并且眼睛围绕它旋转(就像在 3D 建模应用程序中一样),然后立方体贴图因变形而变得无用。 例如:

所以...来回答这个问题。不,GLSL 立方体贴图背后没有什么魔法可以防止失真发生。这完全取决于应用程序如何处理其相机系统。