cuda和opengGL的数据是怎么连接起来的?
cuda有专门的函数还是从内存过一遍?
不需要再从主机内存过一遍
cuda c 提供了图形互操作机制, 只要它们所要处理的数据确实在一块设备上, cuda就能够" 认识"并直接使用opengl已经初始化的空间.
要完成这些工作 cuda和opengl的代码是要写在一块的
/ *
首先.使用 cudaGLSetGLDevice 初始化设备
假设opengl初始化了缓冲区对象 GL_PIXEL_BUFFER并使用glBufferData分配了存储空间.
opengl无非是要计算像素缓冲区内的值然后将其显示出来
*/
/*opengl需要生成一个缓冲区句柄bufferobj,并将这个句柄与缓冲区绑定, 这个句柄是用于与cuda交互的*/
GLuint bufferObj;
glGenBufffers ( 1 , &bufferObj );
glBindBuffer(GL_PIXEL_BUFFER, bufferobj);
/*接着是cuda需要做的工作 */
/*cuda利用利用指针将opengl的缓冲区注册为图形资源*/
cudaGraphicsResource * resource;
cudaGraphicsGLRegisterBuffer( & resource , bufferObj , cudaGraphicsMapFlagsNone);
/*此时cuda已获得这块缓冲区的信息, 但这块缓冲区目前在cuda看来仍然不可用.
接下来将告诉CUDA 运行时映射这个资源,并请求一个指向该映射资源的指针*/
uchar4 * devPtr;
size_t size;
cudaGraphicsMapResources(1,&resource,NULL) ;
cudaGraphicsResourceGetMappedPointer ((void **) & devPtr , &size , resource);
此时可以通过devPtr在核函数中使用这块空间了.
但要注意CUDA和Opengl并不能同时使用这片空间.当Opengl需要使用这片空间时
最好使用cudaGraphicsUnmapResources() 取消其映射.