前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >音视频技术基础(四)-- OpenGL

音视频技术基础(四)-- OpenGL

原创
作者头像
黑眼圈云豆
修改2020-07-10 14:22:24
1.7K0
修改2020-07-10 14:22:24
举报

既然是学习音视频技术,那必然少不了渲染这个环节,OpenGL就是进行图形渲染的一个重要角色。

简介

OpenGL全称“Open Graphics Library”,中文名叫开放图形库或者“开放式图形库”。

由Khronos组织维护的图形库API规范,OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值,接口设计与平台无关。至于内部具体每个函数是如何实现的,由OpenGL库的开发者自行决定,通常是操作系统厂商或显卡厂商来提供。

OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其他输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。

实现及规范

OpenGL的底层由C语言实现,专注于图形渲染处理,在3.2版本之前,OpenGL使用立即渲染模式(Immediate mode),隐藏了底层的细节,容易使用和理解,但是效率太低;2009年OpenGL 3.2开始弃用立即渲染模式,使用核心模式(Core Profile),让开发可以掌握更多的图形处理细节,但上手的困难度也提升了。

OpenGL ES(OpenGL for Embedded Systems) 是OpenGL的子集,从OpenGL裁剪而来,针对手机、游戏主机等嵌入式设备而设计。

如果有接触过浏览器图形渲染的同学,那肯定熟悉WebGL,他就是基于OpenGL ES 2.0在Web浏览器中的进行3D渲染的API

移动端上除了OpenGL ES还常见到EGL(Embedded-System Graphics Library),EGL是一层介于Khronos渲染API与原生平台的窗口系统之间的接口层。

OpenGL的实现规范可以在这里查阅。

工作模式

由于OpenGL与平台无关,其引入了一些抽象层(例如“对象”)来表示OpenGL的操作,本质上OpenGL是一个庞大的状态机,每个对象都记录了大量的状态信息。

OpenGL通过一种名叫图形渲染管线(graphics pipeline)的方式进行工作。

OpenGL管线对OpenGL上下文的操作是通过着色器(shader)来实现,因为GPU中没有默认的顶点/片段着色器,至少需要定义一个顶点着色器和一个片段着色器。

OpenGL图形渲染管线的流程如右图,图形渲染管线的作用是将3D坐标转换为2D坐标(OpenGL中任何事物都是在3D空间中),将2D坐标转换为实际有颜色的屏幕像素点。

OpenGL图形渲染管线
OpenGL图形渲染管线

顶点数据(Vertex data)

顶点数据是一系列顶点的集合。一个顶点(Vertex)是一个3D坐标的数据集,包含位置数据、颜色等用户自定义的顶点属性。

顶点着色器(Vertex Shader)

对顶点数据进行坐标转换,并对顶点属性进行基本的操作。

图元装配(Primitive Assembly)

将顶点着色器输出的所有顶点作为输入,并将所有的点装配成指定图元的形状,简单来说就是把各个顶点连接成多边形。

几何着色器(Geometry Shader)

将图元的一系列顶点集作为输入,可以通过产生新顶点构造出新的图元来生成其他形状,相当于对图元再加工。

光栅化阶段(Rasterization Stage)

将图元映射为最终屏幕上显示的像素,并生成片段,在片段着色器运行之前会执行裁切(Clipping),以使得显示的像素在屏幕之内。

片段着色器(Fragment Shader)

计算一个像素的最终颜色,通俗来说就是上色,这也是所有OpenGL高级效果产生的地方,比如光照、阴影、颜色等等。

Alpha测试和混合(Blending)

这个阶段检测片段的对应的深度值,以此判断这个像素是其它物体的前面还是后面,从而决定是否应该丢弃。这个阶段也会检查物体透明度的alpha值并对物体进行混合(Blend)。

为什么OpenGL渲染比较快?

OpenGL会利用GPU进行并行的渲染处理,相比于CPU的串行处理而言,GPU并行处理可以大幅提升音视频数据处理速度,在现代的GPU中,已经实现了通用可编程的shader单元,这就是GPGPU技术。

GPU加速渲染过程示意图
GPU加速渲染过程示意图

OpenGL常见概念

VBO

顶点缓冲对象(Vertex Buffer Object), 显存中存储所有顶点数据的buffer对象。

VAO

顶点数组对象(Vertex Array Object),记录buffer和顶点属性状态,必须绑定VAO之后才可以绘制东西。

EBO

索引缓冲对象(Element Buffer Object),记录VBO中的数据索引。

FBO

帧缓冲对象(Frame Buffer Object),OpenGL渲染操作的输出目的地,FBO可以创建多个,ID为0的FBO会立即显示在屏幕上。

纹理(texture)

纹理是一个2D图片(也有1D和3D的纹理),它可以用来添加物体的细节。

总结

openGL的内容还是比较多的,我这些资料也是从公司大佬的PPT里面提出来的,可能有些知识点列举的不够详细,想要了解更加详细的内容的话,大家可以去查查,网上的资料也挺多。

内心os:音视频技术这个坑真的是蛮深的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 实现及规范
  • 工作模式
    • 顶点数据(Vertex data)
      • 顶点着色器(Vertex Shader)
        • 图元装配(Primitive Assembly)
          • 几何着色器(Geometry Shader)
            • 光栅化阶段(Rasterization Stage)
              • 片段着色器(Fragment Shader)
                • Alpha测试和混合(Blending)
                  • 为什么OpenGL渲染比较快?
                  • OpenGL常见概念
                    • VBO
                      • VAO
                        • EBO
                          • FBO
                            • 纹理(texture)
                            • 总结
                            相关产品与服务
                            图像处理
                            图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档