OpenGL中的帧缓冲区对象和像素缓冲区对象有什么区别?

时间:2009-04-14 15:37:03

标签: opengl

FBO和PBO有什么区别?我应该使用哪一个进行屏幕外渲染?

4 个答案:

答案 0 :(得分:75)

  

FBO和PBO有什么区别?

更好的问题是它们是如何相似的。唯一与他们相似的是他们的名称

A Framebuffer Object(注意大写:framebuffer是一个单词,而不是两个单词)是一个包含多个图像的对象,可以用作渲染目标。

Pixel Buffer Object是:

  1. A Buffer Object。 FBO是不是缓冲区对象。再说一遍:帧缓冲是一个词。
  2. 用于异步uploading/downloading of pixel data to/from images
  3. 的缓冲区对象

    如果要渲染到纹理或仅渲染non-screen framebuffer,则使用FBO。如果您尝试异步读取像素数据到应用程序,或者您尝试异步传输像素数据到OpenGL图像,那么您可以使用PBO。

    他们没什么相似的。

答案 1 :(得分:17)

FBO(Framebuffer对象)是一个目标,您可以在其中渲染默认帧缓冲区或屏幕以外的图像。

PBO(像素缓冲区对象)允许异步将像素数据传输到设备或从设备传输。如果在等待像素传输时还有其他事情可以完成,这有助于提高渲染时的整体性能。

答案 2 :(得分:11)

我会阅读VBOs, PBOs and FBOs

  Apple发布了两个非常好的内容   样本代码演示公益组织和   宗教组织。即便如此   特定于Mac,作为示例代码   在任何平台上都很好,因为PBO和   FBO是OpenGL扩展,而不是   窗口系统扩展。

     

所有这些对象是什么?这里的   情况:

答案 3 :(得分:4)

我想突出一些事情。

FBO 它不是内存块。我认为它看起来像指针的结构。您必须将纹理附加到FBO才能使用它。附加纹理后,您现在可以绘制它以进行屏幕外渲染或第二次传递效果。

struct FBO{
AttachColor0 *ptr0;
AttachColor1 *ptr1;
AttachColor2 *ptr2;
AttachDepth  *ptr3;
};

另一方面, PBO 是内存块“阻塞内存类型。”尝试将其视为x大小的malloc,然后您可以使用memcpy将数据从中复制到纹理/ FBO或它“。

  • 为什么要使用PBO?

创建中间内存缓冲区以与主机内存接口而不停止OpenGL绘图将纹理上传到主机或从主机上传纹理。