有没有正确的方法来访问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纹理值,并且在修改后也应该更新。
那么,你知道某种方法吗?
非常感谢。
答案 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将在下次使用时获得修改后的纹理。