我之前已经能够通过以下方式在 CUDA 中填充纹理以用于 OpenGL:
- 创建并初始化 GL 纹理(
gl::GenTextures()
等) - 创建 GL 像素缓冲区对象
- 向 CUDA 注册 PBO
在更新/渲染循环中:
cudaGraphicsMapResource()
与 PBO- 启动内核以更新 PBO
cudaGraphicsUnmapResource()
来自 CUDA 的 PBO- 加载GL程序,绑定(bind)纹理,正常渲染
- 重复清洗、漂洗。
但是,我想知道 PBO 是否仍然是从内核编写纹理的最佳方式。我看过类似 this one 的文章( updated for v5 here ) 似乎根本没有使用 PBO。
我看到了一些对 cudaTextureObject
和 cudaSurfaceObject
的引用,但我不清楚它们在 OpenGL 互操作中的作用。
PBO 仍然是推荐的方法吗?如果不是,我应该研究哪些替代方案?
(我专门针对 Kepler 和更新的架构。)
最佳答案
您可以在 CUDA 6 SDK 中的官方示例中看到,它在“3_Imaging”目录中称为“simpleCUDA2GL”。 它有两种不同的方法来访问 CUDA 内核中的纹理。 其中之一(我认为是旧的)使用 PBO,它在我的机器上慢了 3 倍。
关于c++ - 没有弃用功能的 CUDA + OpenGL Interop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765216/