【cuda】cuda与OpenGL互操作

文章目录

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的绑定,才可以注册成功。


版权声明:本文为u014117943原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。