保存和恢复Projection和ModelView矩阵

时间:2012-03-10 23:28:16

标签: android opengl-es

我正在尝试编写将在渲染动画和渲染抬头显示之间循环的代码。动画有效,但我无法在动画的投影矩阵和HUD的另一个正交投影矩阵之间切换。

主循环运行如下:

init();
while (isAnimationRunning) {
    drawAnimation();
    drawHUD();
}

表面的初始化是:

void init(){
    glEnableClientState(GL10.GL_VERTEX_ARRAY);
    glClearColor(1, 1, 1, 1);
    glMatrixMode(GL11.GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, windowWidth, windowHeight);
    GLU.gluPerspective(gl11, 45.0f, windowWidth / windowHeight, 0.1f, 100.0f);
}

动画渲染的代码

void drawAnimation() {
        glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL10.GL_MODELVIEW);
        glLoadIdentity();
        GLU.gluLookAt(gl11, x, y, zoom, x, y, 0, 0, 1, 0);
            drawAnimationTextures();
}

HUD渲染的代码

void drawHUD(){
        glMatrixMode(GL10.GL_MODELVIEW);
        glPushMatrix();

            // IF THIS LINE IS REMOVED THE ANIMATION DISPLAYS BUT NOT THE HUD
        glLoadIdentity(); 

        glClear(GL10.GL_COLOR_BUFFER_BIT);
        GLU.gluLookAt(gl11, 0, 0, 2, 0, 0, 0, 0, 1, 0);

        glMatrixMode(GL10.GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        GLU.gluPerspective(gl11, 45, aspectRatio, 0.1f, 100.0f);
        glOrthof(-aspectRatio, aspectRatio, -1, 1, -4, 4);

        drawHUDTexture();

    glPopMatrix();
        glMatrixMode(GL10.GL_MODELVIEW);
        glPopMatrix();
}

执行此代码时,屏幕为空白。任何想法可能是什么问题?

////////////////////////

void drawTexture(float x, float y, float z, float sizeX, float sizeY,...){
            glEnable(GL10.GL_TEXTURE_2D);
            glPushMatrix();
            bindTexture(texture);
            glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
            glFrontFace(GL10.GL_CW);
            glColor4f(RGB[0], RGB[1], RGB[2], alpha);
            glTranslatef(x, y, z);
            glScalef(sizeX, sizeY, sizeZ);
            glVertexPointer(3, GL10.GL_FLOAT, 0, squareVertexBuffer);
            glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
            glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
            glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
            glPopMatrix();
}

1 个答案:

答案 0 :(得分:0)

为什么要在两个例程中清除帧缓冲区?你应该只在你的顶级循环中调用它一次。如果动画出现时你注释掉了负荷,但仍然有明显的感觉,我很困惑。

看起来hud会覆盖整个屏幕,让它半透明来检查它,它可能是如此之大,你只看到它的一小部分。

加上您的hud代码正在设置透视图,然后是正视图 - 您想要哪一个?