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

FBO和PBO有什么区别? 哪一个我应该用于离屏渲染?

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

PBO (像素缓冲对象)允许像素数据进出设备的asynchronous传输。 如果在等待像素传输时可以完成其他操作,则可以提高渲染时的总体性能。

FBO和PBO有什么区别?

更好的问题是它们是如何相似的。 关于他们唯一相似的是他们的名字

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

像素缓冲对象是:

  1. 一个缓冲对象 。 FBO 不是缓冲区对象。 再一次:framebuffer是一个字。
  2. 一个缓冲区对象,用于将图像数据asynchronous上传/下载到图像/从图像下载 。

如果你想渲染一个纹理或只是一个非屏幕帧缓冲区 ,那么你使用FBO。 如果您尝试将像素数据asynchronous读取到应用程序,或者您尝试asynchronous传输像素数据到OpenGL图像,则使用PBO。

他们没有任何相似之处。

我会读VBOs,PBO和FBO :

苹果已经发布了两个很好的示例代码,演示了PBO和FBO。 尽pipe这些是Mac特定的,但是作为示例代码,它们在任何平台上都很好,因为PBO和FBO是OpenGL扩展,而不是对系统扩展进行窗口化。

那么这些东西是什么呢? 情况如下:

我想强调一些东西。

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

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

另一方面, PBO是内存块“保存内存types的块”,试着把它看作x尺寸的malloc,然后你可以使用memcpy将数据从它复制到纹理/ FBO或者它。

  • 为什么要使用PBO?

创build中间内存缓冲区与主机内存交互,不停止OpenGL绘图将纹理上传到主机或从主机上传。