使用存储着色器,咱们就必须认识一个工具类GLTools
。这是一个C++的工具类,其中有一个GLShaderManager
去管理全部的存储着色器,他们可以知足进行一般渲染的基本要求。 GLShaderManager
在使用以前必须进行初始化:编程
shaderManager.InitializeStockShaders();
复制代码
OpenGL支持多达16种能够为每一个顶点设置的不一样类型参数。这些参数编号从0-15,而且能够与顶点着色器中的任何制定变量相关联,存储着色器为每一个变量都使用一致的内部变量命名规则和相同的属性值。里面列出了这些属性:bash
标识符 | 描述 |
---|---|
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
值。GLShaderManager
类就能够为咱们完成这个操做。UseStockShader
函数会选择一个存储着色器并提供这个着色器的Uniform
值,这些工做经过一次函数调用就能完成:架构
GLShaderManager::UseStockShader(GLenum shader, ... ...);
复制代码
这个函数根据咱们选择的着色器从堆栈中提取正确的参数,这些参数就是特定着色器要求的Uniform值。框架
单元着色器只是简单的使用默认的笛卡尔坐标系。全部片断都是用的同一种颜色,几何图形为实心和未渲染的。这种着色器只使用一个属性GLT_ATTIBUTE_VERTEX
。vColor
参数包含了要求的颜色。函数
//参数一:着色器属性
//参数二:须要的颜色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
复制代码
平面着色器将统一着色器进行了扩展,容许为几何图形变换指定一个4 * 4变换矩阵。典型状况下这是一种左乘模型视图矩阵和投影矩阵,也就是咱们常说的“模型视图投影矩阵”。这种着色器只是用一个属性GLT_ATTIBUTE_VERTEX
。工具
//参数一:着色器属性
//参数二:容许变化的4*4矩阵
//参数三:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);
复制代码
这种着色器惟一的Uniform值就是在几何图形中应用的变换矩阵。GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_COLOR
在这种着色器中都会使用。颜色值将被平滑得插入顶点之间(这就是所谓的平滑着色)。ui
//参数一:着色器属性
//参数二:容许变化的4*4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
复制代码
这种着色器通俗点讲,就是从观察者的方向发出一个平行光所产生的效果。会使对象产生阴影和光照的效果。这里须要模型视图矩阵、投影矩阵和做为基本色的颜色值等Uniform值。所需的属性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_NORMAL
。spa
//参数一:着色器属性
//参数二:模型视图矩阵
//参数三:投影矩阵
//参数四:颜色值
GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);
复制代码
这个着色器跟默认光源着色器比较像,可是点光源着色器的光源位置是特定的。这种着色器接受4个Uniform值,即模型视图矩阵、投影矩阵、视图坐标系中的光源位置和对象的基本漫反射颜色。所需的属性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_NORMAL
。code
//参数一:着色器属性
//参数二:模型视图矩阵
//参数三:投影矩阵
//参数四:视点坐标光源位置
//参数五:颜色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
复制代码
着色器经过给定的模型视图投影矩阵,使用绑定到nTextureUnit指定的纹理单元的纹理对几何图形进行变换。片断颜色是直接从纹理样本中直接获取的。所需的属性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_NORMAL
。orm
//参数一:着色器属性
//参数二:投影矩阵
//参数三:须要相乘的纹理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
复制代码
这种着色器将一个基本色乘以一个取自纹理单元的TextureUnit的纹理。所需的属性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_TEXTURE0
。
//参数一:着色器属性
//参数二:投影矩阵
//参数三:颜色
//参数四:须要相乘的纹理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
复制代码
这种着色器将一个纹理经过漫反射照明计算进行调整(相乘),光线在视觉空间中的位置是给定的。这种着色器接受5个Uniform值,即模型视图矩阵、投影矩阵、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。所需的属性有GLT_ATTIBUTE_VERTEX
、GLT_ATTIBUTE_TEXTURE0
和GLT_ATTIBUTE_NORMAL
。
//参数一:着色器属性
//参数二:投影矩阵
//参数三:视图空间中的光源位置
//参数四:几何图形的基本色
//参数五:将要使用的纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit);
复制代码