【问题标题】:OpenGL why is the cube map warping while looking around?OpenGL为什么在环顾四周时立方体贴图会翘曲?
【发布时间】:2015-09-16 06:01:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: opengl texture-mapping


    【解决方案1】:

    当然,立方体贴图只能以 90° 视角创建(至少在相机位于立方体中心的情况下)。否则,您将无法获得立方体。如果你减少 fov,你会在边缘得到空白。如果增加它,您将获得重叠区域。您也可以从非 90° fovs 创建一个长方体,但这不值得。

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

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

    【讨论】:

      【解决方案2】:

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

      立方体贴图仅适用于第一人称视角。重要的是眼睛/相机正好位于立方体的中心,并且相机目标围绕它运行。 例如:

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

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

      【讨论】:

      • 嗯,部分正确。这里的关键是立方体面在概念上应该位于无限距离。然后,相机的移动无关紧要。不过,有了可编程流水线,事情就变得容易多了。现在需要做的就是画一个全屏四边形,并使用从相机位置到每个片段的方向向量作为立方体贴图tex坐标,这恰好具有对立方体贴图进行采样的效果,就好像它在无穷远处一样,如here所述。
      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多