假设我使用以下从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);
或者我应该只加载生成的矩阵?
答案 0 :(得分:1)
都不是。 Projection
矩阵进入GL_PROJECTION
,View*Model
进入GL_MODELVIEW
。当然,这仅适用于固定功能管道。如果使用着色器,则完全取决于您,特别是您如何编写着色器。
答案 1 :(得分:1)
不幸的是,当有人去拍摄他们的相机时 进入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. 在某些情况下的精确度 - 所以你可能不会注意到 - 而且它 可能没关系。