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互操作的设备

status=cudaGLSetGLDevice();

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

status = cudaGLRegisterBufferObject(this->VBO);

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

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

  4、运行核函数

// 运行核函数
dim3 dimBlock(, , );
dim3 dimGrid();
KernelFunc<<<dimGrid, dimBlock>>>(position, clock(), , );
cudaThreadSynchronize(); //同步线程

  5、取消映射

status=cudaGLUnmapBufferObject(this->VBO);

 效果图:

  

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

  完整代码如下:

  • .cuh文件
#include "cuda_runtime.h" //CUDA运行时API
#include "device_launch_parameters.h"
#include <cuda.h>
#include "GL/glew.h"
#include <cuda_gl_interop.h>
#include <iostream>
#include <stdio.h> class GenVertex
{
public:
GenVertex();
~GenVertex();
void setVBO(unsigned int vbo);
void createVtxWithCuda(); private:
unsigned int VBO; private:
void setup();
};
  • .cu文件
#include "GenVertex.cuh"
#include <time.h> __global__ void KernelFunc(float4* position, float time, unsigned int width, unsigned int height)
{
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
float u = x / (float)width;
float v = y / (float)height;
u = u*2.0f - 1.0f;
v = v*2.0f - 1.0f;
float freq = 4.0f;
float w = sinf(u*freq + time*0.001f)*cosf(v*freq + time*0.001f)*0.5f;
position[y*width + x] = make_float4(u*, w*, v*, 1.0f);
} GenVertex::GenVertex()
{
this->setup();
} GenVertex::~GenVertex()
{
} void GenVertex::setup() {
cudaError_t status;
//设备设置
status=cudaGLSetGLDevice();
if (status != cudaSuccess) {
puts("setup Device failed!");
}
} void GenVertex::setVBO(unsigned int vbo) {
this->VBO = vbo;
cudaError_t status;
status = cudaGLRegisterBufferObject(this->VBO);
if (status != cudaSuccess) {
puts("Register buffer object failed!");
}
} void GenVertex::createVtxWithCuda()
{
cudaError_t status;
// 映射缓冲对象
float4* position;
status=cudaGLMapBufferObject((void**)&position, this->VBO);
if (status != cudaSuccess) {
puts("map buffer object failed!");
}
// 运行核函数
dim3 dimBlock(, , );
dim3 dimGrid();
KernelFunc<<<dimGrid, dimBlock>>>(position, clock(), , );
cudaThreadSynchronize(); //同步线程
status=cudaGLUnmapBufferObject(this->VBO);
if (status != cudaSuccess) {
puts("unmap buffer object failed!");
}
}

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. 通过Shell脚本来创建批量服务器上的MySQL数据库账号

    1.项目背景 因监控需要,我们需要在既有的每个MySQL实例上创建一个账号.公司有数百台 MySQL 实例,如果手动登入来创建账号很麻烦,也不现实.所以,我们写了一个简单的shell脚本,用来创建批量 ...

  2. python类属性 静态方法

      实例 实例就是由对象创建出来的实实在在的存在 创建出来的对象叫做类的实例 创建对象的动作叫做实例化 对象的属性叫做实例的属性 对象调用的方法叫做实例方法   类是一个特殊的对象   类属性 类属性 ...

  3. HTML标记一览表

  4. java8-14-时间API

    原来的时间类  1.默认值 我们使用起来不方便 2.在不同包 不规范   在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义 3.可变  线程 ...

  5. CSRF介绍

    对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...

  6. acwing 47. 二叉树中和为某一值的路径

    地址 https://www.acwing.com/problem/content/description/45/ 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径. 从树的根结 ...

  7. C# Stack 集合学习

    Stack 集合学习 学习自:博客园相关文章 Stack<T>集合 这个集合的特点为:后进先出,简单来说就是新元素都放到第一位,而且顺序移除元素也是从第一位开始的. 方法一:Push(T ...

  8. Educational Codeforces Round 76 (Rated for Div. 2) B. Magic Stick 水题

    B. Magic Stick Recently Petya walked in the forest and found a magic stick. Since Petya really likes ...

  9. 一道常被人轻视的web前端常见面试题(JS)

    本文转载自站长之家,如有侵权问题,请联系我,马上删除. 面试题是招聘公司和开发者都非常关心的话题,公司希望通过它了解开发者的真实水平和细节处理能力,而开发者希望能够最大程度地展示自己的水平(甚至超常发 ...

  10. CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分

    CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分 接下来本系列将通过翻译(https://learnopengl.com)这个网站上关于PBR的内容来学习PBR(P ...