CUDA 与 OpenGL 的互操作一般是使用CUDA生成数据,然后在OpenGL中渲染数据对应的图形。这两者的结合有两种方式:

    1、使用OpenGL中的PBO(像素缓冲区对象)。CUDA生成像素数据,OpenGL直接渲染即可。

    2、使用OpenGL中的FBO(顶点缓冲区对象)。CUDA生成顶点数据,OpenGL渲染。

  这两种方法的核心都是将OpenGL中的缓冲区对象映射到CUDA内存空间中(让CUDA的内存指针指向OpenGL的缓冲区),这样就不需要将缓冲区中的数据传输至CUDA内存中,然后利用CUDA的高并行计算性能加速计算,最后直接使用OpenGL渲染。

  

  一个例子,使用CUDA根据时间动态生成16个点,在屏幕上显示。

  步骤:

  1、设置与OpenGL互操作的设备

  1. status=cudaGLSetGLDevice();

  2、在CUDA中注册缓冲区对象

  1. status = cudaGLRegisterBufferObject(this->VBO);

  3、映射缓冲区对象:让CUDA内存指针指向缓冲区对象对应的空间

  1. // 映射缓冲对象
  2. float4* position;
  3. status=cudaGLMapBufferObject((void**)&position, this->VBO);

  4、运行核函数

  1. // 运行核函数
  2. dim3 dimBlock(, , );
  3. dim3 dimGrid();
  4. KernelFunc<<<dimGrid, dimBlock>>>(position, clock(), , );
  5. cudaThreadSynchronize(); //同步线程

  5、取消映射

  1. status=cudaGLUnmapBufferObject(this->VBO);

 效果图:

  

  注意:当CUDA的kernel函数修改CUDA指针指向的空间超出OpenGL缓冲对象大小时,会导致后面出现取消映射失败。(这里所说的CUDA指针是映射到OpenGL缓冲对象的)

  完整代码如下:

  • .cuh文件
  1. #include "cuda_runtime.h" //CUDA运行时API
  2. #include "device_launch_parameters.h"
  3. #include <cuda.h>
  4. #include "GL/glew.h"
  5. #include <cuda_gl_interop.h>
  6. #include <iostream>
  7. #include <stdio.h>
  8.  
  9. class GenVertex
  10. {
  11. public:
  12. GenVertex();
  13. ~GenVertex();
  14. void setVBO(unsigned int vbo);
  15. void createVtxWithCuda();
  16.  
  17. private:
  18. unsigned int VBO;
  19.  
  20. private:
  21. void setup();
  22. };
  • .cu文件
  1. #include "GenVertex.cuh"
  2. #include <time.h>
  3.  
  4. __global__ void KernelFunc(float4* position, float time, unsigned int width, unsigned int height)
  5. {
  6. unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
  7. unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
  8. float u = x / (float)width;
  9. float v = y / (float)height;
  10. u = u*2.0f - 1.0f;
  11. v = v*2.0f - 1.0f;
  12. float freq = 4.0f;
  13. float w = sinf(u*freq + time*0.001f)*cosf(v*freq + time*0.001f)*0.5f;
  14. position[y*width + x] = make_float4(u*, w*, v*, 1.0f);
  15. }
  16.  
  17. GenVertex::GenVertex()
  18. {
  19. this->setup();
  20. }
  21.  
  22. GenVertex::~GenVertex()
  23. {
  24. }
  25.  
  26. void GenVertex::setup() {
  27. cudaError_t status;
  28. //设备设置
  29. status=cudaGLSetGLDevice();
  30. if (status != cudaSuccess) {
  31. puts("setup Device failed!");
  32. }
  33. }
  34.  
  35. void GenVertex::setVBO(unsigned int vbo) {
  36. this->VBO = vbo;
  37. cudaError_t status;
  38. status = cudaGLRegisterBufferObject(this->VBO);
  39. if (status != cudaSuccess) {
  40. puts("Register buffer object failed!");
  41. }
  42. }
  43.  
  44. void GenVertex::createVtxWithCuda()
  45. {
  46. cudaError_t status;
  47. // 映射缓冲对象
  48. float4* position;
  49. status=cudaGLMapBufferObject((void**)&position, this->VBO);
  50. if (status != cudaSuccess) {
  51. puts("map buffer object failed!");
  52. }
  53. // 运行核函数
  54. dim3 dimBlock(, , );
  55. dim3 dimGrid();
  56. KernelFunc<<<dimGrid, dimBlock>>>(position, clock(), , );
  57. cudaThreadSynchronize(); //同步线程
  58. status=cudaGLUnmapBufferObject(this->VBO);
  59. if (status != cudaSuccess) {
  60. puts("unmap buffer object failed!");
  61. }
  62. }

