当前位置:嗨网首页>书籍在线阅读

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()需要将这些矩阵值传递给统一变量。