OpenCL、OpenGL 同时工作
视频处理如果能使用OpenCL、OpenGL、omap将大量提高运算速度,简单介绍OpenCL、OpenGL 同时工作。
OpenCL和OpenGL都能用于操作GPU,但是前者主要用于通用计算,而后者主要用于图像渲染。在某些情况下,我们希望能用OpenCL计得到算图像,然后展示在显示器上。如果直接调用OpenGL的现有API,则需要把计算得到的结果通过pci-e总线传回host端内存,再由OpenGL再次通过pci-e总线传回gpu端显存。这样就造成了额外的拷贝,传输开销。事实上,可以使用OpenCL的OpenGL扩展功能,使得OpenCL和OpenGL能共享buffer,从而避免额外的传输。这种共享可以通俗的理解为是让OpenCL和OpenGL共享同一块内存的指针。
要实现这种共享需要三步:
1.OpenCL在OpenGL的上下文基础上创建上下文
//创建上下文的属性
cl_context_properties properties[] = {
CL_GL_CONTEXT_KHR, (cl_context_properties) wglGetCurrentContext(), //获得OpenGL上下文
CL_WGL_HDC_KHR, (cl_context_properties) wglGetCurrentDC(), //获得OpenGl设备信息
CL_CONTEXT_PLATFORM, (cl_context_properties) platform, //获得平台信息
0};
//利用刚刚创建的属性创建上下文
ctx = clCreateContext(properties, 1, &device, NULL, NULL, &err);
2.OpenCL在OpenGL内存对象的基础上创建内存对象
//以buffer为例,需要一个OpenGL的vbo才能创建共用的内存对象
cl_mem clCreateFromGLBuffer(cl_context context, cl_mem_flags flags,
GLuint vbo_desc, cl_int *err)
注意:OpenGL的内存对象必须先行创建,使用OpenCL中的image则需要OpenGL中的texture
3.共享内存对象的同步及访问
很显然OpenCL和OpenGL不能同时去访问同一个数据对象,需要加锁,解锁进行同步
//加锁
int clEnqueueAcquireGLObjects(cl_command_queue queue, cl_uint num_objects,
const cl_mem *mem_objects, cl_uint num_events_in_wait_list,
const cl_event *event_wait_list, cl_event *event)
//加锁后在该处运行openCL代码
//解锁
int clEnqueueReleaseGLObjects(cl_command_queue queue, cl_uint num_objects,
const cl_mem *mem_objects, cl_uint num_events_in_wait_list,
const cl_event *event_wait_list, cl_event *event)
做完这三步后,OpenGL即可直接使用共享的内存对象进行渲染及其他操作。
更加详细的信息请参考:Understanding OpenCL-OpenGL Interoperability
OpenCL / OpenGL Interoperation 教程及实例
OpenCL、OpenGL 同时工作相关推荐
- OpenCV/OpenCL/OpenGL区别
OpenCV/OpenCL/OpenGL区别: OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的应用程序接口(API)的规格,它用于生成二维.三维图像. ...
- cuda opencl opengl opencv
- OpenCV、OpenCL、OpenGL、OpenPCL
对于几个开源库的总结,作为标记,以前看过,现在开始重视起来!更详细资料请移步 开源中国社区! 涉及:OpenCV,OpenCL,OpenGL,OpenPCL 截止到目前: OpenGL的最新版本为4. ...
- OpenCL通用异构开放环境
OpenCL通用异构开放环境 OpenCL全称Open Computing Language,第一个面向异构系统通用目的并行编程的开放式.免费标准,一个统一的编程环境,便于软件开发人员为高性能计算服务 ...
- OpenCL编程指南-1.2OpenCL图形API
OpenCL与图形 OpenCL的出现是对GPCPU编程的一个响应.人们用GPU处理图形,并且开始使用GPU完成工作中的非图形部分.基于这种趋势,异构计算(已经存在很长时间)与图形发生冲突,因此迫切需 ...
- 【Modern OpenGL】Shader
Shaders 正如在上一篇教程中提到的,shader是在GPU中运行的小程序.如上一个教程中实现的最简单的vertex shader和fragment shader,一个shader基本上负责图形渲 ...
- iOS中 openGL常用函数记录(部分)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 注:这行代码是用于清楚屏幕.GL_DEPTH_BUFFER_BIT 清除深度缓冲 glVerte ...
- OpenGL开发之旅基础知识介绍
最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...
- 计算机可视化仿真技术opengl,基于OpenGL的三维场景可视化仿真
摘要: 随着计算机可视化技术的发展,计算机可视化应用的领域不断地拓宽,广泛地应用在科学计算.人工智能仿真.三维图形的制作方面等领域.可视化是计算机技术应用的热门领域,而这个热门领域的核心都集中在三维真 ...
最新文章
- 如何成为一名优秀CTO
- XamarinSQLite教程创建数据库
- python画柱形图-Python绘制精美图表之双柱形图
- php88,php88微博
- Mybatis-Helloword
- 论文创新,可以看看这几篇去雨文章是怎么做的
- python怎么重命名word文件,Python读取word文本操作详解
- 一个轻量级分布式RPC框架--NettyRpc
- 机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率
- canvas操作图片,进行面板画图,旋转等
- 软件测试python测试步骤_软件测试员必备基础:3分钟带你入门自动化测试!
- Android四大组件(activity task stack)
- 利用工具的SQL注入实战
- python银行卡号识别_EAST+CRNN银行卡号识别,附数据集
- 转速环PI参数整定详解(三)——转速环开环传函特性及其整定策略(有最终推导结果公式)
- 什么是串口协议转换器?串口转换器有哪些特点?
- 如何在keil5中定义结构变量
- 英语学习——定语和状语
- windows截图快捷键
- 这4类照片不能留在手机中,越快删除越好,不然后患无穷
热门文章
- 【转】刨根究底字符编码【2.0版】(1):开篇
- [你必须知道的.NET] 第三回:历史纠葛:特性和属性
- 一步步编写操作系统 29 cpu缓存简介
- 一步步编写操作系统 25 cpu的保护模式
- 集卡php源码,独角数卡自动发卡网PHP源码+教程:虚拟产品自助售卖
- 【必知必会】pro文件及常用配置
- 批处理for命令各开关的含义
- 在已有数据的linkedList和arrayList集合中在中间位置新插入一条数据谁更快
- 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )
- 【PAT - 甲级 - 1018】Public Bike Management (带权最短路,多条最短路中加条件,DFS)