CUDA 与 OpenGL 的互操作
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 的互操作的更多相关文章
- CUDA与OpenGL互操作实例
本文要解决的问题是如何实现CUDA和OpenGL的互操作,使得GPU能够将通用计算的运算结果交给OpenGL进行绘制. 本文的应用程序主要包括两个方面: 1. 使用CUDA核函数生成图像数据 ...
- CUDA与OpenGL互操作
当处理较大数据量的时候,往往会用GPU进行运算,比如OpenGL或者CUDA.在实际的操作中,往往CUDA实现并行计算会比OpenGL更加方便,而OpenGL在进行后期渲染更具有优势.由于CUDA中的 ...
- CUDA和OpenGL互操作经典博文赏析和学习
1.使用cuda+opengl图形互操作性实现MPR.原学位论文学习:实时交互的医学图像可视化.在该论文的第5.1.1节. 2.cuda与opengl互操作之PBO 3.cuda与opengl互操作之 ...
- [转]CUDA和OpenGL互操作的实现及分析
CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...
- cuda+ffmpeg+opengl解码rtsp h264码流多路
Cuda 解码 全尺寸 解码 .全尺寸窗口绘制测试( 分别 测试 视频 文件和 IP 相机 实时视频 ) 1080 p 视屏 文件 全尺寸 解码 全尺寸 显示 72 0p IP 相机 全尺寸 解码 全 ...
- CUDA基础介绍
一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi ...
- OpenGL与CUDA互操作方式总结
一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...
- [转]OpenGL与CUDA互操作方式总结
一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...
- CUDA编程
目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...
随机推荐
- rsync nfs web01总结
目录 rsync nfs web01总结 要求 部署rsync服务端(172.16.1.41) 部署rsync客户端(172.16.1.31.172.16.1.7) 部署web代码 NFS服务端部署 ...
- oracle体系结构简介
oracle体系结构简介 一.物理存储结构 1.数据文件 存放数据库数据,以dbf为扩展名.将数据放在多个数据文件中, 再将数据文件分放在不同的硬盘中,可以提高存取速度. ...
- Scrapy的Spider类和CrawlSpider类
Scrapy shell 用来调试Scrapy 项目代码的 命令行工具,启动的时候预定义了Scrapy的一些对象 设置 shell Scrapy 的shell是基于运行环境中的python 解释器sh ...
- 整理几个经常在H5移动端开发遇到的东西。
本篇主要是我个人的学习分享. 1.弹出数字键盘 <!-- 有“#” “*” 符号输入 --> <input type="tel"> <!-- 纯数字 ...
- 201871010102-常龙龙《面向对象程序设计(java)》第十三周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 设计模式-Proxy(结构型模式)
以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Proxy.h #pragma once class Subject { public: virtual ~Subject ...
- 乘积量化(Product Quantization)
乘积量化 1.简介 乘积量化(PQ)算法是和VLAD算法是由法国INRIA实验室一同提出来的,为的是加快图像的检索速度,所以它是一种检索算法,在矢量量化(Vector Quantization,VQ) ...
- css 适配
https://blog.csdn.net/weixin_35467885/article/details/80778992 1.通过link方法 link方法引入媒体类型其实就是在标签引用样式的时候 ...
- golang--redis基本介绍
redis(remote-dictionary-system)即远程字典服务器,是NoSQL数据库: 适合做缓存以及持久化: 免费开源,高性能的分布式内存数据库: redis的安装和使用: 下载Red ...
- Windows下怎么执行shell脚本
1.在windows下想要执行shell脚本,需要使用到"Git Bash",所以我们需要先安装Git. 2.查看Git环境变量是否配置,没有配置需要配置(我这里安装Git时自动配 ...