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

C++ 将可见帧缓冲区读取到像素缓冲区对象,c++,opengl,cuda,gpu,C++,Opengl,Cuda,Gpu,我试图捕捉截图并对其进行一些操作。 我的目标是尽可能少地使用CPU并利用GPU,因此我想使用CUDA来进行图像处理 到目前为止,我正在使用Windows API(StretchBlt和GetDIBits)将帧缓冲区复制到RAM,并使用cudaMemcpy将其复制到VRAM 这些内存拷贝使用CPU,当每秒拷贝多个帧时,CPU会非常密集。 这就是为什么我想将帧缓冲区直接复制到VRAM以供CUDA使用 我发现了一种使用OpenGL PBO的技术,如本文所述:听起来它可能就是实现这一点的方法 有这样的例

我试图捕捉截图并对其进行一些操作。 我的目标是尽可能少地使用CPU并利用GPU,因此我想使用CUDA来进行图像处理

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

这些内存拷贝使用CPU,当每秒拷贝多个帧时,CPU会非常密集。 这就是为什么我想将帧缓冲区直接复制到VRAM以供CUDA使用

我发现了一种使用OpenGL PBO的技术,如本文所述:听起来它可能就是实现这一点的方法

有这样的例子吗

编辑:

我还发现了这个:。 它说:

“PBO的主要优点是快速的像素数据传输到和从一个 图形卡通过DMA(直接内存访问),无需占用CPU 此外,PBO的另一个优点是异步DMA传输。”

所以看起来PBO是正确的方向,但我真的不确定该怎么做

你能举例说明一下源代码吗


平台:Windows XP(仅限win32)

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


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

您是要拍摄整个桌面还是OpenGL应用程序的屏幕截图?@BrunoFerreira,拍摄整个桌面。我可能错了,但您不能使用OpenGL PBO,因为Windows不使用OpenGL进行渲染,因此没有每个像素包含的信息。你必须使用你正在使用的东西,然后将位图数据导入PBO。在我提供的链接上,他们说这是可能的。我正在寻找一个样本来确认……有两件事:只有在没有DWM处于活动状态时,才能将可见帧缓冲区(即前缓冲区)读入PBO。否则,您必须使用GDI。此外,作为挑剔,使用PBO的主要原因不是PBO传输更快,而是异步传输。