4

我想制作一个显示一些 3d 图形和命令行的 opengl 应用程序。我想让它们分开线程,因为它们都是繁重的进程。我认为我可以使用 2 个不同的视口来解决这个问题,但我想知道如何处理 opengl 中的线程。

根据我一直在阅读的内容,Opengl 是异步的,从不同的线程调用它的函数可能会有很大的问题。有没有办法可以用来解决这个问题?理想情况下,我想在具有透明效果的 3d 图形之上绘制命令行......(我猜这对于视口是不可能的)

解决方案的便携性很重要。

谢谢!

4

3 回答 3

4

您可以使用 Overlays 实现您想要做的事情。
叠加是一个有点过时的功能,但在大多数设置中仍应支持它。基本上,叠加层是一个单独的 GL 上下文,它与另一个层在同一个窗口中呈现,绘制在具有原始上下文的窗口上绘制的任何内容之上。
你可以在这里阅读。

于 2009-04-12T17:53:12.140 回答
2

我认为,与其尝试创建两个线程来绘制到屏幕上,不如使用MVC 模式并使模型线程安全。然后,您可以有一个线程从模型中获取每一帧的必要信息并将其投射到屏幕上,然后还有另外两个线程,一个用于图形,一个用于命令行,它们只管理模型。

例如,您有一个具有 3D 图形内容的 Simulation 类,然后是一个具有命令行的 CommandLine 类。这些类中的每一个都根本不使用 OpenGL;仅管理数据,例如事物在 3d 空间中的位置,在命令行的情况下,屏幕上的行队列。然后opengl线程可以每帧查询这些类的线程安全函数,以获取必要的信息。例如,它抓取 3d 物体的位置,在屏幕上绘制它们,然后抓取要在命令行上显示的线条并绘制它们。

于 2009-04-13T03:40:20.390 回答
1

你不能用 2 个视口来做到这一点。

每个 OpenGL 上下文必须在创建它的同一线程中使用。

可以从两个单独的线程安全地设置和使用两个单独的窗口句柄,每个句柄都有自己的上下文,但不能在一个窗口中设置 2 个视口。


OpenSceneGraph是一个了解这方面想法的好地方。 它在线程方面做了很多工作,以帮助尝试加快处理速度并在非常大的场景中保持恒定的高帧率。

我已经成功地嵌入了它并从 2 个单独的线程中使用它,但是 OSG 有许多检查来帮助解决这种情况。

于 2009-04-12T17:39:54.810 回答