《OGL dev》Etay Meiri Tutorial 06 - Translation Transformation 笔记

想要不使用向量加法,而使用矩阵乘法实现平移,使用齐次坐标是很常见的做法。

齐次坐标的第四个分量,通常称为w。当w为1时表示点,当w为0时表示向量。因为点可以被移动,而向量不行。

  • 当w为1时,乘以平移矩阵,点被平移。当w为0时,乘以平移矩阵,向量不变。

glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &World.m[0][0]);,将4x4矩阵World赋值给索引为gWorldLocation的uniform变量。

  1. 1表示矩阵的数量为1,
  2. GL_TRUE表示传递的矩阵是row-major,GL_FALSE表示column-major。在C/C++中,使用二维数组表示矩阵,内存排布天然是row-major的。
  3. &World.m[0][0]表示矩阵的首地址。
  • glUniform*函数还存在2x2、3x3、3x2、2x4、4x2、3x4和4x3的矩阵版本。

uniform mat4 gWorld;,在shader中声明一个4x4矩阵的uniform变量gWorld,mat4表示4x4矩阵。

与从应用传递齐次坐标的顶点相比,更推荐的做法是在shader中将坐标变换到齐次坐标系。因为w分量总是1。vec4(Position, 1.0)可以轻易实现这件事。

例程中,移动中的三角形在normalized box外的顶点会被clipper裁剪。