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. ...
随机推荐
- Python爬虫(requests模块)
Requests是唯一的一个非转基因的Python HTTP库,人类可以安全享用. Requests基础学习 使用方法: 1.导入Requests模块: import requests 2.尝试用g ...
- 图像处理&计算机视觉中upscale,downscale的翻译理解
最近在看SAN网络(Second-order Attention Network for Single Image Super-Resolution)的论文,其中的Upscale module理解的不 ...
- 201871010112-梁丽珍《面向对象程序设计(java)》第十二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 从傅里叶变换(FFT)到数论变换(NTT)
FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...
- echarts常用说明
import { Injectable } from '@angular/core'; //模板option通用 let fff7 = '#fff'; //字体统一颜色rgba(255,255,255 ...
- ccf再卖菜
https://blog.csdn.net/imotolove/article/details/82777819 记忆化搜索,还不太理解..
- phoenix中添加二级索引
Phoenix创建Hbase二级索引 官方文档 1. 配置Hbase支持Phoenix创建二级索引 1. 添加如下配置到Hbase的Hregionserver节点的hbase-site.xml ...
- IT兄弟连 Java语法教程 数据类型2
整型 Java定义了4种整数类型:byte.short.int和long.所有这些类型都是有符号的.正或负的整数.Java不支持无符号的.只是正值的整数.许多其它计算机语言同时支持有符号和无符号整数. ...
- app自动化测试环境搭建之node+appium+ADT+MUMU模拟器
一.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本 如果没有安装,则获取安装文件 ...
- Newtonsoft.Json 指定某个属性使用特定的时间格式
Newtonsoft.Json 指定某个属性使用特定的时间格式 Intro Newtonsoft.Json 是 .NET 下最受欢迎 JSON 操作库,原为 JSON.Net 后改名为 Newtons ...