矩阵乘法与glsl中的向量

时间:2014-07-06 08:11:35

标签: webgl

参考http://webglfundamentals.org/webgl/lessons/webgl-3d-orthographic.html 在矢量着色器中,有mat4vec4的乘法。

attribute vec4 a_position;

uniform mat4 u_matrix;

void main() {

  // Multiply the position by the matrix.

  gl_Position = u_matrix * a_position;

}

如何将4 * 4矩阵与1 * 4矩阵相乘? 不应该是gl_Position = a_position * u_matrix;

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

From the GLSL spec 1.017

5.11矢量和矩阵运算

除少数例外情况外,操作是按组件划分的。当运算符对向量或矩阵进行操作时,它以向分量方式独立地在向量或矩阵的每个分量上运行。

...矩阵乘以向量,向量乘以矩阵,矩阵乘以矩阵。这些不是分量运算,而是执行正确的线性代数乘法。它们需要操作数的大小匹配。

vec3 v, u;
mat3 m;

u = v * m;

相当于

u.x = dot(v, m[0]); // m[0] is the left column of m
u.y = dot(v, m[1]); // dot(a,b) is the inner (dot) product of a and b
u.z = dot(v, m[2]);

u = m * v;

相当于

u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z;
u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z;
u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;

答案 1 :(得分:0)

http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf https://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations#Operators

假设为 3x3 矩阵:

m_of_math = 
    m11, m12, m13
    m21, m22, m23
    m31, m32, m33

向量是列向量:

v = [x
     y
     z]

glsl 将矩阵存储为主要列,因此初始化为:

mat3 m = mat3(m11, m21, m31, 
              m12, m22, m23,
              m13, m23, m33)

作为列访问:

m[0] = (m11, m21, m31)
       //first column of matrix
       //first row of stored memory

什么时候做操作,忘记存储顺序, 例如:

m * v:

m * v => matrix of math * vector

v * m:

v * m => v^T * m = (M^T * v)^T
      => transpose of matrix of math * vector

m1 * m2:

m1 * m2 = matrix 1 of math * matrix 2 of math