何时调用glMatrixMode()

Esp*_*pen 2 android opengl-es

我所遵循的Android大多数OpenGL ES教程都有这样的onSurfaceChanged()函数:

public void onSurfaceChanged( GL10 gl, int width, int height ) {
    gl.glViewport( 0, 0, width, height );
    gl.glMatrixMode( GL10.GL_PROJECTION );
    gl.glLoadIdentity();
    GLU.gluPerspective( gl, 45.0f, ( ( float )width / ( float )height ), 0.1f, 100.0f );
    gl.glMatrixMode( GL10.GL_MODELVIEW );
    gl.glLoadIdentity();
}
Run Code Online (Sandbox Code Playgroud)

但是,这里的分组是什么?必须在glViewport之后调用glMatrixMode()吗?并且必须在glMatrixMode()之后立即调用glLoadIdentity()吗?

我之前一直在编写"完整"的OpengGL,在我的旧代码中我首先调用glMatrixMode(),然后调用gluPerspective和glLoadIdentity().好像首先设置了什么矩阵应该用于gluPerspective()和最后设置glIdentity()来完成它.

调用glMatrixMode(),glIdentity()和gluPerspective()的正确顺序是什么?为什么?OpenGL和OpenGL ES之间是否存在设置glMatrixMode()的区别?

小智 9

glViewport()完全独立于矩阵变换堆栈,可以随时调用.

glLoadIdentity()通常在矩阵模式更改后立即调用,因此如果愿意,您将开始"新鲜".Matrix变换,例如gluPerspective(),glOrtho(),glFrustum(),glRotate(),glMultMatrix(),glTranslate()是累积操作,因为它们聚合以允许您描述复杂的3D世界空间变换或描述您的OpenGL查看体积.示例:如果我想要一个沿+ X方向平移的立方体然后绕Z轴旋转我发出一个glRotate()后跟一个glTranslate().

glLoadIdentity()使用单位矩阵消除矩阵(当前矩阵模式),因此glPoadIdentity()跟随gluPerspective()后,相当于对glLoadIdentity()的单次调用.换句话说,该序列是荒谬的.

颠倒这些的顺序,因为gluPerspective()将通过透视变换乘以当前矩阵.如果当前矩阵是同一性,则乘法将简单地导致gluPerspective()矩阵变换,这是您在投影透视时99%的投影矩阵模式所需的.

OpenGL和OpenGL ES之间在glMatrixMode()的行为或这些矩阵函数如何修改GL矩阵状态方面没有区别.