在使用glLoadMatrix加载MVP矩阵时,必须将哪个矩阵堆栈设置为目标

时间:2017-04-19 19:01:33

标签: opengl matrix camera

假设我使用以下从GLM网站获取的代码来设置相机:

   glm::mat4 camera(float Translate, glm::vec2 const & Rotate)
   {
       glm::mat4 Projection = glm::perspective(glm::radians(60.0f),float(width())/float(height()), 0.1f, 100.f);
       glm::mat4 View = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate));
       View = glm::rotate(View, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));
       View = glm::rotate(View, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));
       glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
       return Projection * View * Model;
   }

当我使用上述函数产生的矩阵时,我必须定位哪个矩阵堆栈?我应该使用

glMatrixMode(GL_PROJECTION);

glMatrixMode(GL_MODELVIEW);

或者我应该只加载生成的矩阵?

2 个答案:

答案 0 :(得分:1)

都不是。 Projection矩阵进入GL_PROJECTIONView*Model进入GL_MODELVIEW。当然,这仅适用于固定功能管道。如果使用着色器,则完全取决于您,特别是您如何编写着色器。

答案 1 :(得分:1)

There's some issues regarding normals and lighting behind the separation of the projection and modelview matrices

  

不幸的是,当有人去拍摄他们的相机时   进入GL_PROJECTION矩阵(而不是进入GL_MODELVIEW所在的位置)   属于) - 后果相当微妙:

     
      
  • 光照:OpenGL必须将顶点法线转换为世界坐标空间 - 也就是说没有透视效果 -   但随着相机位置的影响。因此,只有   GL_MODELVIEW矩阵应用于法线的照明。如果你放   相机转换成GL_PROJECTION矩阵然后你的灯光   会错的。然而,有些人自己照明 - 而且在任何情况下   例如,它可能是一个您可能没有注意到的细微错误   先前。
  •   
  • 雾:OpenGL必须弄清楚每个顶点离相机的距离。透视效果再一次与此无关   计算 - 因此不使用GL_PROJECTION矩阵。如果你把   相机转换成GL_PROJECTION矩阵然后你的雾化将   是错的。由于很少有人使用雾,很多人都有错误和   不知道。
  •   
  • TexGen:由于OpenGL使用眼点来计算一些TexGen纹理坐标,如果相机位置全部混淆了   根据投影信息,您最终会得到一些漂亮的信息   奇怪的纹理坐标。 (感谢Brian Sharp在3Dfx的支持   指出这一个)
  •   
  • Z-buffer:我相信(但没有证明)拧紧的GL_PROJECTION矩阵可能会导致你的Z值被计算出来   奇怪的。这可能只表现为缺乏Z.   在某些情况下的精确度 - 所以你可能不会注意到 - 而且它   可能没关系。
  •