是否可以在 opengl 中从 2 个不同的线程渲染 2 个不同的帧缓冲区对象?
Posted
技术标签:
【中文标题】是否可以在 opengl 中从 2 个不同的线程渲染 2 个不同的帧缓冲区对象?【英文标题】:Is it possible to render 2 different framebuffer objects from 2 different threads in opengl? 【发布时间】:2009-04-14 15:58:09 【问题描述】:或者换句话说:不同的帧缓冲对象是不同的opengl上下文吗?
如果是这样,我可以在不同的线程中渲染不同的 FBO,并在它们在屏幕外渲染后将它们传递给将在屏幕上下文中实际绘制它们的主线程。是否可以?
谢谢
【问题讨论】:
【参考方案1】:如果这两个 FBO 是在 2 个不同的上下文中创建的,则可以。
但是,在一个窗口的屏幕上将它们合成在一起需要将它们传回软件,然后再传回窗口上下文中的硬件。这比仅在一个线程的主上下文中渲染它们要慢。
如果要在一个窗口中进行渲染,最好将注意力集中在单个线程中,然后将注意力集中在其他地方的线程上。剔除和物理是线程的好地方(如果你有的话),但是对于渲染,每个上下文一个线程是基本的经验法则(每个窗口几乎意味着一个上下文)。
【讨论】:
但是,如果有一个 FBO 渲染交互式命令行(在 opengl 中)而另一个 FBO 渲染一个非常繁重的场景,它可能是允许命令行可用性的唯一选项,是吗?对?谢谢! 难道没有办法在不同的上下文之间共享纹理吗? @Reed:谢谢!我不完全理解“您的巨大场景的上下文将与该场景相关联”。你的意思是我正常渲染,然后我用另一个线程来覆盖? @Alvaro:您的覆盖场景,也就是您的命令提示符,只会与您的主场景同时在屏幕上绘制。这就是我说的被捆绑的意思。如果你的主场景只能做到 0.5fps,你的命令提示符将被限制在这个范围内,即使它是在一个单独的线程上。 @ShadowIce,Reed:是的,您可以在上下文之间共享纹理 - 使用 wglShareLists() 或查看 glXCreateContext() 的“share”参数。只要您能够对保留在纹理内存中的纹理进行硬件渲染,那么合成就会很快。以上是关于是否可以在 opengl 中从 2 个不同的线程渲染 2 个不同的帧缓冲区对象?的主要内容,如果未能解决你的问题,请参考以下文章