2014-03-01 108 views
1

我正在关注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矩阵是定义模型渲染位置的矩阵,但我似乎无法改变渲染模型的位置,而没有修改矩阵(这是合理的)。

回答

1

通常,每个“相机”使用一个投影和一个视图矩阵。视图矩阵基本上表示相机的位置和方向,并且投影矩阵以某种方式表示相机的属性(视场,方位等,像某个真实相机的“镜头”,但不能伸展这太类比了)。

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

世界coordiante系统并不是完全需要。对于最终图像而言,最重要的是对象如何相对于相机放置 - 即ModelView进入图片 - 作为模型的组合和视图转换,直接从对象空间转到相机相关的眼睛空间,绕过任何“世界空间”完全。

就您而言,您甚至可以将其与投影矩阵进一步结合,因此您可以直接从对象空间切换到剪辑空间。

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

模型矩阵是做什么的?作者说现在它是一个身份矩阵,但如果我改变它来说100,没有任何反应!

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

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

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

那么它实际上不会导致任何observeable变化。你会得到不同的剪辑空间坐标,但差异会互相抵消,而生成的图像将会是相同的。这是由于同质坐标的工作原理,完全是另一回事。