为什么OpenGL使用列主序矩阵顺序?

6

我知道什么是列优先(column-major)以及如何处理它。但问题是,在此实现系统的目的是什么?是否存在任何技术或概念上的限制?


2
glUniformMatrix*有一个参数用于告诉OpenGL使用哪种布局。因此,列主序和行主序都是可行的。 - BDL
1个回答

10

通过在内存中这样排列矩阵,您可以立即访问列向量(显然)。当使用右关联乘法(即OpenGL和大多数其他图形系统用于允许轻松链接变换的方式)时,矩阵的列向量就是矩阵映射到的坐标系的基向量。

对于其他图形操作(如设置镜像平面、广告牌等),方便地访问这些基向量非常有用。

简而言之:进行图形编程时,通常需要使用转换的基向量进行其他操作。如果使用右关联乘法,则基向量为转换矩阵的列。


然而,这个SO问题表明,在内部存储行主格式更有利于缓存:https://dev59.com/6Kbja4cB1Zd3GeqPjJwG - Aaron Franke
@AaronFranke:是的,对于较大的矩阵,缓存效应很快就会显现出来。然而,在图形编程中处理的微不足道的4×4矩阵通常完全适合现代CPU的向量寄存器,因此通常发生的情况是,首先整个矩阵作为一个整体被预取,然后计算完全在寄存器上进行。当使用-O2或-O3编译时,这些天的编译器足够聪明,可以对我的linmath.h执行这个操作。 - datenwolf
@AaronFranke。缓存友好性取决于您如何使用数据。如果您主要按列处理,请使用列优先顺序。如果您主要按行处理,请使用行优先顺序。 - user877329

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接