0. BASE
cuda用于通用计算。
openGL用于渲染。
可以使用VBO、VPO用于二者之间的相互操作。
本文以VBO为例。
1. 套路
s1:在OpenGL中创建VBO对象
glGenBuffers(1, vbo);
glBindBuffer(GL_ARRAY_BUFFER, *vbo);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
s2: 注册VBO到cuda(注意,openGL要先断开该VBO的绑定,才可以注册成功)
struct cudaGraphicsResource *cuda_vbo_resource;
cudaGraphicsGLRegisterBuffer(&cuda_vbo_resource, *vbo, cudaGraphicsMapFlagsWriteDiscard);
s3:映射VBO到cuda的显存地址
cudaGraphicsMapResources(1, &cuda_vbo_resource, 0);
cudaGraphicsResourceGetMappedPointer((void**)&dptr, &num_bytes, cuda_vbo_resource);
s4:调用cuda的kernel进行计算
launch_kernel(dptr, mesh_width, mesh_height, animTime);
s5:计算完毕,解除映射
cudaGraphicsUnmapResources(1, &cuda_vbo_resource, 0);
s6: 从cuda解除该VBO的注册
cudaGraphicsUnregisterResource(cuda_vbo_resource);
s7:删除VBO
glBindBuffer(GL_ARRAY_BUFFER, *vbo);
glDeleteBuffers(1, vbo);
一般来说,在简单的程序中,s1、s2可以放到构造函数中。
s6、s7放到析构函数中。
在注册VBO对象到cuda的时候,openGL要先断开该VBO的绑定,才可以注册成功。