系列推荐文章:
OpenGL/OpenGL ES入门:图形API以及专业名词解析
OpenGL/OpenGL ES入门:渲染流程以及固定存储着色器
OpenGL/OpenGL ES入门:图像渲染实现以及渲染问题
OpenGL/OpenGL ES入门:基础变换 - 初识向量/矩阵
OpenGL/OpenGL ES入门:纹理初探 - 经常使用API解析
OpenGL/OpenGL ES入门: 纹理应用 - 纹理坐标及案例解析(金字塔)
OpenGL/OpenGL ES入门: 顶点着色器与片元着色器(OpenGL过渡OpenGL ES)
OpenGL/OpenGL ES入门: GLKit以及API简介
OpenGL/OpenGL ES入门: GLKit使用以及案例编程
OpenGL
渲染流程图解析bash
OpenGL
固定存储着⾊器理解服务器
正如上图所表示的,管线分为上下2部分,上半部分时客户端,下半部分为服务器端。 服务器端和客户端时功能和运行上都是异步的,它们是各自独立的软件块和硬件块。异步
在可编程管线中,咱们可以编码的就是Vertex Shader
(顶点着色器) 和 Fragment Shader
(片元着色器),这也是渲染过程当中,必备的2个着色器。post
Vertex Shader
处理从客户端输入的数据、应用变换、进行其余的类型的数学运算来计算光照效果、位移、颜色值等。为了渲染共有3个顶点的三角形,Vertex Shader
将执行3次,也就是为了每一个顶点执行一次。ui
图中的Primitive Assembly
说明3个顶点已经组合在一块儿,而三角形也已经逐个片断的进行了光栅化。每一个片断经过执行Fragment Shader
进行填充。Fragment Shader
会输出咱们将屏幕上看到的最终颜色值。编码
属性: 就是一个对每一个顶点都要做改变的数据元素。实际上,顶点位置自己就是一个属性。属性能够是浮点数、整数或布尔数据。spa
Uniform值: 一般设置Uniform
变量就紧接着发出渲染一个图元批次的命令。能够无限制的使用。设置一个应用于整个表面的单个颜色值,还能够设置一个时间值。能够是浮点数、整数或布尔数据。3d
纹理数据: Vertex Shader
和Fragment Shader
均可以对纹理值进行采样和筛选。纹理数据的做用并不单单是表现图形(后期详解)。code
输出: 输出数据是做为一个阶段着色器的输出定义的,而在后续阶段的着色器则是做为输入(in)定义的。输出类型的数据能够简单地从一个阶段传递到下一个阶段,也能够以不一样的方式插入。客户端代码接触不到的变量。
3种想OpenGL着色器传递渲染数据的方法:
一、属性
二、Uniform值
二、纹理
注意点: Attributes
不可以直接传递给Fragment Shader
,若是须要传递给Fragment Shader
,则须要经过Vertex Shader
间接的传递过去。而 Unifrom
和Texture Data
能够直接传递给Vertex Shader
和Fragment Shader
具体怎么传递,依需求而定。
// GLShaderManager初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
复制代码
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
复制代码
单位着色器:只是简单地使用默认笛卡尔坐标系(范围-1.0~1.0)。全部的片断都应用同一种颜色,几何图形为实心和未渲染的。
参数1:存储着色器种类 - 单元着色器
参数2:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, FLfloat mvp[16], GLfloat vColor[4]);
复制代码
平面着色器:将统一着色器进行了扩展,容许为几何图形变换指定一个4x4变换矩阵。在绘制时,能够应用变换(模型/投影变化)。
参数1:存储着色器种类 - 平面着色器
参数2:容许变化的4x4矩阵
参数3:颜色
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
复制代码
上色着色器:这种着色器惟一的
uniform
值就是在几何图形种应用的变换矩阵。GLT_ATTRIBUTE_VERTEX
(顶点份量)和GLT_ATTRIBUTE_COLOR
(颜色份量)在这种着色器中都会使用。颜色值将被平滑地插入顶点之间(称为平滑着色)。
参数1:存储着色器种类 - 上色着色器
参数2:容许变化的4x4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, FLfloat mvMatrix[16],GLfloat pMatrix[16], GLfloat vColor[4]);
复制代码
默认光源着色器:使对象产生阴影和光照的效果。须要设置存储着色器的
GLT_ATTRIBUTE_VERTEX
(顶点份量)和GLT_ATTRIBUTE_NORMAL
(表面法线)。
参数1:存储着色器种类 - 默认光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:颜色
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, FLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
复制代码
点光源着色器:点光源着色器和默认光源着色器很类似,可是光源位置多是特定的。一样须要设置存储着色器的
GLT_ATTRIBUTE_VERTEX
(顶点份量)和GLT_ATTRIBUTE_NORMAL
(表面法线)。
参数1:存储着色器种类 - 点光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:点光源的位置
参数5:颜色
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
复制代码
纹理替换矩阵着色器:经过给定的模型视图投影矩阵,使绑定到
nTextureUnit
指定的纹理单元的纹理对几何图形进行变换。片断颜色时直接从纹理样本中直接获取的。所需的属性有GLT_ATTRIBUTE_VERTEX
(顶点份量)和GLT_ATTRIBUTE_NORMAL
(表面法线)。 参数1:存储着色器种类 - 纹理替换矩阵着色器 参数2:模型4x4矩阵 参数3:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
复制代码
纹理调整着色器:将一个基本色乘以一个取自纹理单元
nTextureUnit
的纹理。所需的属性有GLT_ATTRIBUTE_VERTEX
(顶点份量)和GLT_ATTRIBUTE_TEXTURE0
(纹理坐标)。
参数1:存储着色器种类 - 纹理调整着色器
参数2:模型4x4矩阵
参数3:颜色值
参数4:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix, GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vBaseColor[4], GLint nTextureUnit);
复制代码
纹理光源着色器:将一个纹理经过漫反射照明计算进行调整(相乘),广西在视觉空间中的位置是给定的,这种着色器接受5个
Uniform
值,即模型视图矩阵、投影矩阵、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。 所需的属性有GLT_ATTRIBUTE_VERTEX
(顶点份量)、GLT_ATTRIBUTE_TEXTURE0
(纹理坐标)和GLT_ATTRIBUTE_NORMAL
(表面法线)。 参数1:存储着色器种类 - 纹理光源着色器 参数2:模型4x4矩阵 参数3:投影4x4矩阵 参数4:点光源位置 参数5:颜色值(几何图形的基本色) 参数6:纹理单元