OpenGL与CUDA共享纹理
我正在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
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);
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;