OpenGL:快速离屏渲染

5
我需要使用OpenGL在屏幕外呈现大量(数万张)图像。我正在Windows下运行并使用QT作为框架。解决方案可以仅限于Windows,这并不重要。
从谷歌上我发现有许多选项可以完成这个任务。这篇文章提出了几种方法,其中相关的是:
  • Windows特定 - 使用CreateDIBSection,并将纹理与其绑定。
  • 使用似乎受到我的卡支持的pbuffers扩展。

这个线程(第6条消息)提出了一种QT特定的方法,使用QGLWidget :: renderPixmap

我的问题是 - 哪种方式最快?pbuffers似乎是最保险的选择,因为它有保证可以在硬件上执行,但是使用CreateDIB方法也会通过硬件吗? QT方法怎么样? 这个方法似乎存在一些上下文创建问题。 当然,我不想为每个图像创建一个新上下文。
有人有这方面的好经验吗?


编辑:回复评论 -
我有一个始终不变的场景,并且从许多不同的视点进行渲染。目前,这些图像会返回给用户并由CPU处理。未来可能会在GPU上进行处理。


图片是从哪里来的?您是否一遍又一遍地渲染同一个场景,也许从不同的视角?还是从磁盘中加载纹理?而这些图片将会去哪里呢?进入 GPU 计算?还是储存在磁盘上?您的答案取决于细节。 - ejgottl
问题中已经回答。 - shoosh
也许这个链接会有用,我在这里使用了帧缓冲对象和QGLFrameBufferhttps://dev59.com/8nnZa4cB1Zd3GeqPlQw6 - linello
1个回答

8

使用 FBO。它快速、便携且比 pbuffers 更易于使用。

编辑:为了获得最佳性能,请在两个不同的 FBO 之间进行交替渲染:

  1. 渲染到 A
  2. 渲染到 B
  3. 从 A 中读取并处理
  4. 渲染到 A
  5. 从 B 中读取
  6. 返回第 2 步

这样,您可以在 GPU 并行渲染另一个 FBO 时读取和处理一个 FBO。


是的,我刚刚了解了关于帧缓冲对象(FBO)的内容。交替使用两者听起来是一个不错的主意。你知道在渲染到纹理和渲染到渲染缓冲区之间有什么区别吗?哪个更快? - shoosh
渲染到渲染缓冲区是更可取的;它可能会更快,而且肯定不会更慢。 - House MD
更好的PBO链接https://dev59.com/82ct5IYBdhLWcg3wWMFF#12159293 - Ciro Santilli OurBigBook.com
另一个涉及使用FBO进行离屏渲染的答案:https://dev59.com/JG7Xa4cB1Zd3GeqPn0Nw#14796456。 - damix911
没有回答问题。 - mid

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