【问题标题】:is there any way to bin an 3d surface created in CUDA to an OpenGL texture?有什么方法可以将在 CUDA 中创建的 3d 表面绑定到 OpenGL 纹理?
【发布时间】:2012-08-23 16:54:39
【问题描述】:

这里是场景: 我通过 cudaBindTextureToArray 将 3D OpenGL 纹理传递给 CUDA,通过非刚性变换对其进行变换并将其写入 3d 表面,然后我想通过纹理将其传递给 GLSL 着色器以进行体积渲染。而 GLSL 只知道纹理 id?我如何将这个 3d 表面用作普通的 OpenGL 纹理?

伪代码

像这样用opengl创建一个纹理

glTexImage3D(GL_TEXTURE_3D, 0,............);

将其传递给 cuda

创建并填充表面

cutilSafeCall(cudaBindSurfaceToArray(volumeTexOut, outTexture->content));
......
..
  cutilSafeCall( cudaMalloc3DArray(&vol->content, &vol->channelDesc, dataSize,  cudaArraySurfaceLoadStore ) );

改造后,..

  surf3Dwrite(short(voxel), volumeTexOut, sizeof(short)*x1,y1, z1);

现在我想将此表面用作 opengl 纹理并将其传递给 GLSL

【问题讨论】:

  • 我不想创建新内存,因为内存在卡上
  • 在你打电话给glTexImage3D之前,你必须先打电话给glCreateTextures,对吧?因此,您可以像传递任何其他纹理一样传递纹理。 (glBindTexture...) GLSL 可以像使用 2D 和 1D 一样使用 3D 采样器。或者是关于如何将纹理绑定到着色器的问题?
  • 如果你的意思是 glCreateTextures ,glGenTextures 是的。但是当我使用 glTexImage3D 时,它需要主机上的指针,然后在设备上从它生成纹理。但是我已经在设备上拥有缓冲区,我只想用 cuda 表面创建的设备上的现有缓冲区将其专用和 id 用于新纹理.
  • 为什么要创建新纹理?传递现有 id(已由 CUDA 填充)有什么问题? (是的,我错了,我的意思是glGenTextures
  • 不,当我们在 cuda 中创建一个表面时,它没有任何 id 和任何纹理 cudaBindSurfaceToArray(volumeTexOut,outTexture->content);我使用并 opengl 现有纹理,创建一个具有相同尺寸的新表面,转换现有纹理并将结果放入表面,现在我想为这个表面指定一个纹理 ID,它们必须有可能具有相同的结构

标签: opengl cuda glsl textures


【解决方案1】:

更新:下面建议的 API 相当陈旧,已被弃用。请看当前Graphics Interop APIs for CUDA

CUDA OpenGL 互操作(不幸的是)是一种单向 API:要在 CUDA 和 OpenGL 之间进行互操作,您必须使用 OpenGL 分配 GL 代码中所需的所有内存,然后将其绑定到 CUDA 数组或设备指针以访问它在 CUDA 中。您不能做相反的事情(使用 CUDA 分配内存并从 OpenGL 访问它)。这适用于由 CUDA 读取或写入的数据。

因此,对于您的输出,您希望在 OpenGL 中分配 3D 纹理,使用cudaMalloc3DArray()。然后您想用cudaGraphicsRegisterFlagsSurfaceLoadStore 调用cudaGraphicsGLRegisterImage,然后使用cudaBindSurfaceToArray 将表面绑定到结果数组。这在 CUDA 4.2 CUDA C 编程指南的第 3.2.11.1 节中进行了讨论。 CUDA 参考指南提供了关于我提到的函数的完整文档。

请注意,表面写入需要 2.0 或更高的 GPU 计算能力。

【讨论】:

  • cudaBindSurfaceToArray 被列为已弃用,尽管它没有在文档中列出它的替代品。 docs.nvidia.com/cuda/cuda-runtime-api/…
  • @Bram 正确。添加了指向当前图形互操作 API 的链接。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2016-07-14
  • 2013-08-07
  • 2011-07-13
  • 2015-04-16
  • 2018-08-15
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多