矩阵变换知识点:Model View Projection - MartinRGB/GLES30_ProgrammingGuide_NDK GitHub Wiki
理解 MVP 矩阵
顶点着色器的位置输入为物体坐标,而顶点着色器输出位置应该为裁剪坐标
(in) vec4 a_postion ------> (out) vec4 gl_Position
因此,要获取 3 个变换矩阵的乘积: 模型矩阵(Model)
、视图矩阵(View)
、投影矩阵(Projection)
- 第一步,构建,Model-View Matrix,这里有一个链接,非常清晰的给出了
ModelView Matrix
的概念。
模型矩阵 : 将顶点坐标转换为世界坐标系(笛卡尔 3D 坐标系)
视图矩阵 : 将世界坐标转换为摄像机坐标 (眼睛坐标)
ESMatrix modelview;
// 在modelView矩阵中加载一个单位矩阵
esMatrixLoadIdentity ( &modelview );
// Translate away from the viewer
esTranslate ( &modelview, 0.0, 0.0, -2.0 );
// Rotate the cube
esRotate ( &modelview, userData->angle, 1.0, 0.0, 1.0 );
- 第二步,将 MV 矩阵转换为屏幕中的投影矩阵,这里有一个链接,非常清晰的给出了
Projection Matrix
的概念。
投影矩阵 : 将眼睛坐标转换为裁剪坐标
ESMatrix projection;
// 计算窗口高宽比
aspect = ( GLfloat ) esContext->width / ( GLfloat ) esContext->height;
// Generate a projection matrix with a 60 degree FOV,60度的视场
// &projection 指针指向 projection 的地址
esMatrixLoadIdentity ( &projection );
esPerspective ( &projection, 60.0f, aspect, 1.0f, 20.0f );
//最后 mv Matrix * p Matrix = mvp Matrix
esMatrixMultiply(&userData ->mvpMatrix,&modelview,&projection);
//加载到 uniform 中,供 shader 使用
//内存寻址
userData->mvpLoc = glGetUniformLocation ( userData->programObject, "u_mvpMatrix" );
//读取 uniform
glUniformMatrix4fv ( userData->mvpLoc, 1, GL_FALSE, ( GLfloat * ) &userData->mvpMatrix.m[0][0] );
注意:如果分别向 vertex 传入 modelviewMatrix 和 projectionMatrix,输出的 gl_Postion 要有先后顺序
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );