为什么立体3D渲染需要专门为它编写的软件?

时间:2012-10-02 18:31:41

标签: opengl stereo-3d

鉴于对3D图形渲染的天真看法,立体3D渲染似乎对开发人员来说基本上是透明的,并且完全是图形硬件和驱动程序的一个特征。无论OpenGL窗口在何处显示场景,它都会使用几何体,光照,相机和纹理等信息来渲染场景的2D图像。

将立体3D添加到场景似乎基本上意味着使用两个横向偏移的相机,其中最初有一个,并且所有其他场景变量保持不变。然后唯一的附加信息是制作相机的距离以及使它们的中心光线会聚多远。鉴于此,采用GL命令序列并在驱动程序级交错适当的命令以驱动3D渲染似乎是微不足道的。

虽然应用程序需要专门编写才能使用特殊的3D硬件架构,这使得它很麻烦且难以实现。我们是否希望这是立体3D实现的未来,还是我对太多重要细节进行了掩饰?

在我的具体情况下,我们使用的是.net OpenGL视口控件。我原本希望只需启用立体声硬件和驱动程序即可启用立体3D。

2 个答案:

答案 0 :(得分:6)

你的假设是错误的。 OpenGL不“采用几何体,照明相机和纹理信息来渲染2D图像”。 OpenGL接受命令来操纵其状态机和命令来执行绘制调用。

正如没有人在评论中提到的那样,核心概况甚至根本不关心转型。它现在唯一真正提供的是向顶点着色器提供任意数据的方法,以及用于渲染的任意3D立方体。对于与实际观点相对应或不对应的,GL不关心,也不应该。

请注意,有些人已经注意到驱动程序可以尝试猜测视图是什么,什么不是,这就是nvidia驱动程序在进行自动立体渲染时尝试做的事情。这需要一些特定的猜测工作,这相当于对游戏渲染的实际分析,以调整算法,以便驾驶员猜对了。所以它通常是每个标题,在驱动程序内的变化。一些开发人员已经注意到驱动程序可能猜错了,当发生这种情况时,它开始变得混乱。查看一些first-hand account of those questions

我真的建议你阅读那个演示文稿,因为它会进一步指出相机应指向哪里(如果2个视图方向是平行的等等)。

此外,事实证明,对于视图相关的所有内容,渲染的成本基本上是其两倍。一些开发人员(包括,例如,Crytek guys, see Part 2)发现,在很大程度上,你可以做一个渲染,并用附加数据捏造图片以生成左边和右眼图片。 这里保存的工作量本身就很有价值,开发人员自己也可以这样做。

答案 1 :(得分:2)

不幸的是,立体3D渲染比仅添加横向相机偏移更复杂。

您可以从原始的“mono”渲染帧和深度缓冲区创建立体3D。给定场景中(真实世界)深度的范围,每个值的深度缓冲区将告诉您相应像素的距离。给定所需的眼睛分离值,您可以根据距离向左或向右滑动每个像素。但...

您想要两个相机最终会聚的平行轴立体声(偏移不对称截头锥体)或'前束'立体声吗?如果是后者,您将需要逐个场景调整摄像机角度,以避免在收敛点之外“反转”几何体。

对于非常接近观察者的物体,左眼和右眼看到相同物体的完全不同的图像,甚至向左看到物体的一侧而右眼看到另一侧 - 但是单声道视图将是将这些平均排在前面。如果你想要一个精确的立体3D图像,它确实必须从不同的眼睛视点渲染。这有关系吗? FPS射击游戏,可能不是。人体外科训练模拟器,你打赌它。

如果观察者将头部向一侧倾斜,则类似的问题,因此一只眼睛高于另一只眼睛。同样,对于一个游戏来说可能并不重要,对外科医生来说非常重要。

哦,你在场景中有抗锯齿或透明度吗?现在你有一个像素,它真正代表不同深度的两个像素值。向侧面移动抗锯齿像素,它可能看起来更糟,因为“底层”颜色已经改变。将一个大部分透明的像素侧向移动,后部像素将移动太远。

你用瞄准器十字架和类似的HUD元素做什么?如果在禁用深度缓冲区的情况下绘制它们,深度缓冲区值可能会使它们在几百米之外。

鉴于所有这些潜在的问题,OpenGL明智地没有试图说明应该如何进行立体3D渲染。根据我的经验,修改OpenGL程序以立体声渲染比首先编写它要少得多。

无耻的自我推销:这可能会有所帮助 http://cs.anu.edu.au/~Hugh.Fisher/3dteach/stereo3d-devel/index.html