既然是学习音视频技术,那必然少不了渲染这个环节,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坐标转换为实际有颜色的屏幕像素点。
顶点数据(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技术。
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:音视频技术这个坑真的是蛮深的。