如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

Posted

技术标签:

【中文标题】如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?【英文标题】:How to do stereoscopic 3D with OpenGL on GTX 560 and later? 【发布时间】:2012-02-13 16:37:07 【问题描述】:

我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D。我重写了该库以使用 Nvidia nvision 进行立体 3D。我正在使用带有 GLUT 的 OpenGL,并使用 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_STEREO) 来初始化显示模式。它在 Quadro 卡上运行良好,但在 GTX 560m 和 GTX 580 卡上显示不支持像素格式。我知道显示器能够显示 3D,而且我知道显卡能够渲染它。我已经尝试调整屏幕的分辨率以及我能想到的所有其他内容,但似乎没有任何效果。我在不同的地方读到了使用 OpenGL 的立体 3D 只能在全屏模式下工作。所以,我能想到的这个错误的唯一可能原因是我是在窗口模式下开始的。我将如何强制应用程序以启用 3D 的全屏模式启动?谁能提供一个使用 OpenGL 的四缓冲区立体 3D 的代码示例,该示例适用于后来的 GTX 模型卡?

【问题讨论】:

【参考方案1】:

您所体验到的没有技术原因,而只是 NVidia 的产品政策。 Quadbuffer 立体声被认为是一项专业功能,因此 NVidia 仅在他们的 Quadro 卡上提供它,即使 GeForce GPU 也能做到。这不是最近的事态发展。早在 1999 年就已经是这样了。例如,当时我有(仍然有)GeForce2 Ultra。但从技术上讲,这与 Quadro 的芯片完全相同,唯一的区别是向系统报告的 PCI-ID。可以通过修改 PCI-ID(通过修补驱动程序或在显卡 PCB 上焊接一个额外的电阻器)来欺骗驱动程序以为您拥有 Quadro。

当时我的 GeForce2 已经支持 Direct3D hack 的立体 3D 模式。那时,驱动程序复制了渲染命令,但对模型视图应用了平移,对投影矩阵应用了倾斜。这些天来,它实现了一个着色器和多渲染目标技巧。

NVision3D API 确实允许您为特定的眼睛添加 blit 图像(这适用于电影播放器​​和图像查看器)。但它也允许您模拟四缓冲立体声:而不是 GL_BACK_LEFT 和 GL_BACK_RIGHT 缓冲区创建两个帧缓冲区对象,您可以将它们绑定和使用,就好像它们是四缓冲立体声一样。然后在渲染之后将生成的图像(作为纹理)传送到 NVision3D API。

只需 50 行管理代码,您就可以构建一个在 NVision3D 和 quadbuffer stereo 上无缝运行的程序。 NVidia 所做的一切毫无意义,他们应该立即停止它,并在消费级 GPU 上正确支持四缓冲区立体像素格式。

【讨论】:

谢谢。最后给出一些答案。您能否提供此管理代码的示例或指向我的来源?如何让眼镜进入 3D 模式并与 blitting 图像同步?我在 nvidia 控制面板中没有看到任何强制 3D 模式的选项。 @datenwolf,你能评论 the reports 新的驱动程序在 GTX 卡上启用四倍缓冲吗? @foobarbecue:我必须调查一下。关于立体视觉,这些天我主要在做 VR 和 HMD 的东西,整个 quadbuffer 支持对那些人来说不是问题。 @datenwolf:你有机会调查一下吗?我对 GTX 750 Ti 的体验好坏参半。 Blender 的multiview branch 中的 Quadbuffer 在 Blender 游戏引擎中工作,但在 Blender 视口中不起作用。我无法让我的任何其他 OpenGL 立体程序工作。无法弄清楚如何将 750 改装成 Quadro,所以我想我可能只需要购买 Quadro :-( @foobarbecue:对不起,我还没找到时间。【参考方案2】:

很简单:你不能。不是你想要的方式。

让一个预先存在的程序用立体眼镜做事和做你想做的事是有区别的。您尝试做的是使用 OpenGL 的内置立体支持:创建立体帧缓冲区的能力,您可以在其中任意渲染到左右帧缓冲区。

NVIDIA 不允许在他们的非 Quadro 卡上这样做。它在驱动程序中有一些技巧,可以强制在带有 nVision 和控制面板的应用程序上使用立体声。但是 NVIDIA 的 GeForce 驱动程序不允许您创建立体帧缓冲区。

在你问之前,不,我不知道为什么 NVIDIA 不让你控制立体声。

【讨论】:

嗯,我知道 DirectX 是可能的。那么,OpenGL 有什么问题呢?是否可以使用 DirectX 初始化 3D,然后使用 OpenGL 进行所有绘图等...? 而且,仔细想想,我知道我的 GTX 580 是一个 quadro 级卡(它使用相同的架构)。我听说有些人能够修改驱动程序以使其成为四轮驱动。 @JohnJenkins:不,不是。 D3D 没有用于立体渲染的 API。你说的是幕后的司机把戏,仅此而已。 D3D 11.1明确支持立体显示,但 11.0 和所有之前的版本都没有。 你能指出任何黑客或解决方法吗?我真的需要一个解决方案。我的老板希望它像 6 个月前一样工作。任何建议表示赞赏。 我已经使用 DirectX 与 Google 地球一起获得了立体 3D,所以我知道这是可能的。我对此进行了相当多的研究,我认为在屏幕模式初始化方面我只是做错了一些事情。我正在寻找一个使用 OpenGL 为后来的 GTX 卡初始化 3D 的正确方法示例。【参考方案3】:

由于我正在为自己的游戏调查此问题,因此我发现了此链接,其中有人破解了 USB 协议。 http://users.csc.calpoly.edu/~zwood/teaching/csc572/final11/rsomers/

我没有完全按照它,但在我研究这个的时候,利用这些信息并不难。因此,您可能必须实现自己的代码才能在您的应用程序中支持它,这应该是可能的。不幸的是,一个通用的解决方案会更难,因为你必须破解驱动程序或以某种方式挂钩到 OpenGL 库并拦截调用。

【讨论】:

以上是关于如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?的主要内容,如果未能解决你的问题,请参考以下文章

如何定位多个 API 级别?

如何在Safari 10.1.2及更高版本中使用Dexie.js(v 2.0.1)数据库?

您如何以编程方式在 Android ICS 及更高版本上截取屏幕截图?

如何在 Android 3.0 及更高版本中更改 ActionBar 的触摸效果颜色

如何在 Android 3.0 及更高版本中更改 ActionBar 的触摸效果颜色

如何在 Xcode 7 Beta 5 中安装 iOS 7 及更高版本的模拟器?