如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Safari 10.1.2及更高版本中使用Dexie.js(v 2.0.1)数据库?
您如何以编程方式在 Android ICS 及更高版本上截取屏幕截图?
如何在 Android 3.0 及更高版本中更改 ActionBar 的触摸效果颜色