【问题标题】:VTK OpenGL objects (3D texture) access from CUDA‏从 CUDA 访问 VTK OpenGL 对象(3D 纹理)
【发布时间】:2015-04-16 22:52:02
【问题描述】:

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

具体来说,我想从 vtkOpenGLGPUVolumeRayCastMapper 中获取 GLuint(或无符号整数)成员,该成员指向存储数据集的 Opengl 3D 纹理对象,以便将其绑定到 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 Texture值,修改后也要更新。

那么,你知道一些方法可以做到这一点吗?

非常感谢。

【问题讨论】:

    标签: opengl cuda vtk


    【解决方案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 将在下次使用时获取修改后的纹理。

    【讨论】:

    • 感谢您的回答,但这并不是真正的疑问。主要问题是重新定义 VTK,而不是 Interop。
    • 首先,没有实现对VTK GLuint的访问,因为它是作为私有成员处理的。也许我可以对它进行子类化并创建一个函数来获取访问权限。即使这样,另一个问题也出现了。由于 VTK 被认为处理静态体积,我的猜测是 VTK 会在创建 VTK 体积对象时创建除纹理之外的其他数据。如果我仅从外部(CUDA)修改纹理,则存储在对象中的大部分附加数据将变得过时。所以,最大的问题是如何在他不注意的情况下从外部修改对象时的鲁棒性。
    • 我不熟悉 VTK,但可以肯定的是,只要它是受保护的而不是私有的,您就可以进行子类化。如果它是私有的,如您所说,您可以查询 GL 以获取当前绑定的纹理,但您必须知道 VTK 何时调用 glBindTexture()。这假设您正在编写自己的着色器,如果 VTK 处理所有这些,则不会工作。据我所知,OpenGL 存储的任何信息都不会因在 CUDA 内核中写入纹素值而失效。多次将(过时的)纹素重新发送到 OpenGL 的计算成本很高,所以我怀疑 VTK 会这样做,但我不能说。
    • 实际上,该变量是受保护的,所以我可以轻松访问它。我提到的 Invalidated 信息不是来自 OpenGL,而是来自 VTK,因为可能会在为其分配新体积时计算一些加速结构和附加计算(例如,与体积相关的梯度场),并且因为 VTK不知道这个 CUDA 修改,附加数据将变得过时,因为它是在使用普通 VTK 接口分配初始体积时计算的。我想只有 VTK 专家才能回答这个问题:P。不过谢谢!
    猜你喜欢
    • 2012-06-26
    • 2011-03-24
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多