CUDA + OpenGL Interop without deprecated functionality

旧时模样 提交于 2019-12-19 03:44:13

问题


I've previously been able to populate textures in CUDA for use in OpenGL by:

  1. Create and initialize the GL texture (gl::GenTextures(), etc.)
  2. Create a GL Pixel Buffer Object
  3. Register the PBO with CUDA

In the update/render loop:

  1. cudaGraphicsMapResource() with the PBO
  2. Launch the kernel to update the PBO
  3. cudaGraphicsUnmapResource() the PBO from CUDA
  4. Load the GL program, bind texture, render as normal
  5. Wash, rinse repeat.

However, I'm wondering if PBOs are still the best way to write a texture from a kernel. I've seen articles like this one (updated for v5 here) which don't appear to use PBOs at all.

I've seen some references to cudaTextureObject and cudaSurfaceObject, but their role in OpenGL interop is unclear to me.

Are PBOs still the recommended approach? If not, what are the alternatives I should be investigating?

(I'm specifically targeting Kepler and newer architectures.)


回答1:


You can see on the official example in CUDA 6 SDK, it's called "simpleCUDA2GL" in "3_Imaging" directory. It has two different approaches to access texture inside CUDA kernel. One of them (I think the old one) uses the PBO, and it is 3 times slower on my machine.




回答2:


You may want to look at this very recent CUDA GL Interop example from NVIDIA:

https://github.com/nvpro-samples/gl_cuda_interop_pingpong_st



来源:https://stackoverflow.com/questions/22765216/cuda-opengl-interop-without-deprecated-functionality

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!