为啥是模型视图矩阵?

Posted

技术标签:

【中文标题】为啥是模型视图矩阵?【英文标题】:why the modelview matrix?为什么是模型视图矩阵? 【发布时间】:2014-04-25 10:30:00 【问题描述】:

如果这是一个愚蠢的问题,我很抱歉,但我一直想知道为什么有这么多示例顶点着色器,其中包含模型视图矩阵。在我的程序中,我有以下情况:

投影矩阵几乎不会改变(例如,在调整应用窗口大小时)并且它是独立的,这很好, 模型矩阵经常变化(例如模型上的变换), 视图矩阵也经常变化(例如,改变观察方向、四处走动……)。

如果我要在顶点着色器中使用模型视图矩阵,我必须在 CPU 上执行矩阵乘法并上传单个矩阵。另一种方法是上传模型和视图矩阵并在 GPU 上进行乘法运算。关键是,视图矩阵不一定与模型矩阵同时发生变化,但如果使用模型视图矩阵,则必须执行 CPU 乘法和上传,只要它们中的任何一个发生变化。为什么不使用单独的视图矩阵和模型矩阵来实现快速 GPU 乘法,并可能大致相同数量的 GPU 矩阵上传?

【问题讨论】:

当我想减少 javascript 中矩阵数学的数量时,我已经在 webgl 中完成了此操作,因此在某些情况下它是有意义的。 【参考方案1】:

因为在顶点着色器中将矩阵相乘会使 GPU 对进入其中的每个顶点进行完整计算(请注意,最近的 GLSL 编译器会检测到乘积在所有顶点上是一致的,并且可能会移开计算GPU 到 CPU)。

此外,在执行单个 4×4 矩阵计算时,CPU 的性能实际上优于 GPU,因为没有数据传输和命令队列开销。

GPU 计算的一般规则是:如果它在所有顶点上是一致的,并且您可以轻松地在 CPU 上进行预计算,那么就在 CPU 上进行。

【讨论】:

【参考方案2】:

因为每个模型只需要计算一次 MV 矩阵。如果您将两者分别上传到 GPU,它将对每个顶点进行计算。

现在可能是,如果您受 CPU 限制,那么它仍然是性能提升,因为即使您添加(可能)1000 次额外的矩阵乘法,您也会将它们推离 CPU,但我认为一种优化而非标准技术。

【讨论】:

驱动程序可能会优化着色器中的乘法,并在每次绘制调用时在 CPU 中执行一次 @ratchetfreak:是的,这是可能的,一些司机会这样做。但是,如果您的最终目标是性能,则不应依赖它。

以上是关于为啥是模型视图矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

GLM 视图矩阵导致模型矩阵无效

使用 glm 根据光标位置旋转模型视图矩阵

为啥我必须计算模型矩阵的逆矩阵的转置才能计算反射纹理的法线?

为啥 Android 需要视图模型工厂?

gluUnproject 返回 0,似乎与模型视图矩阵有关

为啥 Keras (Tensorflow 2.0) 模型在绘制时不包含矩阵乘法的变量?