CUDA 与 OpenGL 的互操作的更多相关文章

  1. CUDA与OpenGL互操作实例

    本文要解决的问题是如何实现CUDA和OpenGL的互操作,使得GPU能够将通用计算的运算结果交给OpenGL进行绘制. 本文的应用程序主要包括两个方面: 1.      使用CUDA核函数生成图像数据 ...

  2. CUDA与OpenGL互操作

    当处理较大数据量的时候,往往会用GPU进行运算,比如OpenGL或者CUDA.在实际的操作中,往往CUDA实现并行计算会比OpenGL更加方便,而OpenGL在进行后期渲染更具有优势.由于CUDA中的 ...

  3. CUDA和OpenGL互操作经典博文赏析和学习

    1.使用cuda+opengl图形互操作性实现MPR.原学位论文学习:实时交互的医学图像可视化.在该论文的第5.1.1节. 2.cuda与opengl互操作之PBO 3.cuda与opengl互操作之 ...

  4. [转]CUDA和OpenGL互操作的实现及分析

    CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...

  5. cuda+ffmpeg+opengl解码rtsp h264码流多路

    Cuda 解码 全尺寸 解码 .全尺寸窗口绘制测试( 分别 测试 视频 文件和 IP 相机 实时视频 ) 1080 p 视屏 文件 全尺寸 解码 全尺寸 显示 72 0p IP 相机 全尺寸 解码 全 ...

  6. CUDA基础介绍

    一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi ...

  7. OpenGL与CUDA互操作方式总结

    一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...

  8. [转]OpenGL与CUDA互操作方式总结

    一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...

  9. CUDA编程

    目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...

随机推荐

  1. Django出错提示TemplateDoesNotExist at /

    Issue: 打开login URL的时候报错如下: Action: 在setting.py中修改DIRS,模板文件目录 TEMPLATES = [ { 'BACKEND': 'django.temp ...

  2. 修改robotframework的元素定位方式,使之支持带括号的xpath定位方式

    今天困扰我的一个问题终于解决了 robot框架默认的xpth定位方式是不支持带括号运算的xpth表达式的,例如: (//*[@content-desc="iv_message_icon_21 ...

  3. Linux:用户权限管理

    用户与用户组的概念 超级用户 拥有对系统的最高管理权限,默认是 root 用户 普通用户 只能对自己目录下的文件进行访问和修改,具有登录系统的权限. 虚拟用户 也叫"伪"用户,这类 ...

  4. 201871010113-刘兴瑞《面向对象程序设计(java)》第十一周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...

  5. acwing 848 有向图的拓扑序列

    地址 https://www.acwing.com/problem/content/description/850/ 题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环. 请输出任意一个该有 ...

  6. Eclipse的使用需要注意的问题

    一.修改/设置字符集编码 设置工作空间编码格式 Window--Preference--General--Workspace下,面板''Text file encoding"选择UTF-8格 ...

  7. pytroch中cp27m和cp27mu的区别及判别方法

    python中m和mu的区别 从https://download.pytorch.org/whl中下载pytorch安装包时常会发现有相同版本的安装包有cp27m和cp27mu两种,其中cp27m是u ...

  8. 函数高级实战之ATM和购物车系统升级

    一.项目 二.项目地址 https://github.com/nickchen121/atm 三.功能需求 FUNC_MSG = { '0': '注销', '1': '登录', '2': '注册', ...

  9. spring cloud 2.x版本 Config配置中心教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前面的文章eureka-server的实现. 参考 eureka-server ...

  10. javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题

    我们知道,在JavaScript中提供了一个window.history.back()方法用于返回上一页,另外也可以使用window.history.go(-1)返回上一页(跳转). 在其他的主流浏览 ...