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

时间:2015-09-13 06:49:54

标签: opengl texture-mapping

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

在GL 3.3中使用立方体贴图制服,幕后是否有一些额外的数学魔法(抵消失真),而不是创建六个平面并手动将纹理应用于每一面?

实施例
这是一个使用六个单独纹理的天空图。当场景旋转时,您可以在立方角处看到失真 frame 1 frame 2 frame 3

2 个答案:

答案 0 :(得分:0)

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

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

使用六个普通纹理也可以轻松实现天空盒。实际上,在这种情况下,高级寻址模式甚至可能变成缺点。如果您使用不同的天空载体对象(例如我曾经使用过sky tetrahedron),情况会有所不同。如果存在扭曲,那么代码中肯定会出现一些错误。基本原则有效。

答案 1 :(得分:0)

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

立方体贴图仅适用于第一人称视角。重要的是,眼睛/摄像机正好位于立方体的中心,摄像机目标绕着轨道运行。 例如: Eye at center

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

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