【问题标题】:Multiple modelview matrices多个模型视图矩阵
【发布时间】:2014-03-01 13:53:26
【问题描述】:

我正在关注 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 矩阵(这是有道理的),我似乎无法更改模型的渲染位置。

【问题讨论】:

    标签: c++ opengl matrix


    【解决方案1】:

    通常,每个“相机”使用一个投影和一个视图矩阵。视图矩阵基本上代表了相机的位置和方向,而投影矩阵则代表了相机的属性(视野、纵横比等)在某种程度上就像一个真实相机的“镜头”,但不要拉伸这个比喻太过分了)。

    模型矩阵通常用于将模型放置在某个全局“世界坐标系”中。所以,每个对象都需要一个模型矩阵,这样每个对象都可以独立放置。

    完全不需要世界坐标系统。对生成的图片重要的是对象如何相对于相机放置 - 即 ModelView 进入图片 - 作为模型的组合和视图变换,直接从对象空间到一些相机相关的眼睛空间,绕过任何“世界空间”。

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

    如您所见,MVP 矩阵需要更改,如果它组成的任何不同矩阵确实发生了变化。理论上,您可以预先计算每个对象的 MVP - 但这通常不会这样做,因为相机是可移动的,并且所有这些 MVP 矩阵无论如何都必须重新计算 - 这里没有太多可保存的。因此,通常在绘图调用之前将这些矩阵分开并将它们相乘。

    模型矩阵有什么作用?作者说它现在是一个单位矩阵,但是如果我将其更改为 100,则不会发生任何事情!

    这甚至意味着什么,“将矩阵更改为 100”?从上面的代码sn-ps可以看出你的模型矩阵确实被使用了并且影响了MVP矩阵。所以改变它应该有效果——当然取决于你改变了什么。如果你只是换行

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

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

    那么它实际上不会导致任何可观察到的变化。您将获得不同的剪辑空间坐标,但差异会相互抵消,并且生成的图像将是相同的。那是由于齐次坐标的工作原理,完全是另一回事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多