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