OpenGL中的渲染架构主要分为两个模块
从图上我们可以看出,客户端和服务器进行数据传递的通道有三种
只能将数据直接传递到顶点着色器,但可以通过GLSL语言间接传入片元着色器中。多用来传递经常发生变动的数据,例如:纹理坐标、光照法线、顶点坐标、颜色数据、投影矩阵、模型矩阵等。
可以将数据直接传递到顶点着色器和片元着色器。多用来传递不经常发生变动的数据。例如:旋转矩阵、视频的颜色控件YUV数据。
可以将纹理数据直接传递到顶点着色器和片元着色器。由于纹理数据是在片元着色器中进行,所以Texture Data通道一般情况下都是将纹理数据传递到片元着色器,传入顶点着色器并没有什么意义。
Shader其实就是一段执行在GPU上的程序,此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。在OpenGL ES中常用的shader有两种:vertex shader和fragment shader。Geometry Shader(几何着色器)是继Vertex Shader和Fragment Shader之后,由Shader Model 4引入的新的着色器。还有一个compute Shader由Shader Model 5引入的提供通用计算能力的着色器。
不同阶段的着色器可以对应不同版本的GLSL。
对于发送给GPU的每一个Vertex(顶点),都要执行一次Vertex Shader。其功能是把每个顶点在虚拟空间中的三维坐标变换为可以在屏幕上显示的二维坐标,并带有用于z-buffer的深度信息。Vertex Shader可以操作的属性有:位置、颜色、纹理坐标,但是不能创建新的顶点。
Attributes: 由 vertext array 提供的顶点数据,如空间位置,法向量,纹理坐标以及顶点颜色,它是针对每一个顶点的数据。属性只在顶点着色器中才有,片元着色器中没有属性。属性可以理解为针对每一个顶点的输入数据。OpenGL ES 2.0 规定了所有实现应该支持的最大属性个数不能少于 8 个。
注:Vertex Attributes 是每点的属性数据。与一个index序号绑定。外部程序可通过 glBindAttribLocation将一个attribute 名与一个index绑定起来。当然,OPENGL ES 内部会自动绑定所有attributes.外部程序只需通过 glGetAttribLocation获取指定attribute名的index。 给Attribute传值可以通过 glVertexAttribPointer函数或者glVertexAttrib4fv。
Uniforms: uniforms保存由应用程序传递给着色器的只读常量数据。在顶点着色器中,这些数据通常是变换矩阵,光照参数,颜色等。由 uniform 修饰符修饰的变量属于全局变量,该全局性对顶点着色器与片元着色器均可见,也就是说,这两个着色器如果被连接到同一 个program Object,则它们共享同一份 uniform 全局变量集。因此如果在这两个着色器中都声明了同名的 uniform 变量,要保证这对同名变量完全相同:同名+同类型,因为它们实际是同一个变量。此外,uniform 变量存储在常量存储区,因此限制了 uniform 变量的个数,OpenGL ES 2.0 也规定了所有实现应该支持的最大顶点着色器 uniform 变量个数不能少于 128 个,最大的片元着色器 uniform 变量个数不能少于 16 个。
Samplers: 一种特殊的 uniform,在vertex shader中是可选的,用于呈现纹理。sampler 可用于顶点着色器和片元着色器。
Shader program: 由 main 声明的一段程序源码,描述在顶点上执行的操作:如坐标变换,计算光照公式来产生 per-vertex 颜色或计算纹理坐标。
Pixel Shader(像素着色器)就是众所周知的Fragment Shader(片元着色器),它计算每个像素的颜色和其它属性。它通过应用光照值、凹凸贴图,阴影,镜面高光,半透明等处理来计算像素的颜色并输出。它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。一个Pixel Shader不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。
在顶点着色器阶段只有唯一的 varying 输出变量-即内建变量:gl_FragColor。
可选着色器。包括曲面细分控制着色(TCS,Tessellation Control Shader)和曲面细分评估着色(TES,Tessellation Evaluation Shader)。
TCS作用于一组叫做控制点(CP,Control Points)的顶点组。控制点并不是被定义成像三角形、矩形、五边形等多边形形式,而是定义为一个几何表面,这个表面通常由多项式来定义,而且移动其中一个控制点将会影响整个表面。这个通常在一些图形软件中,用户可以通过移动一组控制点来随意改变模型表面或者曲线形状,一组控制点通常称为一个Patch。
precision highp float;
OpenGL ES着色语言是两种紧密关联的语言。这些语言用来在OpenGL ES处理管线的可编程处理器创建着色器。 在本文档中,除非另外说明,一个语言功能适用于所有语言,并且通用用法将把他们当做一个语言来看待。特定语言将指出它们的目标处理器:顶点(vertext)或片元(fragment)。
任何被着色器使用的OpenGL ES状态值都会自动地被跟踪并且作用于着色器上。这个自动状态跟踪机制允许应用程序为状态管理而使用OpenGL ES状态命令,并且这些状态值自动地应用在着色器上。
固定着色器是一些系统封装好的非可编程着色器
//没有着色器,在OpenGL 核心框架中是无法进行任何渲染的。初始化一个渲染管理器。
GLShaderManager shaderManager = shaderManager.InitializeStockShaders();
// Use a stock shader, and pass in the parameters needed
GLint UseStockShader(GLT_STOCK_SHADER nShaderID, ...);
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
参数1: 固定着色器种类 - 单元着色器。
参数2: 颜色。
使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形,图形所有⽚段都会以⼀种颜⾊填充。只能绘画一些图形,如三角形、矩形等,对于平移、缩放等形状变化无能为力。
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLflfloat mvp[16],GLflfloat vColor[4]);
参数1: 固定着⾊器种类 - 平⾯着⾊器。
参数2: 允许变化的4*4矩阵。
参数3: 颜色。
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。使用最多的固定着色器。
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLflfloat mvp[16]);
参数1: 固定着色器种类 - 上色着色器。
参数2: 允许变化的4*4矩阵。
使用场景: 在绘制图形时,可以应用变换(模型/投影变化),颜色将会平滑的插入到顶点之间称为平滑着色。
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLflfloat mvMatrix[16],GLflfloat pMatrix[16],GLflfloat vColor[4]);
参数1: 固定着色器种类 - 默认光源着色器。
参数2: 模型4*4矩阵。
参数3: 投影4*4矩阵。
参数3: 颜色值。
使用场景: 在绘制图形时,可以应用变换(模型/投影变化),这种着色器会使绘制的图形产生阴影和光照的效果。
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLflfloat mvMatrix[16],GLflfloat pMatrix[16],GLflfloat vLightPos[3],GLflfloat vColor[4]);
参数1: 固定着色器种类 - 点光源着色器。
参数2: 模型4*4矩阵。
参数3: 投影4*4矩阵。
参数4: 点光源的位置
参数5: 颜色值。
使用场景: 在绘制图形时,可以应用变换(模型/投影变化),这种着色器会使绘制的图形产生阴影和光照的效果。它与默认光源着色器非常类似,区别只是光源位置可以是特定的。
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLflfloat mvMatrix[16],GLint nTextureUnit);
参数1: 固定着色器种类 - 纹理替换矩阵着色器。
参数2: 模型4*4矩阵。
参数3: 纹理单元。
使用场景: 在绘制图形时,可以应用变换(模型/投影变化),这种着色器通过给定的模型视图投影矩阵,使用纹理单元来进行颜色填充,其中每个像素点的颜色是从纹理中获取。
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLflfloat mvMatrix[16],GLflfloat vColor[4],GLint nTextureUnit);
参数1: 固定着色器种类 - 纹理调整着色器。
参数2: 模型4*4矩阵。
参数3: 颜色值
参数4: 纹理单元。
使用场景: 在绘制图形时,可以应用变换(模型/投影变化),这种着色器通过给定的模型视图投影矩阵,着色器将一个基本色乘以一个取自纹理单元nTextureUnit的纹理,将颜色与纹理进行颜色混合后才填充到片段中。
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLflfloat mvMatrix[16],GLflfloat pMatrix[16],GLflfloat vLightPos[3],GLflfloat vBaseColor[4],GLint nTextureUnit);
参数1: 固定着色器种类 - 纹理光源着色器。
参数2: 模型4*4矩阵。
参数3: 投影4*4矩阵。
参数4: 点光源的位置。
参数5: 颜色值(几何图形的基本色)。
参数6: 纹理单元
使用场景: 在绘制图形时,可以应用变换(模型/投影变化),这种着色器通过给定的模型视图投影矩阵,着色器将一个纹理通过漫反射照明计算进行调整(相乘)。是一个中和了纹理、光源、颜色的综合性着色器。