OpenGL与CUDA共享纹理

OpenGL与CUDA共享纹理,opengl,cuda,Opengl,Cuda,我正在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, cudaG

我正在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));
这工作正常,设备ptr不是指向CUDA内存的指针。现在,在某个时刻,我想使用双线性插值对这个图像进行重采样。在CUDA中执行此操作的首选方法似乎是将设备数据映射到CUDA纹理内存,然后使用tex2D调用执行插值


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

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

  • 初始化图形资源

    struct cudaGraphicsResource *vbo_res;
    cudaGraphicsGLRegisterImage(&vbo_res, gl_buffer,gl_target, cudaGraphicsRegisterFlagsSurfaceLoadStore);
    
  • 将ressource映射到阵列(每帧)

  • 将纹理绑定到数组

    texture<uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> texRef;
    cudaBindTextureToArray(texRef, (cudaArray *)array));
    texRef.filterMode = cudaFilterModeLinear;
    
    纹理texRef;
    cudaBindTextureToArray(texRef,(cudaArray*)数组);
    texRef.filterMode=cudaFilterModeLinear;
    
  • 注:


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

    为什么设备ptr不是CUDA内存的指针?调用
    cudaGraphicsResourceGetMappedPointer
    后,您应该能够将其视为指向设备内存上数组的指针,并启动内核来执行插值。插值完成后,您所要做的就是调用
    cudaGraphicsUnmapResources(1,&cgr,0)
    ,以便OpenGL显示它。当然可以,但我可以使用它使用tex2D调用执行纹理插值吗?我是否需要将其映射到像常规CUDA内存这样的纹理来进行插值?
    texture<uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> texRef;
    cudaBindTextureToArray(texRef, (cudaArray *)array));
    texRef.filterMode = cudaFilterModeLinear;