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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值