我有一台3D电视,如果我至少没有尝试让它显示我自己创作的漂亮3D图像,我觉得我会推卸我的责任(作为一个极客)!
之前我已经完成了非常基本的OpenGL编程,因此我理解了所涉及的概念 - 假设我可以将自己渲染成一个简单的四面体或立方体并让它旋转一下;如何让3D电视以3D形式显示此图像?
请注意,我了解3D工作原理的基础知识(从两个不同的角度渲染相同的图像两次,每只眼睛一次),我的问题是关于实际执行此操作的后勤工作(我需要SDK吗?等等。 。)
答案 0 :(得分:7)
主要问题是,让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 devision上发送了一些情况,你需要对立体视觉过程进行精确控制,我希望他们能看到光线并在消费级硬件上同时访问四缓冲立体声。
请注意,我了解3D工作原理的基础知识(从2个不同的角度渲染相同的图像两次,每只眼睛一次)
实际上,您不是从两个不同的角度渲染,而是使用移位的视差和镜头移位。否则你会在水平方向上得到一些梯形/梯形失真,这是非常非常令人不愉快的(实际上我现在认为在立体渲染过程中,应该稍微偏离光轴 - 即完全违背天真的方式做 - 而且“过度”补偿镜头移位,我正在准备一个关于此的小型研究,但仍需要收集我的测试和控制组。)
1:哎呀,我是single-handedly stereographed大象梦想的人,rendered it并且得到了award at a 3D movie festival。
答案 1 :(得分:0)
由于您拥有被动3D电视,因此左眼和右眼视图可能会在备用扫描线上呈现。 (或者可能是棋盘图案中的替代像素)
因此,您的任务是将左眼视图渲染到偶数扫描线,将右眼视图渲染到奇数编号扫描线(反之亦然)。这可以通过OpenGL模板操作完成,或者更现代地使用自定义片段着色器完成。
这样,您可以避免datenwolf描述的整个四缓冲视频卡/ GL_BACK_LEFT / GL_BACK_RIGHT方法。你想避免这种方法,因为我从未遇到过将四缓冲立体3D引导到实际3D电视的视频驱动程序。
我同意datenwolf的建议,即你应该使用非对称视锥体移位而不是场景旋转来产生右眼和左眼视点。