什么是行优先和列优先?
故名思意,当我们表示一个矩阵的时候把行放在前面就是行优先,把列放在前面就是列优先。
比如 一个矩阵[m][n] , 表示为 m行n列矩阵,表示为行优先,当表示为 m 列n行的时候就是表示列优先。
一个三维空间中的向量p分别沿着x方向y方向z方向上分别平移为a,b,c距离,用行优先的平移矩阵表示为
,用一个列优先的平移矩阵表示为
,两个矩阵的关系也不难看出其实是互为转置的。
行优先和列优先表示为矩阵和向量相乘的时候是什么样子的呢?
以向量p(a,b,c,1) 平移举例子:
行优先 (x,y,z,0) * =(x +a, y+b,c+z,0);
列优先表示 *
=
行优先和列优先用c++代码中怎么表示呢?
答案是写法都一样
以上面的矩阵表示的c++代码举例,都可以表示为 float mat[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{a,b,c,1}};行优先表示时候,第 1行为{1,0,0,0} 。从列优先表示第 1列为
表示为行优先的时候mat[3]也就是第三行为(a,b,c,1),表示为列优先的时候表示. 所以 不管行优先还是列优先都不会 影响c++ 代码中的表示。区别只是在于 c++ 代码表示的意义变了。原先的表示的行变成表示的列了。
提到行优先和列优先就不得不说一下dx 与 opengl 区别了,dx 中把矩阵数据提交给gpu,由hlsl 着色器处理,opengl 中把数据提交给gpu由 glsl着色器处理, dx 的c++内存布局处理是按照行优先进行处理的,opengl 的c++布局是按照列优先进行处理的,而hlsl默认内存布局方式也是按照列向量进行处理的,所以会看到 dx把数据传递到gpu端时候会进行转置,而 glsl 中默认内存布局方式 是按照列向量进行处理,传递数据时候不需要进行转置。