2020-07-26 OpenGL ES 入门案例

218 阅读5分钟

OpenGL ES(OpenGL for Embedded Systems)是以手持和嵌入式为目标的高级3D图形应用编程接口(API)OpenGL ES是目前智能手机中占据统治地位的图形API,支持的平台:iOS,Android,blackberryLinux,windows

一、图形管线

二、图形管道

三、顶点着色器

  • 1、着⾊器程序—描述顶点上执⾏行操作的顶点着⾊器程序源代码/可执行⽂件
  • 2、顶点着⾊器输入(属性) — 用顶点数组提供每个顶点的数据
  • 3、统⼀变量(uniform)—顶点/⽚元着⾊器使⽤的不变数据
  • 4、采样器—代表顶点着⾊器使⽤纹理的特殊统一变量类型.
顶点着色器的业务内容:
  • 1、矩阵变换位置
  • 2、计算光照公式⽣成逐顶点颜⾊
  • 3、⽣成/变换纹理坐标
总结: 它可以⽤于执行⾃自定义计算,实施新的变换,照明或者传统的固定功能所不允许 的基于顶点的效果。

四、图元装配

顶点着⾊器之后,下⼀个阶段就是图元装配. 1、图元(Primitive): 点,线,三⻆角形等. 2、图元装配: 将顶点数据计算成⼀个个图元.在这个阶段会执⾏裁剪、透视分割和 Viewport变换操作。 3、图元类型和顶点索确定将被渲染的单独图元。对于每个单独图元及其对应的顶点,图元装配阶段执行的操作包括:将顶点着⾊器的输出值执⾏裁剪、透视分割、视⼝变换后进⼊入光栅化阶段。

五、光栅化

在这个阶段绘制对应的图元(点/线/三角形). 光栅化就是将图元转化成⼀组二维片段 的过程.⽽这些转化的⽚段将由⽚元着⾊器处理.这些⼆维⽚段就是屏幕上可绘制的像素。

六、片源着色器(fragment shader)

在OpenGL ES中片源着色器通常包含如下的函数/代码段: 1、着⾊器程序—描述⽚段上执行操作的⽚元着⾊器程序源代码/可执行⽂文件 2、输⼊变量— 光栅化单元⽤插值为每个⽚段⽣成的顶点着⾊器输出 3、统⼀变量(uniform)—顶点/⽚元着⾊器使⽤的不变数据 4、采样器—代表⽚元着⾊器使⽤纹理的特殊统⼀变量类型。 片源着色器的业务内容: 1、计算颜色 2、获取纹理值 3、往像素点中填充颜⾊值(纹理值/颜色值); 总结: 它可以⽤于图片/视频/图形中每个像素的颜⾊填充(⽐如给视频添加滤镜,实际上就是将视频中每个图⽚的像素点颜⾊填充进行修改.

七、逐片段判断

• 像素归属测试: 确定帧缓存区中位置(Xw,Yw)的像素⽬前是不是归属于OpenGL ES所 有. 例如,如果一个显示OpenGL ES帧缓存区View被另外一个View 所遮蔽.则窗口系统可以确定被遮蔽的像素不属于OpenGL ES上下文.从而不全显示这些像素.而像素归属测试是OpenGL ES 的⼀部分,它不由开发者开人为控制,⽽是由OpenGL ES内部进⾏. • 裁剪测试: 裁剪测试确定(Xw,Yw)是否位于作为OpenGL ES状态的⼀部分裁剪矩形范围内.如果该⽚段位于裁剪区域之外,则被抛弃. • 深度测试: 输⼊片段的深度值进步⽐较,确定⽚段是否拒绝测试 • 混合: 混合将新生成的⽚段颜色与保存在帧缓存的位置的颜色值组合起来. • 抖动: 抖动可⽤于最⼩化因为使⽤有限精度在帧缓存区中保存颜⾊值⽽产生的伪像.

八、EGL (Embedded Graphics Library )

OpenGL ES在各个iOS、安卓、Linux等各个移动端都可以使用,但是OpenGL ES和各个平台间的对接需要由各个平台自己来提供和维护,OpenGL ES只负责底层的渲染。 • OpenGL ES 命令需要渲染上下文和绘制表⾯才能完成图形图像的绘制. • 渲染上下文: 存储相关OpenGL ES状态. • 绘制表面: 是⽤用于绘制图元的表⾯面,它指定渲染所需要的缓存区类型,例如颜色缓存 区,深度缓冲区和模板缓存区. • OpenGL ES API 并没有提供如何创建渲染上下文或者上下⽂如何连接到原⽣生窗⼝口系统. EGL 是Khronos渲染API(如OpenGL ES) 和原⽣窗⼝系统之间的接⼝. 唯⼀支持 OpenGL ES 却不支持EGL 的平台是iOS. Apple 提供⾃己的EGL API的iOS实现,称为EAGL • 因为每个窗⼝系统都有不同的定义,所以EGL提供基本的不透明类型—EGLDisplay, 这个类型封装了所有系统相关性,⽤于和原生窗⼝和系统接⼝. 由于OpenGL ES是基于C的API,因此它⾮常便便携且受到⼴泛支持。作为C API,它与Objective-C Cocoa Touch应⽤程序无缝集成。OpenGL ES规范没有定义窗口层; 相反,托管操作系统必须提供函数来创建⼀个接受命令的OpenGL ES 渲染上下文和一个帧缓冲区,其中写入任何绘图命令的结果。在iOS上使⽤OpenGL ES需要使⽤iOS类来设置和呈现绘图表面,并使⽤平台中立的API来呈现其内容