如何从不同的线程中绘制OpenGL图形?

4
我想制作一个OpenGL应用程序,显示一些3D图形和命令行。我想将它们分为不同的线程,因为它们都是重要的进程。我认为我可以通过两个不同的视口来实现这一点,但我想知道如何在OpenGL中处理线程。
根据我所读到的,Opengl是异步的,从不同的线程调用其函数可能会有很多问题。有没有方法可以解决这个问题?理想情况下,我想在3D图形上方以某种透明度效果绘制命令行...(我猜这对于视口来说是不可能的)
重要的是解决方案具有可移植性。
谢谢!
3个回答

4

使用覆盖层可能可以实现您想要做的事情。
覆盖层是一种有些过时的功能,但它仍然应该在大多数设置中得到支持。基本上,覆盖层是一个单独的GL上下文,在与另一层相同的窗口中呈现,以其原始上下文绘制在窗口上方。
您可以在此处阅读相关信息。


2

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

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


是的,但在非常低的帧率下(这很可能发生),命令行变得难以管理,因此您无法轻松地发出命令来终止模型或减少其复杂性。 - alvatar
确保两个线程无论如何都要睡眠,以免其中一个挤占另一个的资源。通过缓冲区(在另一个线程中)处理输入,可以在两个线程中轮询以查找相关按键,或者只需让命令行自己检查输入。我认为它应该可以顺利运行。 - Ricket
同时,我认为线程可以有优先级;因此,您可以使命令行线程具有更高的优先级。最重要的是,命令行线程处理输入,因为它可以平稳运行,而模型线程可能运行缓慢,但仍能够处理新的命令等。 - Ricket

1

你不能使用两个视口来完成它。

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

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


一个寻找这方面想法的好地方是OpenSceneGraph。它在线程处理方面做了很多工作,以帮助尝试加速处理并保持恒定的高帧率,即使是非常大的场景。
我已经成功地将其嵌入并从2个单独的线程中使用过,但OSG有许多检查来帮助处理这种情况。

那我得去看看OSG的内部了... 我肯定不想为了这个功能嵌入整个库... 谢谢! - alvatar
大多数情况下,只需要确保在线程上创建上下文,并将该线程用于对该窗口/上下文的每个OGL调用。只要不从不同的线程使用该上下文进行任何OGL调用,就可以了。 - Reed Copsey

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