为多个显示器设置OpenGL

3
我正在一台Windows 7电脑上进行OpenGL编程,我的应用程序由全屏窗口组成,每个显示器都有一个独立的窗口和线程。我需要采取哪些步骤才能实现连续的场景呢?我仍然对许多OpenGL概念感到困惑,不知道应该如何处理。这与单个监视器渲染基本相同,除了视图矩阵和上下文额外的工作,还是更加复杂?
编辑:我找到了一个网站提供信息,但很模糊且没有示例代码:http://www.rchoetzlein.com/theory/2010/multi-monitor-rendering-in-opengl/

2
是的,您需要为每个窗口单独进行渲染,并以一种方式设置投影矩阵,使得如果您按照它们的边缘将窗口排列,就会得到一个无缝的图像。这被称为平铺渲染。对于我来说,现在已经太晚了,无法写出全面的答案,但是使用Google搜索字符串“OpenGL平铺渲染”可能会给您带来一些结果。 - datenwolf
谢谢,我一直在寻找要在搜索中使用的确切词汇。然而,我没有找到一个与我的问题直接相关且适合我水平的(也许这只是我的无知)。我不确定我看到的许多帖子是否在谈论多个监视器或平铺精灵。我想知道需要哪些API调用以及简单的步骤方法。我知道这是一个困难的问题,所以我会在允许时对其进行悬赏。 - Roger Wilco
1
实际上,平铺渲染并不难。恰好我正在为另一个SO编写一个示例,该示例处理多个窗口之间的上下文重用或共享。你的问题很适合将与你的问题相关的代码放入该示例中。 - datenwolf
1个回答

3

我的第一个问题是,为什么您需要两个不同的OpenGL窗口?

您是否考虑过游戏行业已经使用的解决方案?许多支持多监视器设置的3D应用程序和游戏实际上并不管理自己的单独窗口,而是让GPU在多个屏幕上管理渲染。今年我在一个项目中使用了这种方法,将Oculus Rift视图和电视屏幕上的观察者视图结合起来。我没有管理两个OpenGL场景,只有两个不同的“摄像机”。

http://www.amd.com/en-us/innovations/software-technologies/eyefinity

http://www.nvidia.com/object/3d-vision-surround-technology.html

优点

  • 更易于编码。您只需将代码视为一个场景,无需奇怪的场景管理即可。
  • 优雅的退化。如果用户只有一个屏幕而不是两个,则您的应用程序仍将正常运行,但会缺少一些UI细节。
  • 性能更佳(轶事)。在我的项目中,我发现与使用两个不同的3D窗口相比,性能更好。

缺点

  • 缺乏控制。您受制于驱动程序提供者。例如,nVidia Surround要求将GPU设置为SLI,出于某种原因。
  • 支持有限。只有相对较新的图形卡才支持此多监视器技术。
  • 在屏幕具有相同分辨率时效果最佳。处理相同纵横比甚至分辨率不同的屏幕可能会很困难。
  • 不便。用户必须将其计算机设置为多监视器模式,而他们可能有自己喜欢的模式。

兼容性将是主要原因。我的媒体层有Windows版本和Linux版本--众所周知,Linux的驱动程序不好。另一个原因可能是多卡渲染,这可能超出了本问题的范围。为了澄清,我想每张卡片都有一个线程(每张卡片处理它们的窗口)。然后用户可以选择多卡多监视器、多监视器单卡、全屏或窗口化。我不明白你关于优雅降级的观点。你是说实现起来更容易吗?我已经有多个窗口正常工作,只是没有OpenGL。 - Roger Wilco
1
如果您不担心支持多个视频卡,并且想要走这条路,请考虑查看http://www.mesa3d.org/brianp/TR.html,以获取在您问题编辑中链接中使用的一些技术的具体示例。 - BlamKiwi
这是一个很好的例子,也是我在搜索时寻找的内容。如果 datenwolf 或其他人在悬赏结束之前没有创建自定义示例,我将授予您积分。 - Roger Wilco
1
我可能会在周末试一试。 - BlamKiwi
我真的很想看到一个例子。不过还是谢谢你的全面回复。 - Roger Wilco
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接