代码之家  ›  专栏  ›  技术社区  ›  Espen

何时调用glmatrixmode()

  •  2
  • Espen  · 技术社区  · 14 年前

    我所学习的大多数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();
    }
    

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

    我以前一直在为“full”openggl编码,在我的旧代码中,我首先调用了glmatrixmode(),然后是gluPerspective和最后一个glloadIdentity()。就好像第一个设置了gluPerspective()应该使用什么矩阵,最后一个设置了glidEntity()来完成它。

    调用glMatrixMode()、glidEntity()和gluPerspective()的正确顺序是什么?为什么?在设置glmatrixmode()时,OpenGL和OpenGL之间是否存在差异?

    2 回复  |  直到 14 年前
        1
  •  9
  •   user487158    14 年前

    glviewport()完全独立于矩阵转换堆栈,可以随时调用。

    glloadIdentity()通常在矩阵模式更改后立即调用,因此如果愿意,您将启动“fresh”。gluPerspective()、glortho()、glfrutStum()、glrotate()、glmultmatrix()、gltranslate()等矩阵转换是累积操作,因为它们聚合起来可以让您描述复杂的三维世界空间转换或描述OpenGL查看体积。示例:如果我想让一个立方体在+X方向上转换,然后围绕Z轴旋转,我会发出一个glrotate(),后面跟着一个gltranslate()。

    glloadIdentity()使用标识矩阵擦除矩阵(当前矩阵模式),因此glloadIdentity()使用gluPerspective()等同于对glloadIdentity()的单个调用。换言之,这个顺序是无意义的。

    颠倒这些顺序,因为gluPerspective()将用透视转换来乘以当前矩阵。如果当前矩阵是同一矩阵,那么乘法只会导致gluPerspective()矩阵转换,这是透视视图时99%的投影矩阵模式所需的转换。

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

        2
  •  2
  •   Sebastian Negraszus    14 年前

    glloadIdentity将一个标识矩阵加载到当前矩阵(由glmatrixMode激活),从而重置它。我不明白首先调用gluPerspective然后调用glloadIdentity如何完成任何合理的事情。

    您发布的代码也正是您在普通OpenGL中执行该操作的方式。