我将某个场景渲染到离屏帧缓冲区(FBO),然后我使用glReadPixels()
读取渲染图像以便在CPU上进行处理。处理涉及一些非常简单的扫描程序和数据提取。
在分析之后,我意识到我的应用程序所做的大部分工作都花费在glReadPixels()
上的时间 - 超过50%的时间。因此,自然的步骤是将处理移至GPU,以便不必复制数据。
所以我的问题是 - 将这样的事情编程到GPU的最佳方法是什么?
GLSL?
CUDA?
我目前还没有意识到的其他事情?
主要要求是它可以访问渲染的离屏帧bufferes(或纹理数据,因为它可以渲染到纹理)并能够输出一些信息给CPU,比如大约1每帧-2Kb。
答案 0 :(得分:3)
您可能会发现“Intro to GPU programming”问题中的答案很有用。
- 亚当
答案 1 :(得分:1)
在其他问题中有许多关于GPU编程入门的指针,但是如果你有一个已经使用OpenGL构建的应用程序,那么你的问题可能就是“哪一个可以与OpenGL互操作”?
毕竟,你的重点是避免使用glReadPixels()将你的FBO从GPU读回CPU的开销。例如,如果你不得不把它读回去,那么将数据复制到CUDA缓冲区,然后使用CUDA API将它传回gpu,没有多大意义。
所以你需要一个GPGPU包来直接将你的OpenGL FBO对象作为输入,而无需任何额外的复制。
除了GLSL之外,这可能会排除一切。
我不是100%确定CUDA是否有任何直接在OpenGL缓冲区对象上操作的方法,但我认为它不具备该功能。
我确信ATI的Stream SDK不会这样做。 (虽然它可以与DirectX互操作。)
我怀疑使用计算着色器的DirectX 11“技术预览”是否具有该功能。
编辑:跟进:看起来CUDA,至少是最新版本,对OpenGL互操作性有一些支持。如果是这样,那可能是你最好的选择。
答案 2 :(得分:0)
我最近发现了这个Modern GPU