在OpenGL核心框架中,并没有提供任何内建渲染管线,在提交一个几何图形进行渲染之前,必须制定一个着色器。目前这些存储着色器由GLTools的C++类GLShaderManager进行管理,这些能够满足通常的渲染的基本要求。而更高级的自定义着色器不在本章讨论的范畴之内,后续会探讨
GLShaderManager的使用
- 在使用前必须进行初始化
GLShaderManager shaderManager
shaderManager.InitializeStockShaders();
Uniform值
- 要对几何图形渲染,需要为对象递交属性矩阵
- 想要得到我们期望的结果,必须提供程序的Uniform值绑定到想要使用的着色器程序上
- GLShaderManager类可以帮我们完成以上工作
- UseStockShader函数会选择一个存储着色器并提供这个着色器的Uniform值,通过一次函数调用就能完成
GLShaderManager::UseStockShader(GLT_STOCK_SHADER nShaderID, ...);
注意:在C语言(或者C++语言)中,...表示函数接受一个可变的参数数量
固定着色器
单位着色器
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
注意:
- OpenGL坐标系范围(-1.0~1.0),所有片段都应用同一种颜色
平面着色器
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16],GLfloat vColor[4]);
注意:
- 适合模型视图矩阵,投影矩阵(4 x 4变换矩阵,颜色)
上色着色器
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
注意:
- 应用在变换矩阵,颜色值被平滑的插入顶点之间(称为平滑着色)(4 x 4变换矩阵,颜色)
默认光源着色器
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
注意:
- 应用模型视图矩阵,投影矩阵。这种着色器使对象产生阴影和光照的效果(模型4 x 4矩阵,投影4 x 4矩阵,颜色)
点光源着色器
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
注意:
- 跟默认光源着色器类似。模型视图矩阵,投影矩阵,视点坐标系中的光源位置和对象的基本漫反射颜色
纹理替换矩阵着色器
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvMatrix[16],GLint nTextureUnit);
注意:
- 模型视图投影矩阵,使用绑定到nTextureUnit指定的纹理单元的纹理对几何图形进行变换(模型4 x 4矩阵,纹理单元)
纹理调整着色器
GLShaderManager::UseStockShader(GLT_SHADER_c_MODULATE, GLfloat mvMatrix[16],GLfloat vColor,GLint nTextureUnit);
注意:
- 将一个基本色乘以一个取自纹理单元nTextureUnit的纹理(模型4 x 4矩阵,颜色,纹理单元)
纹理光源着色器
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix,GLfloat pMatrix[16],GLfloat vLightPos[3],GLFloat vBaseColor[4],GLint nTextureUnit);
注意:
- 应用变换矩阵(模型,投影),这种着色器将一个通过慢反射照明计算进行调整(相乘),光线在视觉空间中的位置给定的(模型视图矩阵,投影矩阵,视觉空间中的光源位置,几何图形的基本色和将要使用的纹理单元)
网友评论