读取可见帧缓冲区到像素缓冲区对象
Reading the Visible Frame Buffer to a Pixel Buffer Object
我试图捕捉屏幕截图并对它们进行一些操作。我的目标是尽可能少地使用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不参与的情况下进行。
相关文章:
- Opengl 3/4 : 我可以将相同的缓冲区对象绑定到不同的目标吗?
- 使用 OpengGLES2(角度)从帧缓冲区对象读取
- 如何将统一缓冲区对象数组加载到着色器中?
- 将矩阵建模为单个统一缓冲区对象
- 如何使用 new 和 delete 与 OpenGL 的缓冲区对象一起使用?
- OpenGL:缓冲区对象/着色器超出范围
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 在 OpenGL 中,为什么除非我再次重新指定顶点属性,否则我的缓冲区对象不会绘制?
- 打开"GL着色器存储缓冲区对象"以替换"顶点属性"
- 在缓冲区对象上运行并通过着色器更改其数据?
- 使用统一缓冲区对象进行批处理渲染
- 为什么我的 openGL 顶点缓冲区对象不会绘制任何内容?
- 通过帧缓冲区对象渲染到纹理
- 使用索引缓冲区对象时出现奇怪的分段错误
- 帧缓冲区对象错误
- 为什么在调用 glDrawArray 之前不需要绑定顶点缓冲区对象?
- 通过统一缓冲区对象发送到 GLSL 的数据会泄漏到其他绘制调用中 (OpenGL 3.2)
- Boost.Asio如何创建一个大小等于数组大小的缓冲区对象
- 动态打包 OpenGL 顶点缓冲区对象的数据
- Opengl 通过使用顶点缓冲区对象