初学OpenGL的几个注意点
发布网友
发布时间:2022-05-07 19:41
我来回答
共1个回答
热心网友
时间:2022-07-01 06:02
1,OpenGL是一个状态机,当前设定某个状态之后,效果将一直持续到下次重新设定。状态可以查询。
2,关于变换(矩阵):
i)变换矩阵分为三类,其一是“模型视图”矩阵,其二是“投影”矩阵,其三是“纹理”矩阵;不同命令形成的矩阵将自动归到不同类别,例如glRotatef生成的矩阵属于模型视图,gluPerspective生产的矩阵自动归到投影矩阵那类。但是当你要glLoadIdentity时,你发现它无法自动归类,再或者说你要使用glMultMatrixf时,它也不知道归到哪一类时,这时你必须用命令glMatrixMode来指明清楚,让他归到哪一类。其实说是说三类,实际上当前矩阵就三个(设为M,P,T),假设现在又新生成一个模型视图矩阵A,那么实际上就是在当前的模型视图矩阵M后面再乘以M,即更新后的模型视图矩阵是M*A,都是右边乘上去。
ii)关于变换顺序的理解:如果要在全局坐标系中理解,那么变换得反着看;如果想象成局部坐标系,那么变换就是顺着看(非归一化的缩放除外);
iii)关于矩阵堆栈,有一点必须要明白,那就是当前矩阵总是在栈顶的,也可以说,栈顶就是存放当前矩阵的地方。和i)类似,有三个堆栈(堆栈深度分别为32,2,2),分别用于存取三类矩阵。假设当前三个矩阵为(M,P,T),首先得通过glMatrixMode来指明清楚你即将使用哪个堆栈,如果用的是GL_MODELVIEW参数,然后再glPushMatrix时,就把当前的模型视图矩阵M复制一个(也就是把modelview栈的栈顶复制一个),然后压进了栈顶端(原来的栈顶成了现在的第二了,当然,现在栈顶和第二两个矩阵都是一样的,这样就起到保存当前设置的作用,因为接下来当前矩阵的改变实质是改变栈顶,第二及其以下都是不动的,除非使用pop后),假设你现在手头控制的模型视图矩阵还是M,假设现在又新生成一个模型视图矩阵A,那么当前的模型视图矩阵就是是M*A,同时栈顶端的矩阵也是M*A(因为栈顶就是当前矩阵),此时如果glPopMatrix的话(栈顶自己丢掉,第二个矩阵成栈顶了,因为栈顶就是当前,所以),那么当前的模型视图矩阵又成了M,因为栈顶是M,取出来之后作为当前的视图模型矩阵。 最后,由于深度有限,尽量少push,以免出错。