我将OpenGL与CUDA之间的数据共享如下:
``` 我正在通过以下方式在OpenGL和CUDA之间共享数据: ```
这段代码运行良好,device_ptr不是指向我的CUDA内存的指针。现在,在某个时间点上,我想使用双线性插值重新采样这个图像。在CUDA中,似乎最好的方法是将设备数据映射到CUDA纹理内存,然后使用tex2D调用执行插值。
现在,我的问题是,成像数据已经存在于OpenGL纹理内存中,我想知道是否有一种方法可以避免再次调用cudaBindTexture2D,并以某种方式在CUDA中使用OpenGL纹理进行此插值?
``` 我正在通过以下方式在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 显示它了。 - mty