03-统一变量
4.2 统一变量
要想渲染一个场景以使它看起来是3D的,需要构建适当的变换矩阵,例如第3章中描述的那些,并将它们应用于模型的每个顶点。在顶点着色器中应用所需的矩阵运算是最有效的,并且习惯上会将这些矩阵从C++/OpenGL应用程序发送给着色器中的统一变量。
使用“uniform”关键字在着色器中声明统一变量。以下示例声明了用于存储模型-视图和投影矩阵的变量,足够我们的立方体程序使用:
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
关键字“mat4”表示这些是4×4矩阵。这里我们将用来保存模型-视图矩阵的变量命名为mv_matrix,并将用来保存投影矩阵的变量命名为proj_matrix。因为3D变换是4×4的,因此mat4是GLSL着色器统一中常用的数据类型。
将数据从C++/OpenGL应用程序发送到统一变量需要执行以下步骤:(a)获取统一变量的引用;(b)将指向所需数值的指针与获取的统一引用相关联。在我们的立方体例子中,假设链接的渲染程序保存在名为“renderingProgram”的变量中,以下代码行表示,我们要把模型-视图和投影矩阵发送到两个统一变量mv_matrix和proj_matrix中去:
mvLoc = glGetUniformLocation(renderingProgram,"mv_matrix"); // 获取着色器程序中统一变量的位置
projLoc = glGetUniformLocation(renderingProgram,"proj_matrix");
glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvMat)); // 将矩阵数据发送到统一变量中
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(pMat));
在上面的例子中,我们假设已经利用GLM工具来构建模型-视图和投影矩阵变换mvMat和pMat,稍后将会更详细地讨论。它们是mat4类型(GLM的一个类)的。GLM函数调用value_ptr()返回对矩阵数据的引用,glUniformMatrix4fv()需要将这些矩阵值传递给统一变量。