"本文转载自:"[音视频开发之旅]的音视频开发之旅(七) OpenGL ES 基本概念"
1.OpenGL ES的简介
OpenGL(Open Graphics Library)是一个跨平台图像程序接口,用于二维和三维图片的渲染。OpenGL ES(Open Graphic Library Embedded Systems)是OpenGL的一个子集,用于手机和嵌入式设备。在android中对OpenGL ES的支持如下:
-
OpenGL ES 2.0 支持android2.2以后的版本;
-
OpenGL ES 3.0 支持android4.3以后的版本;
-
OpenGL ES 3.1 支持android5.0以后的版本。
基于目前android系统占比分布和OpenGL ES的版本使用趋势,我们基于OpenGL ES3.0进行学习实践。在这之前有个问题:OpenGL ES在整个系统中的作用是什么?
通过下面两种图我们可以看到OpenGL ES是CPU和GPU交互的桥梁,是一个Lib。
01.jpg 02.jpg那为什么需要OpenGL ES 这个桥梁?能不能CPU和GPU直接交互?
将数据从一块内存复制到另一块内存中,传递速度是非常慢的,CPU主要处理逻辑控制,GPU在逻辑运算方面比较强大,可以高并行处理图形数据和复杂算法,我们对比看下CPU和GPU的内部结构。
03.jpg2.基本流程和概念
OpenGL ES 3.0实现了具有可编程着色功能的图形管线,有两个规范组成:OpenGL ES 3.0 API 和 GLSL着色器语言。在学习这些规范之前,我们先了解下相关的基本概念。
2.1 渲染的基本流程
04.jpgOpenGL在处理Shader时,和其他编译器一样。通过编译、链接等步骤,生成了着⾊器程序(glProgram),着⾊器程序同时包含了顶点着⾊器和⽚段着⾊器的运算逻辑。在OpenGL进行绘制的时候,⾸先由顶点着⾊器对传⼊的顶点数据进行运算。再通过图元装配,将顶点转换为图元。然后进行光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传入⽚段着⾊器中进行运算。⽚段着色器会对栅格化数据中的每⼀个像素进行运算,并决定像素的颜⾊。
2.2 管线
它是一系列数据处理的过程,将应用程序的数据最终转换到渲染的图像。下图展示了OpenGL ES图形管线。
05.png2.3 顶点
OpenGL ES 的基本元素有点、线、三角形,就像盖钢架结构的房子一样,先确定好位置并搭出框架,OpenGL ES也需要确定好位置即顶点。
06.jpg2.4 纹理
纹理通常是一张图片,也可以用来存储大量的数据,这些数据可以发送到着色器。我们这个章节了解下纹理作为一张图片的意义。
那么为什么需要纹理呐?我们可以为每个顶点添加颜色来丰富图像的细节,如果想让图形开起来更加有趣真实,我们就必须有足够的顶点从而指定足够多的颜色,但这会产生很多额外开销。使用纹理可以避免这个问题。
你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。因为我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。
07.jpg下面是一张怀旧滤镜的纹理图:
08.jpg2.5 顶点着色器(VertexShader)
顶点着色器一般用来处理图形每个顶点的变换,例如 平移、缩放、旋转、投影等。顶点着色器是OpenGL ES中用于计算顶点属性的程序,每个顶点都会并行的执行一次顶点着色器程序。
2.6 图元装配
图元(Primitive)是点、线、三角形等基本几何对象,图元的每个顶点被发送到顶点着色器处理,而图元装配就是把这些顶点做合成图元。
2.7 光栅化
光栅化是把顶点数据转换为片元的过程。将由基本元素(点、线、三角形)组成的几何图元变为二维图像的过程。这个过程包含两部分内容:
(1)确定视图坐标中哪些区域被基本图元占用;
(2)分配一个颜色值和一个深度值到各个区域。
2.8 片段着色器(FragmentShader)
片段着色器又叫片元着色器,用来处理图形中每个像素点颜色计算和填充。
2.9 逐片段操作
在逐片段操作阶段,每个片段上会执行 像素归属测试、裁剪测试、模版和深度测试、混合、抖动。
在测试阶段之后,如果像素依然没有被剔除,那么像素的颜色将会和帧缓冲区中颜色附着上的颜⾊进⾏混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,一般可以通过像素着色器进行实现,当然性能会⽐比原⽣的混合算法差一些。
网友评论