目录
渲染:
OpenGL:
OpenGL ES:
OpenGL上下文(OpenGL context)
EGL:
OpenGL 渲染
OpenGL 着色语言
渲染:
用软件将模型生成图像的过程。是计算视频编辑软件中的效果,以生成最终视频的输出过程。
模型:用语言或者数据结构进行严格定义的三维物体或虚拟场景的描述;
图像:数字图像或者位图图像
渲染应用领域:计算机视频游戏,模拟、电影或者电视特效以及可视化设计(光学,视觉感知,数学、软件开发)
OpenGL:
功能强大、调用方便的底层图形库,可用于二维或三维图像的处理与渲染
OpenGL ES:
三维图形 OpenGL的子集,针对手机、ipad和游戏主机等嵌入式设备而设计
2.x 版本相比 1.x 版本有较大差异,1.x 版本为 fixed function pipeline,即固定管线硬件,而 2.x 版本为 programmable pipeline,可编程管线硬件。
固定管线中原本由系统做的一部分工作,在可编程管线中必须需要自己写程序实现,具体程序为 vertex shader(顶点着色器)和 fragment shader(片元着色器)。
OpenGL上下文(OpenGL context)
Opengl仅关注图像渲染的图像接口库,在渲染过程中需要将顶点信息、纹理信息、编译好的着色器等渲染状态信息存储起来,存储这些信息的数据结构就可以看作是OpenGL的上下文。
所有的渲染工作都依赖这些渲染状态信息来完成,当一个上下文被销毁时,对应的OpenGL渲染工作也将结束。
调用任何OpenGL函数前,必须已经创建了OpenGL cotext,GL context存储了OpenGL的状态变量以及其他渲染有关的信息
OpenGL采用Client-Server的模型来解释OpenGL程序,server存储OpenGL Context,Client提出渲染请求,Server给予响应
EGL:
因为OpenGL 不负责窗口管理,所以窗口的管理需要交给各个设备自己完成。IOS平台使用EAGL提供本地平台对OpenGL的实现,Android平台使用EGL提供本地平台对OpenGL的实现
EGL是OpenGL ES和Android底层平台视窗系统之间的接口,在OpenGL的输出与设备屏幕之间的连接者;为OpenGL 提供上下文环境和管理窗口
EGL 为双缓冲机制,有一个Back Frame Buffer和一个Front Frame Buffer,正常绘制目标是Back,绘制完成后调用eglBuffer API在Front显示出来
从代码层面看,OpenGL ES的opengles包下定义了平台无关的绘图指令,EGL定义了控制display(实际显示设备)、contexts(存储OpenGL ES绘图的状态信息)、surfaces(存储图像的内存区域Frame Buffer)的统一的平台接口
使用EGL绘图的一般步骤:
- 获取EGL display对象
- 初始化与EGL display之间的连接
- 获取EGL config对象
- 创建EGL context实例
- 创建EGL Surface实例
- 连接EGL Context和EGL Surface
- 使用GL指令绘制图形
- 断开并释放与EGL Surface关联的EGL Context对象
- 删除EGL SUrface对象
- 删除EGL COntext对象
- 终止与EGL Display之间的连接
但是在Android平台上开发OpenGL ES应用,GLSurfaceView控件提供了对Display、Surface、Context的管理,简化了上述流程
OpenGL 渲染
渲染管线流程为:
顶点数据---顶点着色器--图元装配--几何着色器--光栅化--片段着色器--逐片端处理--帧缓冲
OpenGL 渲染管线流程就是OpenGL 渲染图像的过程,也是OpenGL将图片渲染到屏幕上的过程,可分为以下几阶段:
- 指定几何对象
提供顶点数据后确定具体要画的是点,线段还是三角形,由此确定具体要执行的绘制命令
- 顶点处理
根据模型视图(即根据几何图元创建的物体)和投影矩阵进行变换来改变顶点的位置,根据纹理坐标与纹理居正来改变纹理坐标的位置,如果是三维的渲染还需要处理光照算法和法线变换
总结是处理顶点坐标变换和光照处理,每个顶点单独处理,输入数据是每个顶点的属性特征,输出是变换后的顶点数据
- 图元组装
根据顶点属性,将顶点属性根据图元规则组装成图元
- 栅格化操作
将顶点/边/图形内部等图元数据分解成更小的单元(像素点),并对应于缓冲区的各个像素,这些单元称为片元,一个片元可能包含窗口颜色、纹理坐标等属性。
片元的属性是图元上的顶点数据经过插值而确定的,,即确定好每一个片元是什么
- 片元处理
栅格化操作构造了像素点,这个阶段则处理这些像素点,根据自己的业务处理(如提亮、饱和度、对比度等)来变换这个片元的颜色
- 逐片段处理
进行剪切、Alpha测试、混合等处理,这些操作将会影响其最后在帧缓冲区的颜色值
- 帧缓冲操作
此阶段主要执行帧缓冲的写入操作,也是渲染管线的最后一步,负责将最终的像素点写到帧缓冲区
OpenGL 着色语言
GLSL 全称为 OpenGL Shading Language,为了实现着色器功能而向开发人员提供的一种开发语言,可从以下几点了解该语言:
基本数据类型
Void、bool、int.....
vec2 vec3 vec4:n-维浮点数向量
bevc2 bvec3 bvec 4: n-维布尔向量
ivec2 ivec3 ivec4:n-维整数向量
mat2、mat3、mat4:2x2、3x3、4x4 浮点数矩阵
sampler2D:2D 纹理
samplerCube:盒纹理
变量修饰符
none:(默认的可省略)本地变量,可读可写,函数的输入参数既是这种类型
const:声明变量或函数的参数为只读类型
attribute:用于保存顶点或法线数据,它可以在数据缓冲区中读取数据,仅能用于顶点着色器
uniform:在运行时 shader 无法改变 uniform 变量,一般用来放置程序传递给 shader 的变换矩阵,材质,光照参数等等,可用于顶点着色器和片元着色器
varying:用于修饰从顶点着色器向片元着色器传递的变量
要注意全局变量限制符只能为 const、attribute、uniform 和 varying 中的某一个,不可复合。2
内置变量
GLSL 程序使用一些特殊的内置变量与硬件进行沟通,他们大致分成两种,一种是 input 类型,他负责向硬件(渲染管线)发送数据;另一种是 output 类型,负责向程序回传数据,以便编程时需要。
顶点着色器中 output 类型的内置变量如下:
highp vec4 gl_Position:放置顶点坐标信息
mediump float gl_PointSize:需要绘制点的大小,(只在gl.POINTS模式下有效)
片元着色器中 input 类型的内置变量如下:
mediump vec4 gl_FragCoord;:片元在 framebuffer 画面的相对位置
bool gl_FrontFacing:标志当前图元是不是正面图元的一部分
mediump vec2 gl_PointCoord:经过插值计算后的纹理坐标,点的范围是0.0到1.0
片元着色器中 output 类型的内置变量如下:
mediump vec4 gl_FragColor:设置当前片点的颜色
mediump vec4 gl_FragData[n]:设置当前片点的颜色,使用glDrawBuffers数据数组
内置常量
内置函数