在实现着色器立方体贴图之前,我尝试使用六个纹理手动制作天空盒,但旋转时出现扭曲。OpenGL为什么立方体贴图会在环视时扭曲?
在GL 3.3使用立方体贴图制服,是在那里的场景(抵消失真)背后的一些数学加入魔法,对创建6个平坦面,并手动施加纹理每一侧?
例
下面是使用六个独立的纹理一个星空图。您可以在立体角看到失真的场景旋转
在实现着色器立方体贴图之前,我尝试使用六个纹理手动制作天空盒,但旋转时出现扭曲。OpenGL为什么立方体贴图会在环视时扭曲?
在GL 3.3使用立方体贴图制服,是在那里的场景(抵消失真)背后的一些数学加入魔法,对创建6个平坦面,并手动施加纹理每一侧?
例
下面是使用六个独立的纹理一个星空图。您可以在立体角看到失真的场景旋转
当然,立方体贴图只能用一个90°视场创建(至少如果相机定位于立方体的中心) 。否则,你不会得到一个立方体。如果你减小fov,你会得到边缘周围的空白空间。如果你增加它,你会得到重叠的区域。您也可以创建一个非90°fov的长方体,但这不值得付出努力。
OpenGL中立方体贴图的寻址模式与用于普通2D贴图的模式不同。您可以使用2D纹理坐标访问2D纹理。立方体地图通过3D方向矢量访问。 OpenGL然后使用这个方向矢量来计算要使用的子纹理以及该子纹理的纹理坐标。
天空盒也可以用六种简单的纹理轻松实现。事实上,高级寻址模式甚至可能在这种情况下成为缺点。如果您使用了不同的天空载体对象(例如,我曾经使用过一个sky tetrahedron),则会有所不同。如果发生扭曲,您的代码中肯定会出现一些错误。基本原理起作用。
好吧,这是部分正确的。这里关键的一点是,立方体面应该在概念上位于_infinite_距离。然后,相机的移动并不重要。通过可编程管线,事情变得更加容易。现在人们需要做的就是绘制一个全屏四边形,并使用从摄影机位置到每个片段的方向矢量作为立方体贴图tex coords,这正好具有对立方体贴图进行采样的效果,就好像它在无穷远处一样,如[概述] [这里](http://stackoverflow.com/questions/30015940/why-dont-people-use-tetrahedrons-for-skyboxes/30038392#30038392)。 – derhass