【问题标题】:Sharing texture between OpenGL and CUDA在 OpenGL 和 CUDA 之间共享纹理
【发布时间】:2015-07-08 22:30:13
【问题描述】:

我在 OpenGL 和 CUDA 之间共享数据如下:

GLuint buffer;
glGenBuffers(1, &buffer);
// Some image is bound to this texture buffer at some point.
...
cudaGraphicsResource_t cgr;
checkCudaErrors(cudaGraphicsGLRegisterBuffer(&cgr, 
                buffer, cudaGraphicsRegisterFlagsNone));
checkCudaErrors(cudaGraphicsMapResources(1, &cgr, 0));
uchar4 * device_ptr = 0;
size_t num_bytes;
checkCudaErrors(cudaGraphicsResourceGetMappedPointer(
               (void **)&device_ptr, &num_bytes, cgr));

这很好用,并且 device_ptr 不是指向我的 CUDA 内存的指针。现在,在某个时候,我想使用双线性插值重新采样该图像。似乎在 CUDA 中执行此操作的首选方法是将设备数据映射到 CUDA 纹理内存,然后使用 tex2D 调用执行插值。

现在,我的问题是图像数据已经存在于 OpenGL 纹理内存中,我想知道是否有办法避免再次调用 cudaBindTexture2D 并以某种方式使用 CUDA 中的 OpenGL 纹理进行插值?

【问题讨论】:

  • 为什么 device_ptr 不是指向 CUDA 内存的指针?在调用cudaGraphicsResourceGetMappedPointer 之后,您应该能够将其视为指向设备内存中数组的指针并启动内核来执行插值。插值完成后,您所要做的就是调用 cudaGraphicsUnmapResources(1, &cgr, 0) 以使其由 OpenGL 显示。
  • 当然可以,但是我可以使用它来使用 tex2D 调用执行纹理插值吗?我需要将它映射到像常规 CUDA 内存这样的纹理来进行插值吗?

标签: opengl cuda


【解决方案1】:

是的,您可以使用 tex2D 直接读取/写入 opengl 纹理。

  1. 初始化图形资源

    struct cudaGraphicsResource *vbo_res;
    cudaGraphicsGLRegisterImage(&vbo_res, gl_buffer,gl_target, cudaGraphicsRegisterFlagsSurfaceLoadStore);
    
  2. 将资源映射到数组(每帧)

    cudaArray *array;
    cudaGraphicsMapResources(1, &vbo_res, 0);
    cudaGraphicsSubResourceGetMappedArray(&array, vbo_res, 0,0);
    
  3. 将纹理绑定到数组

    texture<uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> texRef;
    cudaBindTextureToArray(texRef, (cudaArray *)array));
    texRef.filterMode = cudaFilterModeLinear;
    

注意:

如果 texRef 驻留在全局内存中,则可以在 cuda 内核中使用 float4 rgba = tex2D( texRef, u,v); 访问它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2012-08-14
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多