opengl es 2.0 3.0 MVP矩阵计算

从2.0开始,opengl es不再提供glRotate()等函数,因此MVP矩阵需要我们自己计算,并赋值给GLSL。
1) 先来看下opengl所用的矩阵的基本知识:
Opengl 使用的是列矩阵,即顶点向量等是用列向量的齐次坐标表示的。
另外其矩阵存储方式是“列主序(column-major order)/列优先”
线性代数意义的同一个矩阵,在d3d 和 opengl 中却有不同的存储顺序

[code]线代:a11,a12,a13,a14               d3d :  a11,a12,a13,a14             gl: a11,a21,a31,a41
           a21,a22,a23,a24                      a21,a22,a23,a24                 a12,a22,a32,a42
           a31,a32,a33,a34                      a31,a32,a33,a34                 a13,a23,a33,a43
           a41,a42,a43,a44                      a41,a42,a43,a44                 a14,a24,a34,a44[/code]

矩阵x顶点(记住顺序!!矩阵左乘顶点,顶点用列向量表示)= 变换后的顶点

这里有粗略的介绍


下面来分析一下:
如上图,3个元素集(m0, m1, m2),(m4, m5, m6)和(m8, m9, m10) 是用作欧拉变换和仿射变换,例如1.0中提供的函数glRotate(),缩放glScalef().

注意这三个元素集实际上指得是3个正交坐标系:
(m0, m1, m2): +X 轴,向左的向量(left vector)(估计是相对屏幕自己),默认为(1,0,0)
(m4, m5, m6) : +Y轴,向上的向量(up vector),默认为(0,1,0)
(m8, m9, m10): +Z轴,向前的向量,默认为(0,0,1).

因为使用的是左乘,所以变换的顺序是相对于乘法是逆向的,即最后的变换出现在矩阵相乘之前,最先的变换在最后出现。:

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;
这行代码最先执行缩放,接着旋转,最后才是平移。
用GLSL表示:

mat4 transform = projectionMat* viewMat * modeMat;
vec4 out_vec = transform * in_vec;

因为model矩阵变换比较简单。所以在这里不再讲解,主要讲解View(又叫相机)矩阵和投影(projection)矩阵的构建


更多内容:http://www.flakor.cn/2014-05-16-409.html

你可能感兴趣的:(游戏引擎开发,opengl,es,opengl,3d)