主要问题是,让您的 GPU 发送立体格式。在 HDMI 连接的情况下,如果没有驱动程序的帮助,这将无法工作。如果您有专业级 GPU(Quadro、FireGL),那么它们可能支持 OpenGL 四缓冲区,即您可以获得左右眼的帧缓冲区,包括前后:
glDrawBuffer(GL_BACK_LEFT);
render_left_eye();
glDrawBuffer(GL_BACK_RIGHT);
render_right_eye();
glDrawBuffer(GL_BACK); // renders to both eyes simultanously
render_screen_level_and_nonstereoscopic();
SwapBuffers();
不幸的是,OpenGL 四缓冲区被认为是专业级的东西。
相反,NVidia(至少)提供了一个惯用的立体库以及一些扩展来控制它。主要理由是,共享片段将只渲染一次,然后在应用适当视差的情况下发送到双眼。然而,根据我在立体镜方面的半专业经验¹,这些半/自动立体镜检查并不能解决问题。立体镜需要严格控制整个“生产”管道,否则你就完蛋了。在 Elephants Dream 中,我修改了渲染器的核心代码。
我向 NVidia 的 3D 部门的人员发送了一些需要精确控制立体检查过程的案例场景,我希望他们能看到曙光,并在消费级硬件上也能访问四缓冲立体。
请注意,我了解 3D 工作原理的基础知识(从 2 个不同角度渲染同一图像两次,每只眼睛一个)
实际上,您不会从两个不同的角度进行渲染,而是使用偏移的视差和镜头偏移。否则,您会在水平方向上出现一些梯形/梯形失真,这非常非常令人不快(事实上,我现在认为在立体渲染过程中,应该稍微偏离光轴——即完全与天真地相反做——并“过度”补偿镜头移位,我目前正在准备一项关于此的小型研究,但仍需要收集我的测试组和对照组)。
1:哎呀,我是单枪匹马立体拍摄大象梦,渲染它并在3D电影节上获奖的人。