从 CUDA 访问 VTK OpenGL 对象(3D 纹理)

VTK OpenGL objects (3D texture) access from CUDA‏

是否有任何正确的方法来访问 VTK 的低级 OpenGL 对象,以便使用 openGL-CUDA/OpenCL 互操作性功能从 CUDA/OpenCL 内核修改它们?

具体来说,我想从 vtkOpenGLGPUVolumeRayCastMapper 获取指向存储数据集的 Opengl 3D Texture 对象的 GLuint(或 unsigned int)成员,以便将其绑定到 CUDA Surface 以便能够访问并从我实现的 CUDA 内核中修改它的值。

有关更多信息,我需要遵循的过程在此处说明: http://rauwendaal.net/2011/12/02/writing-to-3d-opengl-textures-in-cuda-4-1-with-3d-surface-writes/ 其中(在步骤 1 和 2 中)使用的 texID 对象等同于我想从 VTK 中检索的内容。

初看 vtkOpenGLGPUVolumeRayCastMapper 函数时,我没有找到一种简单的方法来执行此操作,而不是创建 vtkGPUVolumeRayCastMapper 子类,但即使在那种情况下我也不确定我应该准确修改什么,因为估计是其他成员依赖3D Texture的值,修改后应该也会更新

那么,你知道这样做的方法吗?

非常感谢。

子类化可能有效,但如果您愿意,您可以避免使用它。重要的是您以正确的顺序获得 GL/CUDA API 调用的顺序。

首先,您必须向 CUDA 注册纹理。这是使用以下方法完成的:

cudaGraphicsGLRegisterImage(&cuda_graphics_resource, texture_handle,
GL_TEXTURE_3D, cudaGraphicsRegisterFlagsSurfaceLoadStore);

规定 texture_handle 是通过调用 glGenTextures(...) 写入的 GLuint

用 CUDA 注册纹理后,就可以创建可以在内核中读取或写入的表面。

您唯一需要担心的是 vtk 在调用 cudaGraphicsMapResources(...) 和 cudaGraphicsUnmapResources(...) 之间不使用纹理。其他一切都应该只是标准的 CUDA。

此外,一旦您将纹理映射到 CUDA 并在内核中写入它,除了取消映射纹理之外没有其他工作。 GL在下次使用时会得到修改后的贴图。