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

alv*_*tar 45 opengl

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

Nic*_*las 79

FBO和PBO有什么区别?

一个更好的问题是它们是如何相似的.唯一与他们相似的是他们的名字.

帧缓冲区对象(注意大小写:帧缓冲器是一个词,而不是两个)是包含可用于作为再现目标的多个图像中的对象.

一个像素缓冲区对象是:

  1. 一个缓冲区对象.FBO 不是缓冲对象.再说一次:framebuffer是一个单词.
  2. 缓冲区对象,用于向/从图像异步上载/下载像素数据.

如果要渲染到纹理或仅渲染非屏幕帧缓冲区,则使用FBO.如果您尝试异步读取像素数据到应用程序,或者您尝试异步传输像素数据到OpenGL图像,那么您使用PBO.

他们没什么相似之处.

  • 让我们只希望这个在纯链接答案和(不幸接受的)错误答案之上进行投票. (5认同)

Ree*_*sey 19

FBO(Framebuffer的对象)是目标在这里可以呈现比默认帧缓冲器或屏幕其他图像.

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


And*_*are 11

我会读VBO,PBO和FBO:

Apple发布了两个非常好的示例代码,用于演示PBO和FBO.即使这些是特定于Mac的,作为示例代码,它们在任何平台上都很好,因为PBO和FBO是OpenGL扩展,而不是窗口系统扩展.

那么所有这些对象是什么?情况如下:


小智 5

我想强调一点。

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

struct FBO{
AttachColor0 *ptr0;
AttachColor1 *ptr1;
AttachColor2 *ptr2;
AttachDepth  *ptr3;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么要使用 PBO?

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