【渲染管线】
【顶点着色器】
属性Attribute:顶点矩阵支持的Per_vertex数据
uniforms:顶点着色器使用的常量数据
samplers:被uniforms使用的特殊类型,在顶点着色器的贴图中使用,是可选的
顶点着色器的输出叫做varying变量,在最初的光栅化阶段,这些变量被计算,作为片段着色器的输入,从顶点着色器的矩阵使用插补的方法产生片段着色器的变量,输入和输出在上图描述。
顶点着色器被使用在传统的基于顶点的操作,如位移矩阵、计算光照方程、产生贴图坐标。下面的例子中,顶点着色器需要一个位置和颜色数据作为输入属性,输入位置数据是vec4向量,输出是变换后的位置和颜色:
// UNIFORMS
uniform mat4 u_mvpMatrix; // 用来将P从模型空间model space转到标准化的设备空间normalized device space
// ATTRIBUTES
attribute vec4 a_position; // 位置值
attribute vec4 a_color; // 输入顶点颜色
// VARYINGS 输出到fragment shade片段着色器
varying vec4 v_color; // 输出顶点颜色
void main()
{
v_color = a_color;
gl_Position = u_mvpMatrix * a_position;
}
u_mvpMatrix应用存储模型的关联视图和投射矩阵。
【图元装配】
图元是能被opengles绘制的几何物体,描述了一个顶点属性和图元几何体以及图元类型的集合。
顶点属性包括计算位置、颜色和贴图坐标的信息,他们将被输入到片段着色器中。
顶点着色器能绘制的图元包括三角形、直线、点,对每个图元必须判断是否在视锥体内,在外可能被丢弃。
然后顶点位置被转换为屏幕坐标,剔除操作也能舍弃一些图元,根据图元位于正面还是背面。剪切和剔除后图元进入光栅化阶段。
【光栅化】
光栅化 是转换图元为二维片段的过程,被片段着色器执行,二维的片段像素能被绘制在屏幕上。
【片段着色器】
片段着色器使用下面的输入,执行光栅化后形成片段:
varying变量:光栅化阶段使用插补技术为片段着色器产生,顶点着色器的输入
uniforms:常量数据
samplers:特殊类型,在贴图中使用
片段着色器也能丢弃片段或产生一些颜色值像gl_FragColor,光栅化阶段产生的颜色、深度、模板、屏幕坐标(Xw, Yw)变成opengl es2.0管线输入,
下面显示片段着色器绘制一个gouraud三角形:
precision mediump float;
varying vec4 v_color; // 从顶点着色器 输入的顶点颜色
void main()
{
gl_FragColor = v_color;
}
第一行显示质量,片段着色器不需要定义输出,因为片段着色器仅仅输出的是gl_FragColor。
下一个操作是per-fragment操:
像素所有权测试:决定缓冲器某点的像素当前是否被opengles所有,例如窗口检测到缓冲区被另一个窗口遮挡,视图系统可决定遮挡部分不显示
剪切测试:测试某点是否在剪切矩形内,若在外片段被丢弃
模板深度测试:决定输入的片段是否该被拒绝
抖动:被使用在用几种颜色的组合模拟出大范围内的多种色彩模式
per-fragment阶段最后,片段颜色、深度值、模板值是否被写入缓冲区还要看各自的掩码位是否被使能。
opengles2也支持缓冲器数据读回功能,但仅颜色缓冲区像素能读回。且alpha测试盒logicop测试不再是per-fragment测试的部分。
因为片段着色器能丢弃片段,alpha测试能在片段着色器阶段执行。
【EGL】
opengles要求一个渲染上下文环境和绘图窗口,渲染上下文存储着opengl es状态的属性,绘图窗口决定那个窗口被绘制、
指出将要绘制的图形对颜色缓冲区、深度缓冲区、模板缓冲区的要求,还有每个缓冲区位数。
任何opengles在使用egl渲染前需要做下面的事情:
·查询设备上可用的显示器初始化它,例如一个翻盖手机又两个LCD屏幕,可渲染其中的一个或两个。
·创造一个渲染屏幕,EGL能创造隐藏平面或显示屏平面,显示屏平面联系着操作系统,隐藏平面联系着像素缓冲区。
·创造渲染上下文,EGL需要创造渲染上下文,它在实际使用前需要联系上合适的平面
【库和包含文件】
需要链接:libGLESv2.lib和ELG库libEGL.lib
需要包含的头文件:
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
egl.h是egl头文件,gl2.h是opengles2.0头文件,gl2ext.h是opengles批准的扩展。
所有的EGL函数以egl前缀开始(如eglCreateWindowSurface),EGL数据类型开始,如EGLint和EGLenum。
所有的opengl函数以gl开始,组成函数的每个单词的首个字母大写(如glBlendEquation),同样数据类型以GL开始。
命令后缀和输入参数类型的描述:
opengles命令出错会产生一个错误码,能用glGetError查询。一旦错误码被查询,当前错误码将变成GL_NO_ERROR。
除了GL_OUT_OF_MEMORY错误码意外其他的错误码将被忽略,不影响程序运行状态。
【基本状态管理】
图1-1显示opengles2.0各种管线状态,每种状态能被使能或关闭,状态值被各自的线程维护,例如抖动、剔除、混合等。
当上下文被初始化时,这些状态被初始化。状态使能可用glEnable和glDisable命令设置。
初始化时除了GL_DITHER功能设置为GL_TRUE外,其他的功能都为GL_FALSE,若输入非法参数产生GL_INVALID_ENUM错误码。
可使用glIsEnabled函数查询某状态是否使能。特殊的状态值像混合因子,深度测试值等也使用glGet***函数查询。