《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,
- GL_TRUE表示传递的矩阵是row-major,GL_FALSE表示column-major。在C/C++中,使用二维数组表示矩阵,内存排布天然是row-major的。
- &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裁剪。