2009-04-12 28 views
4

我想做一个显示一些3d图形和命令行的opengl应用程序。我想让他们分开的线程,因为他们都是沉重的过程。我认为我可以用2个不同的视口来处理这个问题,但我想知道如何处理opengl中的线程。如何从不同线程绘制opengl图形?

根据我一直在阅读的内容,Opengl是异步的,并且从不同线程调用它的函数可能是非常有问题的。有没有办法可以用来解决这个问题?理想情况下,我想在3D图形的顶部绘制命令行,并带有一些透明效果......(这是我认为不可能的视口)

解决方案是否便携是非常重要的。

谢谢!

回答

4

它可能你可以实现你想要使用覆盖。
叠加层有点过时的功能,但它应该仍然在大多数设置中支持。基本上,叠加层是一个单独的GL上下文,它与另一个层在同一个窗口中绘制,并绘制在窗口上绘制的任何上下文中。
你可以阅读关于它here

1

你不能用2个视口。

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

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


一个好地方,看看这个想法是OpenSceneGraph.它做了很多工作,与线程,以帮助尽量加快处理,并保持恒定,高帧率具有非常大的场面。

我已经成功嵌入它并使用它从2个独立的线程,但OSG有很多检查来帮助这种情况。

+0

然后,我将不得不看看OSG内部......我当然不想为此功能嵌入整个库...谢谢! – alvatar 2009-04-12 17:50:39

+0

大多数情况下,它只是确保您在线程上创建上下文,并将该线程用于每个到该窗口/上下文的OGL调用。只要你不使用来自不同线程的上下文调用任何OGL调用,你就没问题。 – 2009-04-12 18:19:40

2

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

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