11

我有一台 3D 电视,如果我不至少尝试让它显示我自己创作的漂亮 3D 图像,我会推卸我的责任(作为一个极客)!

我之前已经完成了非常基础的 OpenGL 编程,所以我理解了其中的概念——假设我可以将自己渲染成一个简单的四面体或立方体并让它旋转一下;如何让我的 3D 电视以 3D 形式显示此图像?

请注意,我了解 3D 工作原理的基础知识(从 2 个不同角度渲染同一图像两次,每只眼睛一个),我的问题是关于实际执行此操作的后勤工作(我需要 SDK 吗?等等...)

  • 我的电视使用偏振 3D,尽管我的意图是这个问题也与其他 3D 技术相关(如果可能的话)
  • 我的笔记本电脑有一个 HDMI 输出,我打算用它来连接我的电视(这与使用 VGA/分量视频电缆有什么区别吗?)
  • 过去我曾尝试过 GLUT / OpenGL,但是如果它更容易/只有真正可能使用一些替代技术来做到这一点,那很好
4

2 回答 2

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 部门的人员发送了一些需要精确控制立体检查过程的案例场景,我希望他们能看到曙光,并在消费级硬件上也能访问四缓冲立体。

请注意,我了解 3D 工作原理的基础知识(从 2 个不同角度渲染同一图像两次,每只眼睛一个)

实际上,您不会从两个不同的角度进行渲染,而是使用偏移的视差和镜头偏移。否则,您会在水平方向上出现一些梯形/梯形失真,这非常非常令人不快(事实上,我现在认为在立体渲染过程中,应该稍微偏离光轴——即完全与天真地相反做——并“过度”补偿镜头移位,我目前正在准备一项关于此的小型研究,但仍需要收集我的测试组和对照组)。


1:哎呀,我是单枪匹马立体拍摄大象梦,渲染它在3D电影节上获奖的人

于 2011-07-26T10:23:36.840 回答
0

因为您有一台无源 3D 电视,所以左眼和右眼视图很可能是在交替的扫描线上呈现的。(或者也许在棋盘图案中的交替像素上)

因此,您的任务是将左眼视图渲染到偶数扫描线,将右眼视图渲染到奇数扫描线(反之亦然)。这可以通过 OpenGL 模板操作来完成,或者更现代地,使用自定义片段着色器来完成。

这样,您可以避免使用 datenwolf 描述的整个四缓冲显卡/GL_BACK_LEFT/GL_BACK_RIGHT 方法。而且您想避免这种方法,因为我从未遇到过将四缓冲立体 3D 引导到实际 3D 电视的视频驱动程序。

我同意 datenwolf 的建议,即您应该使用不对称平截头体移位而不是场景旋转来生成左右眼视点。

于 2014-05-30T19:56:47.233 回答