gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:32:47 25 4
gpt4 key购买 nike

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

具体来说,我想从 vtkOpenGLGPUVolumeRayCastMapper 获取指向存储数据集的 Opengl 3D Texture 对象的 GLuint(或 unsigned int)成员,以便将其绑定(bind)到 CUDA Surface 以便能够访问和修改它的值来 self 实现的 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在下次使用时会得到修改后的贴图。

关于opengl - 从 CUDA 访问 VTK OpenGL 对象(3D 纹理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28541238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com