【发布时间】: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,它们必须有可能具有相同的结构