iOS OpenGL开发(四) - 存储着色器分类

981 阅读5分钟

OpenGL
#前言 在OpenGL核心框架中,是没有提供任何内建渲染管线的,在提交一个集合图形进行渲染之前,必须制定一个着色器。在OpenGL渲染架构解析这篇文章中我们了解到了两个很重要的着色器:顶点着色器片元着色器。这两个着色器属于可编程管线范畴。那么对于固定管线中,我们还有哪一些着色器可以使用呢?接下来,这一片文章,就带领大家了解一下,存储着色器中的八大着色器。

使用存储着色器

使用存储着色器,我们就必须认识一个工具类GLTools。这是一个C++的工具类,其中有一个GLShaderManager去管理所有的存储着色器,他们能够满足进行通常渲染的基本要求。 GLShaderManager在使用之前必须进行初始化:

shaderManager.InitializeStockShaders();

属性

OpenGL支持多达16种可以为每个顶点设置的不同类型参数。这些参数编号从0-15,并且可以与顶点着色器中的任何制定变量相关联,存储着色器为每个变量都使用一致的内部变量命名规则和相同的属性值。里面列出了这些属性:

标识符 描述
GLT _ ATTIBUTE _ VERTEX 3分量(x, y , z)顶点位置
GLT _ ATTIBUTE _ COLOR 4分量(r, g, b, a)颜色值
GLT _ ATTIBUTE _ NORMAL 3分量(x, y , z)表面法线
GLT _ ATTIBUTE _ TEXTURE0 第一对2分量(s, t)纹理坐标
GLT _ ATTIBUTE _ TEXTURE1 第二对2分量(s, t)纹理坐标

Uniform值

这个值我想大家应该不会陌生,上一篇文章中我们有提到这个参数。其实要对几何图形进行渲染,我们需要为对象递交属性矩阵,但首先要绑定到我们想要使用的着色器程序上,并提供程序的Uniform值。GLShaderManager类就可以为我们完成这个操作。UseStockShader函数会选择一个存储着色器并提供这个着色器的Uniform值,这些工作通过一次函数调用就能完成:

GLShaderManager::UseStockShader(GLenum shader, ... ...);

这个函数根据我们选择的着色器从堆栈中提取正确的参数,这些参数就是特定着色器要求的Uniform值。

存储着色器分类

1、单位(Identity)着色器/单元着色器

单元着色器只是简单的使用默认的笛卡尔坐标系。所有片段都是用的同一种颜色,几何图形为实心和未渲染的。这种着色器只使用一个属性GLT_ATTIBUTE_VERTEXvColor参数包含了要求的颜色。

//参数一:着色器属性 
//参数二:需要的颜色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);

2、平面着色器

平面着色器将统一着色器进行了扩展,允许为几何图形变换指定一个4 * 4变换矩阵。典型情况下这是一种左乘模型视图矩阵和投影矩阵,也就是我们常说的“模型视图投影矩阵”。这种着色器只是用一个属性GLT_ATTIBUTE_VERTEX

//参数一:着色器属性 
//参数二:允许变化的4*4矩阵
//参数三:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);

3、上色(Shaded)着色器

这种着色器唯一的Uniform值就是在几何图形中应用的变换矩阵。GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_COLOR在这种着色器中都会使用。颜色值将被平滑得插入顶点之间(这就是所谓的平滑着色)。

//参数一:着色器属性 
//参数二:允许变化的4*4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);

4、默认光源着色器

这种着色器通俗点讲,就是从观察者的方向发出一个平行光所产生的效果。会使对象产生阴影和光照的效果。这里需要模型视图矩阵投影矩阵和作为基本色的颜色值等Uniform值。所需的属性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:模型视图矩阵
//参数三:投影矩阵
//参数四:颜色值
GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);

5、点光源着色器

这个着色器跟默认光源着色器比较像,但是点光源着色器的光源位置是特定的。这种着色器接受4个Uniform值,即模型视图矩阵投影矩阵、视图坐标系中的光源位置和对象的基本漫反射颜色。所需的属性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:模型视图矩阵
//参数三:投影矩阵
//参数四:视点坐标光源位置
//参数五:颜色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);

6、纹理替换矩阵

着色器通过给定的模型视图投影矩阵,使用绑定到nTextureUnit指定的纹理单元的纹理对几何图形进行变换。片段颜色是直接从纹理样本中直接获取的。所需的属性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:投影矩阵
//参数三:需要相乘的纹理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);

7、纹理调整着色器

这种着色器将一个基本色乘以一个取自纹理单元的TextureUnit的纹理。所需的属性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0

//参数一:着色器属性 
//参数二:投影矩阵
//参数三:颜色
//参数四:需要相乘的纹理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);

8、纹理光源着色器

这种着色器将一个纹理通过漫反射照明计算进行调整(相乘),光线在视觉空间中的位置是给定的。这种着色器接受5个Uniform值,即模型视图矩阵投影矩阵、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。所需的属性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0GLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:投影矩阵
//参数三:视图空间中的光源位置
//参数四:几何图形的基本色
//参数五:将要使用的纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit);