我正在编写OpenGL / CUDA(6.5)互操作应用程序。尝试通过CUDA内核中的表面引用将浮点值写入OpenGL纹理时,出现编译时错误。
在这里,我对如何设置互操作进行了高级描述,但是我已经成功地从CUDA内核的纹理中读取了图像,因此,我相信这样做是正确的。我有一个用
声明的OpenGL纹理glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB32F_ARB, 512, 512, 0, GL_RGB, GL_FLOAT, NULL);
创建纹理后,我将cudaGraphicsGLRegisterImage
设置为cudaGraphicsRegisterFlagsSurfaceLoadStore
。在运行CUDA内核之前,我先取消绑定纹理,然后对从cudaGraphicsMapResources
获得的cudaGraphicsResource
指针调用cudaGraphicsGLRegisterImage
。然后,我从cudaArray
获得一个cudaGraphicsSubResourceGetMappedArray
,为该数组创建一个适当的资源描述符,然后调用cudaCreateSurfaceObject
以获取一个指向cudaSurfaceObject_t
的指针。然后,我用cudaMemcpy
调用cudaMemcpyHostToDevice
,将cudaSurfaceObject_t
复制到cudaMalloc
分配的设备上的缓冲区。
在我的CUDA内核中,我可以从表面参考中读取类似这样的内容,并且我已经验证它可以按预期工作。
__global__ void cudaKernel(cudaSurfaceObject_t tex) {
int x = blockIdx.x*blockDim.x + threadIdx.x;
int y = blockIdx.y*blockDim.y + threadIdx.y;
float4 sample = surf2Dread<float4>(tex, (int)sizeof(float4)*x, y, cudaBoundaryModeClamp);
在内核中,我想修改样本并将其写回到纹理中。 GPU具有计算功能5.0,因此这应该是可能的。我正在尝试]]
surf2Dwrite<float4>(sample, tex, (int)sizeof(float4)*x, y, cudaBoundaryModeClamp);
但是我得到了错误:
error: no instance of overloaded function "surf2Dwrite" matches the argument list argument types are: (float4, cudaSurfaceObject_t, int, int, cudaSurfaceBoundaryMode)
我可以在]中看到>
cuda-6.5/include/surface_functions.h
仅存在
surf2Dwrite
整数版本的原型,该原型接受第二个参数的void *
。我确实看到了surf2Dwrite
的原型,该原型接受带有模板化float4
对象的surface
,但是,我不确定如何声明带有OpenGL互操作的模板化surface
对象。关于如何执行此操作,我还找不到其他任何东西。任何帮助表示赞赏。谢谢。
我正在编写OpenGL / CUDA(6.5)互操作应用程序。尝试通过CUDA内核中的表面引用将浮点值写入OpenGL纹理时,出现编译时错误。在这里我...
事实证明答案很简单,尽管我不知道为什么会起作用。而不是打电话
surf2Dwrite<float4>(sample, tex, (int)sizeof(float4)*x, y, cudaBoundaryModeClamp);
有关将CUDA写入链接到OpenGL纹理的表面的完整示例,请参考此项目:
来自CUDA Documentation,这是表面模板功能的定义: