我在 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 纹理进行插值?
是的,您可以使用 tex2D 直接读取/写入 opengl 纹理。
-
初始化图形资源
struct cudaGraphicsResource *vbo_res;
cudaGraphicsGLRegisterImage(&vbo_res, gl_buffer,gl_target, cudaGraphicsRegisterFlagsSurfaceLoadStore);
-
将资源映射到数组(每帧)
cudaArray *array;
cudaGraphicsMapResources(1, &vbo_res, 0);
cudaGraphicsSubResourceGetMappedArray(&array, vbo_res, 0,0);
-
将纹理绑定到数组
texture<uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> texRef;
cudaBindTextureToArray(texRef, (cudaArray *)array));
texRef.filterMode = cudaFilterModeLinear;
Note:
If texRef
驻留在全局内存中,然后可以在 cuda 内核中访问它float4 rgba = tex2D( texRef, u,v);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)