在OpenGL 3.1之前,只有一种固定管线着色器,而在3.1之后被启用,取而代之的是可编程管线,但是理解固定管线着色器,熟悉起渲染流程,对我们图形图像开发是有很大帮助的。而且固定管线是封装好的,不需要考虑渲染中到底是顶点着色器还是片元着色器。只需要传递存储着色器类型、所需的参数即可。当然,OpenGL语法对于存储着色器的调用方法使用了可变参数,不同类型的着色器对应参数个数不同。
下面总结几种常见的固定管线着色器的相关参数及使用。
GLint UseStockShader(GLT_STOCK_SHADER nShaderID, ...);
enum GLT_STOCK_SHADER {
GLT_SHADER_IDENTITY = 0,
GLT_SHADER_FLAT,
GLT_SHADER_SHADED,
GLT_SHADER_DEFAULT_LIGHT,
GLT_SHADER_POINT_LIGHT_DIFF,
GLT_SHADER_TEXTURE_REPLACE,
GLT_SHADER_TEXTURE_MODULATE,
GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
GLT_SHADER_TEXTURE_RECT_REPLACE,
GLT_SHADER_LAST
};
GLfloat vColor[] = {1.0,0.0,0.0,1.0f};
简单使用默认笛卡尔坐标系,坐标范围为(-1.0, 1.0),所有片段都应用同一种颜色。需要设置存储着色器一个属性:GLT_ATTRIBUTE_VERTEX(顶点分量)。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
参数1:着色器类型
参数2:颜色参数
在绘制图形时,可以应用变换(模型/投影变化)。可以为几何图形变化指定一个4*4变换矩阵,该矩阵被称为“模型视图投影矩阵”。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
参数1:着色器类型
参数2:4*4变换矩阵
参数3:颜色参数
在绘制图形时,可以应用该着色器,将颜色平滑的插入到顶点之间,进行平滑着色。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_COLOR(颜色分量) 2个属性。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_SHADED,GLfloat vColor[4]);
参数1:着色器类型
参数2:颜色参数
在绘制图形时,可以应用该着色器,为图形产生阴影和光照效果。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_NORMAL(表面法线)。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1:着色器类型
参数2:模型视图矩阵
参数3:投影矩阵
参数4:颜色参数
在绘制图形时,可以应用该着色器,为图形产生阴影和光照效果。与默认光源着色器非常类似,区别在与点光源着色器可以指定光源位置。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_NORMAL(表面法线)。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1:着色器类型
参数2:模型视图矩阵
参数3:投影矩阵
参数4:视点坐标光源位置
参数5:颜色参数
在绘制图形时,可以应用该着色器,通过给定的模型视图投影矩阵,使用纹理单元来进行填充,其每个像素点的颜色是从纹理中获取。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_NORMAL(表面法线)。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
参数1:着色器类型
参数2:模型视图矩阵
参数3:纹理单元
在绘制图形时,可以应用该着色器,通过给定的模型视图投影矩阵,将一个基本色乘以一个取自纹理单元nTextureUnit的纹理,将颜色与纹理进行混合后填充到片段中。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_TEXTURE0(纹理坐标)。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数1:着色器类型
参数2:模型视图矩阵
参数3:颜色参数
参数4:纹理单元
在绘制图形时,可以应用该着色器,通过给定的模型视图投影矩阵,将一个纹理通过漫反射照明计算进行调整(相乘)。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_TEXTURE0(纹理坐标)、GLT_ATTRIBUTE_NORMAL(表面法线)。
使用方法:
shaderManager.UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
参数1:着色器类型
参数2:模型视图矩阵
参数3:视觉空间中的光源位置
参数4:几何图形的基本色
参数5:需要处理的纹理单元