首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用glLoadMatrix加载MVP矩阵时必须设置哪个矩阵堆栈为目标

用glLoadMatrix加载MVP矩阵时必须设置哪个矩阵堆栈为目标
EN

Stack Overflow用户
提问于 2017-04-19 19:01:33
回答 2查看 133关注 0票数 0

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

代码语言:javascript
复制
   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;
   }

当我使用上述函数产生的矩阵时,我必须针对哪个矩阵堆栈?我该用吗

代码语言:javascript
复制
glMatrixMode(GL_PROJECTION);

代码语言:javascript
复制
glMatrixMode(GL_MODELVIEW);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-19 20:33:21

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-19 21:11:26

投影矩阵和模型视图矩阵的分离背后有一些关于法线和照明的问题

不幸的是,当有人把相机转换成GL_PROJECTION矩阵(而不是它所属的GL_MODELVIEW )时,其后果是相当微妙的:

  • 照明: OpenGL必须将顶点法线转换成世界坐标空间--也就是说,没有透视的影响--但是有相机位置的影响。因此,只有GL_MODELVIEW矩阵适用于照明的法线。如果你把相机转换成GL_PROJECTION矩阵,那么你的照明将是错误的。然而,有些人做他们自己的照明-在任何情况下,这可能是一个微妙的错误,你可能没有注意到。
  • 雾: OpenGL必须知道每个顶点离摄像机有多远。同样,透视效果与此计算无关,因此不使用GL_PROJECTION矩阵。如果你把相机转换成GL_PROJECTION矩阵,那么你的雾气就错了。由于很少人使用雾,许多人有错误而不知道它。
  • TexGen:由于OpenGL使用眼点来计算一些文本纹理坐标,如果摄像机的位置与投影信息相混淆,那么最终会得到一些非常奇怪的纹理坐标。(感谢3 3Dfx公司的布赖恩·夏普( Brian )指出这一条)
  • Z-缓冲器:我相信(但没有证据)一个错误的GL_PROJECTION矩阵会导致你的Z值被奇怪地计算出来。在某些情况下,这很可能只表现为缺乏Z精度--所以您可能没有注意到--这可能并不重要。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43504024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档