图形学中,场景模型渲染到屏幕主要包括以下流程:首先通过模型矩阵变换模型位位置朝向和大小,确定模型在世界坐标中的位置,然后通过视图矩阵将模型的世界坐标位置转换到视点坐标下,接着通过投影矩阵将视点坐标下的模型转换视口空间,最后将视口位置变换到屏幕位置上。此外,对于使用法线贴图的模型,还需要一个法线空间矩阵,来变换法线的朝向。
模型视图矩阵
模型视图矩阵包括模型矩阵和视图矩阵,模型矩阵将模型变换到世界坐标,视图矩阵将世界坐标下的物体坐标变换到视口坐标,这两个矩阵本质一样。老版本的opengl使用下面的代码实现视图矩阵。2.0以后的版本开始支持动态管线渲染,各种矩阵需要自己在程序中计算好传入道shader中,至于矩阵的旋转平移丶缩放丶矩阵的实现,请参https://blog.csdn.net/dcrmg/article/details/53088617。
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
glulookat();
投影矩阵栈
投影矩阵栈,实现将视口坐标下的模型坐标投影到裁剪视口,老版本的opengl使用下面的代码实现投影矩阵,2.0以后的版本需要自己手动传入投影矩阵,投影矩阵的参数个实现参考https://www.cnblogs.com/wonderKK/p/5695116.html。
glMatrixMode(GL_PROGECTION)
glLoadIdentity();
glFrustum(); //gluperspective();或者glortho();
此外,在实现平面投影阴影的过程中,需要对场景中物体先投影到平面再投影到视平面,此时可通过矩 阵相乘,再设一个投影矩阵来实现,平面阴影,glMulMatix()。通常的视景体裁剪为6个面,若想更多裁剪,可通过下面多设置几个裁剪面,投影矩阵还用于模板阴影等应用中。
glEnable(gl_CLIP_PLANE);
glClipPlane()
切线空间矩阵
游戏中经常使用法线贴图模拟模型细节,从bump到法线贴图,法线贴图保存不是模型空间中的法线,使用的时候需要将切线空间中的法线变换到模型空间才能使用,具体原理参考http://www.cnblogs.com/tekkaman/p/3992352.html。