通过表面在CUDA中写入浮点OpenGL纹理

问题描述 投票:2回答:3

我正在编写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纹理时,出现编译时错误。在这里我...

c++ opengl cuda interop textures
3个回答
2
投票

事实证明答案很简单,尽管我不知道为什么会起作用。而不是打电话

surf2Dwrite<float4>(sample, tex, (int)sizeof(float4)*x, y, cudaBoundaryModeClamp);

0
投票

有关将CUDA写入链接到OpenGL纹理的表面的完整示例,请参考此项目:


0
投票

来自CUDA Documentation,这是表面模板功能的定义:

© www.soinside.com 2019 - 2024. All rights reserved.