视频处理如果能使用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 同时工作相关推荐

  1. OpenCV/OpenCL/OpenGL区别

    OpenCV/OpenCL/OpenGL区别: OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的应用程序接口(API)的规格,它用于生成二维.三维图像. ...

  2. cuda opencl opengl opencv

  3. OpenCV、OpenCL、OpenGL、OpenPCL

    对于几个开源库的总结,作为标记,以前看过,现在开始重视起来!更详细资料请移步 开源中国社区! 涉及:OpenCV,OpenCL,OpenGL,OpenPCL 截止到目前: OpenGL的最新版本为4. ...

  4. OpenCL通用异构开放环境

    OpenCL通用异构开放环境 OpenCL全称Open Computing Language,第一个面向异构系统通用目的并行编程的开放式.免费标准,一个统一的编程环境,便于软件开发人员为高性能计算服务 ...

  5. OpenCL编程指南-1.2OpenCL图形API

    OpenCL与图形 OpenCL的出现是对GPCPU编程的一个响应.人们用GPU处理图形,并且开始使用GPU完成工作中的非图形部分.基于这种趋势,异构计算(已经存在很长时间)与图形发生冲突,因此迫切需 ...

  6. 【Modern OpenGL】Shader

    Shaders 正如在上一篇教程中提到的,shader是在GPU中运行的小程序.如上一个教程中实现的最简单的vertex shader和fragment shader,一个shader基本上负责图形渲 ...

  7. iOS中 openGL常用函数记录(部分)

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 注:这行代码是用于清楚屏幕.GL_DEPTH_BUFFER_BIT 清除深度缓冲 glVerte ...

  8. OpenGL开发之旅基础知识介绍

    最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...

  9. 计算机可视化仿真技术opengl,基于OpenGL的三维场景可视化仿真

    摘要: 随着计算机可视化技术的发展,计算机可视化应用的领域不断地拓宽,广泛地应用在科学计算.人工智能仿真.三维图形的制作方面等领域.可视化是计算机技术应用的热门领域,而这个热门领域的核心都集中在三维真 ...

最新文章

  1. 如何成为一名优秀CTO
  2. XamarinSQLite教程创建数据库
  3. python画柱形图-Python绘制精美图表之双柱形图
  4. php88,php88微博
  5. Mybatis-Helloword
  6. 论文创新,可以看看这几篇去雨文章是怎么做的
  7. python怎么重命名word文件,Python读取word文本操作详解
  8. 一个轻量级分布式RPC框架--NettyRpc
  9. 机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率
  10. canvas操作图片,进行面板画图,旋转等
  11. 软件测试python测试步骤_软件测试员必备基础:3分钟带你入门自动化测试!
  12. Android四大组件(activity task stack)
  13. 利用工具的SQL注入实战
  14. python银行卡号识别_EAST+CRNN银行卡号识别,附数据集
  15. 转速环PI参数整定详解(三)——转速环开环传函特性及其整定策略(有最终推导结果公式)
  16. 什么是串口协议转换器?串口转换器有哪些特点?
  17. 如何在keil5中定义结构变量
  18. 英语学习——定语和状语
  19. windows截图快捷键
  20. 这4类照片不能留在手机中,越快删除越好,不然后患无穷

热门文章

  1. 【转】刨根究底字符编码【2.0版】(1):开篇
  2. [你必须知道的.NET] 第三回:历史纠葛:特性和属性
  3. 一步步编写操作系统 29 cpu缓存简介
  4. 一步步编写操作系统 25 cpu的保护模式
  5. 集卡php源码,独角数卡自动发卡网PHP源码+教程:虚拟产品自助售卖
  6. 【必知必会】pro文件及常用配置
  7. 批处理for命令各开关的含义
  8. 在已有数据的linkedList和arrayList集合中在中间位置新插入一条数据谁更快
  9. 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )
  10. 【PAT - 甲级 - 1018】Public Bike Management (带权最短路,多条最短路中加条件,DFS)