我们先看看苹果官方文档对于OpenGL ES
的介绍:OpenGL ES
开放式图形库(OpenGL
的)⽤于可视化的⼆维和三维数据。它是⼀个多功能开放标准图形库,⽀持2D
和3D
数字内容创建,机械和建筑设计,虚拟原型设计,⻜⾏模拟,视频游戏等应⽤程序。您可以使⽤OpenGL
配置3
D图形管道并向其提交数据。顶点被变换和点亮,组合成图元,并光栅化以创建2D
图像。OpenGL
旨在将函数调⽤转换为可以发送到底层图形硬件的图形命令。由于此底层硬门专⽤于处理图形命令,因此OpenGL
绘图通常⾮常快。关于OpenGL ES
我们需要了解到:
1.
OpenGL ES (OpenGL for Embedded Systems)
是跨平台的图形API
。
2.OpenGL ES
是OpenGL
的子集,它消除了冗余功能,提供了⼀个既易于学习⼜更易于在移动图形硬件中实现的库。
OpenGL ES官方文档里的一张图片,很容易看懂OpenGL ES
的工作渲染流程:
这张图和我们之前讲述的
OpenGL
渲染流程图是一致的,CPU
负责调度OpenGL ES
客户端API
,然后由服务端负责渲染显示,这里的服务端不是我们可以操控的全部GPU
来完成,比如图元装配,光栅化等操作。通过这张图,我们很容易就知道一个View
是如何显示到屏幕上的,如下图:OpenGL ES
最后我们看看苹果官方的流程图。这里的流程指的都是我们可以操作的流程,很多我们无法操作的,苹果并没有给我们暴露出来。 程序管线1.
API
获取图片的顶点数据(内存中),然后将顶点数据拷贝到顶点缓冲区(显存中)。
2.API
调用顶点着色器,纹理数据和attributes
属性都可以作用于顶点着色器,进行图元装配。
3.光栅化,GPU
确定像素在屏幕中的位置,将光栅化数据传入片元着色器。
4.片元着色器处理像素计算和填充。
5.然后将像素的数据存在帧缓冲区,最后用于显示到屏幕。
- App:提供图元装配顶点信息,纹理信息
- Vertex(顶点着色器):顶点数据,变换管道,光照
- Geometry(图形结构):图元装配 + 裁剪(超出屏幕部分被裁剪)
- Fragment(片元着色器):纹理处理 + 雾化处理
- Framebuffer Operation(帧缓冲区):透明度混合、模板、深度测试;最后在混合,这些操作都是在即将显示时,在帧缓冲区中完成的动作。
顶点着色器 顶点着色器
顶点着色器输入3种方式
1.顶点着⾊器输⼊(属性
attribute
) — ⽤顶点数组提供每个顶点的数据。
2.统⼀变量(uniform
)—顶点/⽚元着⾊器使⽤的不变数据。
3.采样器—代表顶点着⾊器使⽤纹理的特殊统⼀变量类型。
顶点着色器输出
gl_Position
,是GLSL 的内建变量,就是我们顶点处理后的结果,系统定义,我们拿来使用即可。
gl_PointSize
,是指点的尺寸,即可以在顶点着色器中修改每个点的大小。
顶点着色器处理业务
1.矩阵变换位置
2.计算光照公式⽣成逐顶点颜⾊
3.⽣成/变换纹理坐标
总结: 它可以⽤于执⾏⾃定义计算,实施新的变换,照明或者传统的固定功能所不允许。
图元装配、光栅化
在顶点着色器和片元着色器过程中,也会经历很多操作,比如图元装配、光栅化等,但是这些操作我们只负责调用API
,但是并不知道具体操作过程,这些东西由计算机完成,我们不关心过程,只使用结果。但是我们需要知道,顶点着色器和片元着色器中间需要这么一个桥接。
1.图元装配: 将顶点数据计算成⼀个个图元.在这个阶段会执⾏裁剪、透视分割和
Viewport
变换操作。
2.光栅化:将图元转化成二维片段,然后将这些片段交给片元着色器处理,这些片段就是屏幕上可绘制的像素。
片元着色器 片元着色器
片元着色器输入
1.顶点着色器桥接后的纹理坐标等输出数据。
2.统⼀变量(uniform
)—顶点/⽚元着⾊器使⽤的不变数据。
3.采样器—代表⽚元着⾊器使⽤纹理的特殊统⼀变量类型。
片元着色器输出
gl_FragColor
,是GLSL 的内建变量,就是我们片元处理后的结果。
片元着色器处理业务
1.计算颜⾊。
2.获取纹理值。
3.往像素点中填充颜⾊值(纹理值/颜⾊值);。
总结: 它可以⽤于图⽚/视频/图形中每个像素的颜⾊填充(⽐如给视频添加滤镜,实际上就是将视频中每个图⽚的像素点颜⾊填充进⾏修改)。
逐片段操作
逐片段操作主要由GPU
来完成,开发者不用关心具体操作过程,GPU
将数据提交到帧缓冲区,然后显示。所以下面的逐片段操作内容大家了解即可。
• 像素归属测试:确定帧缓存区中位置(Xw,Yw)的像素⽬前是不是归属于OpenGL ES所有。 例如,如果⼀个显示
OpenGL ES
帧缓存区View
被另外⼀个View
所遮蔽。则窗⼝系统可以确定被遮蔽的像素不属于OpenGL ES
上下⽂。从⽽不全显示这些像素, ⽽像素归属测试是OpenGL ES的⼀部分,它不由开发者开⼈为控制,⽽是由OpenGL ES
内部进⾏。
• 裁剪测试:裁剪测试确定(Xw,Yw
)是否位于作为OpenGL ES
状态的⼀部分裁剪矩形范围内。如果该⽚段位于裁剪区域之外,则被抛弃。
• 混合:混合将新⽣成的⽚段颜⾊与保存在帧缓存的位置的颜⾊值组合起来。
• 抖动:抖动可⽤于最⼩化因为使⽤有限精度在帧缓存区中保存颜⾊值⽽产⽣的伪像。
• 深度测试:输⼊⽚段的深度值进步⽐较,确定⽚段是否拒绝测试。
OpenGL ES的应用
图片滤镜:获取图片中的像素点,然后做处理,比如饱和度、颜色处理,然后将处理后的像素存储到帧缓冲区,最后显示出来。
视频滤镜:视频处理和图片原理是一样的,因为视频也是一帧一帧的图片组成。我们将mp4
格式的视频,解压缩成h264
格式的视频文件,然后解压成一帧一帧的图片进行处理。
了解EGL
OpenGL ES
作为跨平台的API
,并没有提供窗口系统的载体。而EGL
就是渲染API
和窗口系统之间的连接通道。苹果自己的EGL就是EAGL
。
•
OpenGL ES
命令需要渲染上下⽂和绘制表面才能完成图形图像的绘制。
•OpenGL ES API
并没有提供如何创建渲染上下文或者上下文如何连接到原生窗口系统。EGL
是Khronos
渲染API
(如OpenGL ES
) 和原⽣窗⼝系统之间的接⼝。唯⼀支持OpenGL ES
却不支持EGL
的平台是iOS
。Apple
提供⾃己的EGL API
的iOS
实现,称为EAGL
。
• 因为每个窗⼝系统都有不同的定义,所以EGL
提供基本的不透明类——EGLDisplay
, 这个类型封装了所有系统相关性,用于和原生窗⼝系统接⼝。
• 渲染上下⽂: 存储相关OpenGL ES
状态,是一个状态机绘制表面:⽤于绘制图元的表面,需要指定渲染的缓存区,例如颜⾊缓、深度和模板。
网友评论