OpenGL合并转换
OpenGL合并转换简介
在上一课中,我们发现了一些转换,这些转换在 3D 空间中灵活地移动对象。我们还有许多要研究的(相机控制和透视投影),但正如您可能已经猜到的,我们需要结合转换。在大多数情况下,您希望缩放对象以匹配实际纵横比、旋转以获得正确的方向、移动到某处等。为了执行上述转换,我们需要将第一个转换矩阵乘以向量,然后将第二个矩阵乘以第一个操作的结果,然后将第三个矩阵乘以先前计算的结果。这将继续,直到所有矩阵乘以向量。最简单的方法就是将所有转换矩阵提供到着色器,并让它们成乘。但是,这并不有效,因为所有矩阵对于所有顶点都是相同的,只会改变位置向量。幸运的是,线性代数提供了一套规则,使我们的生活更轻松。它告诉我们,如果给出一组矩阵M0…Mn和矢量 V, 然后公平地说: Mn* Mn-1* … * M0* V = (Mn* Mn-1* … * M0) * V 所以,如果你计数: N = Mn* Mn-1* … * M0然后: Mn* Mn-1* … * M0* V = N * V
这意味着我们可以计算 N 乘法,然后将其作为单一变量发送到着色器,在其中,它将对每个顶点进行乘法。因此,GPU 将仅计算每个顶点每个向量的一个矩阵乘法。
在 N 中,矩阵应按什么顺序排列?首先要记住的是,向量乘以右侧的矩阵(在我们的例子中 - M0).然后,向量由每个矩阵从右侧到左侧转换。在 3D 图形中,对象通常首先缩放,然后旋转,然后移动,转换相机值,最后找到 2D 投影。

本文介绍了OpenGL中如何高效地组合多个转换矩阵,避免重复计算。通过线性代数的规则,可以预先计算出所有转换的乘积矩阵,然后在着色器中一次性应用到每个顶点。内容包括转换顺序的重要性,例如先旋转后平移,以及如何通过管道类来封装和管理这些转换。同时,展示了源代码实现,包括矩阵乘法和转换初始化的细节。
订阅专栏 解锁全文
2524

被折叠的 条评论
为什么被折叠?



