有什么方法可以将在CUDA中创建的3D表面装入OpenGL纹理?

时间:2012-08-29 06:12:34

标签: opengl cuda glsl textures

这是场景: 我通过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

1 个答案:

答案 0 :(得分:3)

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

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

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