多个模型视图矩阵

时间:2014-03-01 13:53:26

标签: c++ opengl matrix

我正在关注opengl-tutorial.org上的OpenGL教程,在教程4中,作者提出了将两个“对象”发送给OpenGL,我们之前只渲染过一个对象。具体来说,他问这个:

  

在不同位置绘制立方体和三角形。您需要生成2个MVP矩阵,在主循环中进行2次绘制调用,但只需要1个着色器。

我们像这样定义MVP矩阵:

GLuint MatrixID = glGetUniformLocation(programID, "MVP");
glm::mat4 Projection = glm::perspective(90.0f, 4.0f / 3.0f, 0.1f, 100.0f);

// Camera matrix
glm::mat4 View = glm::lookAt(
                            glm::vec3(0,0,3), // Camera is at (4,3,3), in World Space
                            glm::vec3(0,0,0), // and looks at the origin
                            glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
                       );
glm::mat4 Model = glm::mat4(1.0f);
glm::mat4 MVP = Projection * View * Model; 

现在我明白每个对象只使用一个MVP矩阵。但我有几个问题。

  1. 如何为每个对象创建MVP矩阵?我是否必须为每个对象重新创建视图和模型矩阵(IE为每个对象指定一个新矩阵)?

  2. 我认为glm::lookAt被用作各种“相机”,所以我不应该为每个对象创建一个新的“相机”,我应该吗?

  3. Model矩阵有什么作用?作者说它现在是一个身份矩阵,但是如果我把它改为100,那么什么都没发生!我认为Model矩阵是定义模型渲染位置的矩阵,但我似乎无法在不修改View矩阵(有意义)的情况下改变模型的渲染位置。 / p>

1 个答案:

答案 0 :(得分:2)

通常,每个“相机”使用一个投影和一个视图矩阵。视图矩阵基本上代表相机的位置和方向,投影矩阵代表相机的属性(视野,方面等,在某种程度上像真实相机的“镜头”,但不拉伸类比太远了。)

模型矩阵通常用于将模型放置在某个全局“世界协调系统”中。因此,每个对象需要一个模型矩阵,因此每个对象都可以独立放置。

根本不需要世界协调制度。对结果图片来说最重要的是对象相对于相机的放置方式 - 即ModelView进入图片 - 作为模型和视图变换的组合,直接从对象空间到相机相对的眼睛空间,绕过任何“世界空间”完全。

在您的情况下,您甚至可以将其与投影矩阵进一步结合使用,因此您可以直接从对象空间转到剪辑空间。

如您所见,MVP矩阵需要在其组成的任何不同矩阵发生变化时进行更改。理论上你可以预先计算每个对象的MVP - 但通常不会这样做,因为摄像机是可移动的,所有那些MVP矩阵都必须重新计算 - 这里没有太多要保存的东西。因此,人们通常会将这些矩阵分开,并在绘制调用之前将它们直接相乘。

  

模型矩阵有什么作用?作者说它现在是一个单位矩阵,但是如果我把它改为100则没有任何反应!

这甚至意味着什么,“将矩阵更改为100”?从上面的代码片段可以看出,您的模型矩阵确实被使用并影响MVP矩阵。因此,改变它应该会产生影响 - 当然,取决于你改变了什么。如果您刚刚更改了行

glm::mat4 Model = glm::mat4(1.0f);

glm::mat4 Model = glm::mat4(100.0f);
然后它实际上不会导致任何可观察到的变化。您将获得不同的剪辑空间坐标,但差异将相互抵消,并且生成的图像将是相同的。这可能是由于同质坐标的工作原理,完全是另一回事。