读取可见帧缓冲区到像素缓冲区对象

Reading the Visible Frame Buffer to a Pixel Buffer Object

本文关键字:缓冲区 对象 像素 读取      更新时间:2023-10-16

我试图捕捉屏幕截图并对它们进行一些操作。我的目标是尽可能少地使用CPU,并利用GPU,所以我想使用CUDA来做图像处理。

到目前为止,我正在使用Windows API (StretchBlt和GetDIBits)将帧缓冲区复制到RAM,并使用cudaMemcpy将其复制到VRAM。

这些内存副本使用CPU,当每秒复制许多帧时,它会变得非常占用CPU。这就是为什么我想将帧缓冲区直接复制到VRAM以使用CUDA。

我发现了一种使用OpenGL PBO的技术,如下所述:http://gravisma.zcu.cz/GraVisMa-2010/Papers/Poster/F13-full.pdf,听起来它可能是这样做的。

有这样的例子吗?

编辑:

我还发现了这个:http://www.songho.ca/opengl/gl_pbo.html。上面写着:

"PBO的主要优点是快速的像素数据传输到和从一个图形卡通过DMA(直接内存访问),而不涉及CPU周期。PBO的另一个优点是异步DMA传输。"

所以看起来PBO是正确的方向,但我真的不确定如何做。

你能举例说明源代码吗?

平台:Windows XP(仅限win32)

如果你需要在CUDA中处理截图,为什么不使用OpenGL互操作呢?这样就可以将纹理/缓冲区作为图像读取。这样所有的数据都留在GPU上,CPU永远不会被使用。

之后,你可以将纹理映射到CPU内存/固定内存并将其保存到文件中(因为你想要截图)。传输将在DMA和CPU不参与的情况下进行。