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

时间:2015-02-16 12:15:42

标签: opengl cuda vtk

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

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

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

首先看一下vtkOpenGLGPUVolumeRayCastMapper函数,我找不到一个简单的方法,而不是创建一个vtkGPUVolumeRayCastMapper子类,但即使在这种情况下我也不确定应该修改什么,因为我猜其他一些成员依赖于3D纹理值,并且在修改后也应该更新。

那么,你知道某种方法吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

子类化可能有效,但如果你愿意,你可以避免它。重要的是,您按正确的顺序获得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将在下次使用时获得修改后的纹理。