矩阵乘法与 glsl 中的向量

use*_*533 3 webgl

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

attribute vec4 a_position;

uniform mat4 u_matrix;

void main() {

  // Multiply the position by the matrix.

  gl_Position = u_matrix * a_position;

}
Run Code Online (Sandbox Code Playgroud)

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

有人可以解释一下吗?

gma*_*man 11

来自 GLSL 规范 1.017

5.11 向量和矩阵运算

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

...矩阵乘以向量,向量乘以矩阵,以及矩阵乘以矩阵。这些不按组件操作,而是执行正确的线性代数乘法。它们要求操作数的大小匹配。

vec3 v, u;
mat3 m;

u = v * m;
Run Code Online (Sandbox Code Playgroud)

相当于

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]);
Run Code Online (Sandbox Code Playgroud)

u = m * v;
Run Code Online (Sandbox Code Playgroud)

相当于

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;
Run Code Online (Sandbox Code Playgroud)

或者也

u = v.x * m[0] + v.y * m[1] + v.z * m[2];
Run Code Online (Sandbox Code Playgroud)