2

我正在将某个场景渲染到屏幕外帧缓冲区 (FBO),然后我正在读取渲染图像,glReadPixels()用于在 CPU 上进行处理。该处理涉及一些非常简单的扫描例程和数据提取。

在分析之后,我意识到我的应用程序所做的大部分事情都是花费时间glReadPixels()——超过 50% 的时间。所以自然的步骤是将处理转移到 GPU 上,这样就不必复制数据了。

所以我的问题是 - 将这样的东西编程到 GPU 的最佳方法是什么?
GLSL?
库达?
还有什么我目前不知道的吗?
主要要求是它可以访问渲染的屏幕外帧缓冲区(或纹理数据,因为可以渲染到纹理)并能够将一些信息输出到 CPU,比如 1 -2Kb 每帧。

4

3 回答 3

3

您可能会在“ GPU 编程简介”问题中找到有用的答案。

-亚当

于 2008-12-15T19:23:25.050 回答
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 互操作性有一些支持。如果是这样,那可能是你最好的选择。

于 2008-12-27T20:19:38.030 回答
0

我最近发现了这个现代 GPU

于 2013-05-21T19:54:32.893 回答