OpenGL Buffer Object内部工作原理?

时间:2010-09-25 20:11:31

标签: c++ c opengl

我已经开始使用Pixel Buffer Objects,虽然我知道如何使用它们以及它们正在做什么的要点,但我真的不知道幕后发生了什么。我知道OpenGL规范允许在确切的实现方面留有余地,但这仍然超出了我的范围。

据我所知,缓冲区对象通常驻留在GRAM中的服务器端;虽然这显然可能因目标用法而异。这非常有意义,因为这就是为什么OpenGL调用BO会如此快速地运行。但是在这种情况下它会存在于AGP或系统内存中? (附带问题:PCI-e是否具有相当于AGP的内存?)

此外,glMapBuffers()返回指向BO的内存块的指针,因此可以读取/写入/更改数据。但这是怎么做到的?操作正在客户端进行,因此数据仍然必须从服务器到客户端。如果是,那怎么比glReadPixels()好? 公益组织明显优于glReadPixels(),因为性能差异显而易见,我只是不明白如何。

我还没有使用FBO,但我听说它们更好用。这是真的?如果是这样,为什么?

1 个答案:

答案 0 :(得分:0)

我无法告诉你缓冲区对象将在什么内存中分配。实际上你自己大多回答了这个问题,所以你可以希望一个好的司机会这样做。

glMapBuffer可以像内存映射文件一样实现。记住物理内存和虚拟地址空间之间的区别:当您写入内存位置时,地址通过页表映射到物理位置。如果所需页面被标记为已换出,则会发生中断,系统会将所需页面从交换装载到RAM。此机制可用于将文件和其他资源(如GPU内存)映射到进程的虚拟地址空间。当您调用glMapBuffer时,系统会分配一些地址范围(不是内存,只是地址)并准备页表中的相关条目。当您尝试读/写这些地址时,系统会将其加载/发送到GPU。当然这会很慢,所以在途中会进行一些缓冲。

如果您经常在CPU和GPU之间传输数据,我怀疑PBO会更快。当你在GPU上进行很多操作时它们会更快(比如从帧缓冲区加载,用CPU更改几个纹素并在GPU上再次使用它作为纹理)。好吧,在集成图形处理器或AGP内存的情况下,它们可以更快,因为在这种情况下,glMapBuffer可以将地址直接映射到物理内存,从而有效地消除了一次复制操作。

FBO更好吗?为了什么?当你需要渲染到纹理时,它们会更好。这又是因为它们消除了一个数据复制操作。