使用OpenGL 1.2版进行屏幕外渲染

时间:2015-07-07 02:43:11

标签: opengl

使用新版本的OpenGL,我可以使用FBO进行屏幕外渲染,并从FBO读取像素,然后执行我想要对数据执行的操作。

如何使用不支持FBO的旧版OpenGL(如OpenGL 1.2)进行屏幕外渲染?

2 个答案:

答案 0 :(得分:1)

只需使用FBO 扩展程序即可。 FBO是一个驱动程序功能,而不是硬件功能,甚至最老的GPU(我说不支持着色器,只是简单的旧固定功能管道)可以做FBO。我还在使用旧的GeForce-2(1998年出版的那台)(在我用于数据考古的旧计算机中;它有ZIP驱动器,并行SCSI总线等等),甚至那个也可以做FBO。

https://www.opengl.org/registry/specs/ARB/framebuffer_object.txt

答案 1 :(得分:1)

OpenGL中用于屏幕外渲染的传统(pre-FBO)机制是pbuffers。例如,对于Windows,它们在WGL_ARB_pbuffer extension中定义。它们也可以在其他平台上使用,如Mac,Android等。

除了pbuffers的古老性之外,FBO还有一个根本区别:pbuffer支持是OpenGL的窗口系统接口的扩展,而FBO支持是OpenGL本身的一个特性。

这样做的一个推论是渲染到pbuffer发生在一个单独的上下文中。对于FBO,您只需创建一个新的OpenGL帧缓冲对象,并在相同的上下文中使用常规OpenGL调用渲染它,这在pbuffer情况下是不同的。在那里你设置了一个上传到一个 离屏表面而不是窗口表面。然后,屏幕外表面是此上下文的主要帧缓冲区,您可以在此单独的上下文中对pbuffer进行所有渲染。

话虽如此,请在使用pbuffers之前再三考虑。 FBO的支持,至少在扩展形式,已经存在了很长时间。我很难想象编写需要在足以支持FBO的硬件上运行的新软件。

FBO几乎在所有方面都优于pbuffers。主要的好处是可以在没有特定于平台的API的情况下使用它们,并且它们不需要额外的上下文。

FBO支持的唯一一个FBO不容易支持的情况是纯粹的屏幕外渲染,你不想创建一个窗口。例如,如果要在可能没有显示的服务器上呈现图像,pbuffers实际上是一种有用的机制。