我们使用模型视图投影矩阵的目的是什么? 为什么着色器需要模型视图投影矩阵?
答案 0 :(得分:187)
模型,视图和投影矩阵是三个独立的矩阵。模型从对象的本地坐标空间映射到世界空间,从世界空间到相机空间的视图,从相机到屏幕的投影。
如果你全部三个,你可以使用一个结果从对象空间到屏幕空间一直映射,使你能够计算出你需要传递到传入的可编程管道的下一个阶段的内容顶点位置。
在旧的固定功能管道中,您将模型和视图一起应用,然后使用从它们派生的另一个结果计算出光照(使用一些修正,以便即使您应用了一些缩放,例如法线仍然是单位长度到对象),然后应用投影。您可以看到OpenGL中反映的内容,它永远不会分离模型和视图矩阵 - 将它们保持为单个模型视图矩阵堆栈。因此,您有时也会看到在着色器中反映出来。
因此:着色器模型视图投影矩阵经常被着色器用于从为每个模型加载的顶点到屏幕的映射。这不是必需的,有很多方法可以实现相同的功能,它只是通常的,因为它允许所有可能的线性变换。因此,在固定管道世界中,较小的组合版本也是常态。
答案 1 :(得分:7)
因为矩阵很方便。矩阵有助于转换相对于不同空间的位置/方向(空间可以由3个垂直轴和原点定义。)
以下是@ legends2k在评论中指定的书中的一个例子。
Cartesia的居民使用他们所在城市的地图 在镇中心和沿着轴线方向非常合理地居中 指南针的基点。阅读障碍的居民使用a 他们的城市地图,坐标以任意点为中心 并且轴可能在任意方向上运行 当时一个好主意。这两个城市的市民都很开心 与他们各自的地图,但国家运输工程师 分配了为第一条高速公路之间运行预算的任务 Cartesia和Dyslexia需要一张显示两个城市细节的地图, 因此引入了优越的第三个坐标系 对他而言,虽然不一定对其他人。
这是另一个例子,
假设您使用世界坐标在游戏中创建了一个带有顶点位置的汽车对象。假设你必须在完全不同的世界中的其他游戏中使用同一辆车,你必须再次定义位置,计算将变得复杂。这是因为你必须再次计算车内窗户,引擎盖,车灯,车轮等的位置。
请参阅this视频,了解模型,视图和投影的概念。 (强烈推荐)
然后看this以了解世界中的顶点如何表示为矩阵以及它们如何被转换。