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. ...
随机推荐
- Java实现命令行中的进度条功能
前言 最近在写一个命令行中的下载工具,既然是下载文件用的,那么实时显示下载进度是非常有必要的.因此,就有了这里对进度条的实现尝试. 预览图 还是先预览下效果图吧. 这里是cmd里面的效果,总体看着还行 ...
- 网络时间服务和chrony
⽹络时间服务和chrony 实验练习: 准备实验环境: 可用的centos6.7系统. centos6 :192.168.37.6 centos7 :192.168.37.7 关闭selinux 关闭 ...
- Centos7 下安装python3及卸载
一.安装python3 1.安装依赖包 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...
- 201871010117-石欣钰《面向对象程序设计(java)》第一周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- linux 头文件路径
linux 头文件路径 /usr/include
- 发送post请求的接口
一.简介 所有系统或者软件.网站都是从登录开始,所以首先介绍的第一个post请求是登录. 二.help函数 学习一个新的模块捷径,直接用help()函数查看相关注释和案例内容 for example: ...
- Leetcode 216. 组合总和 III
地址 https://leetcode-cn.com/problems/combination-sum-iii/ 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并 ...
- VUE 实现监听滚动事件,实现数据懒加载
methods: { // 获取滚动条当前的位置 getScrollTop() { let scrollTop = 0 if (document.documentElement && ...
- 用VB脚本复制文件夹并跳过重复文件
VB中可通过 scripting.filesystemobject 对象操作文件,其中复制文件或文件夹的函数参数可选覆盖或不覆盖.选择覆盖时,如果目标路径存在同名文件或文件夹,则替换掉已存在的文件.而 ...
- Python解释器和Python集成环境小结
目录 一.执行Python程序的两种方式 1.1 交互式 1.2 命令行式 二.执行Python程序的两种IDE 2.1 Pycharm 2.2 Jupyter 一.执行Python程序的两种方式 1 ...