【问题标题】:Triangles not drawn after hitting home button on Android在Android上点击主页按钮后未绘制三角形
【发布时间】:2012-07-04 05:27:16
【问题描述】:

您好,我最近一直在 android ndk 上使用 OpenGL ES 1.1,但我遇到了一个问题。发生的事情是我在屏幕上呈现一个简单的红色方块,当我启动应用程序时,方块完美显示,但是当我点击主页按钮并返回应用程序时,方块不再显示。我尝试在调用glDrawArrays 后调用getError 以查看是否发生错误并且它总是返回GL_NO_ERROR。我在 android 网站上读到以下内容:

在某些情况下,EGL 渲染上下文会丢失。 这通常发生在设备在进入睡眠状态后唤醒时。什么时候 EGL 上下文丢失,所有 OpenGL 资源(例如纹理) 与该上下文相关联的将被自动删除。在 为了保持正确渲染,渲染器必须重新创建任何丢失的 它仍然需要的资源。 onSurfaceCreated(GL10, EGLConfig) 方法是一个方便的地方。

我所做的是在活动的每个阶段都在 log cat 上打印,当点击主页按钮并返回应用程序时,系统没有调用 onSurfaceCreated。我还尝试在 log cat 中打印我的顶点,以检查它们是否以某种方式被破坏,而我只是向glVertexPointer 发送了错误的值,但看起来没问题。代码如下:

    static jint initialize(JNIEnv* env, jobject obj, jint width, jint height){
        glViewport(0, 0, width, height);

        glMatrixMode(GL_PROJECTION);
        glOrthof(0, width, height, 0, -1, 1);

        glClearColor(100.0f/255.0, 149.0f/255.0f, 237.0/255.0f, 1.0f);

    }

    struct Vertex {
         float Position[2];
         float Texture[4];
    };

    static void gameRun(JNIEnv* evn, jobject obj) {
         glClear(GL_COLOR_BUFFER_BIT);

         const Vertex Vertices[] = {
        {{ 0.0f, 100.0f },   { 1.0f, 0.0f, 0.0f, 1.0f }},
        {{ 0.0f,  0.0f },    { 1.0f, 0.0f, 0.0f, 1.0f }},
        {{ 100.0f, 100.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }},
        {{ 100.0f,  0.0f },  { 1.0f, 0.0f, 0.0f, 1.0f }},
         };

         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();

         glEnableClientState(GL_VERTEX_ARRAY);
         glEnableClientState(GL_COLOR_ARRAY);

         glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &Vertices[0].Position[0]);
         glColorPointer(4, GL_FLOAT, sizeof(Vertex), &Vertices[0].Texture[0]);

         GLsizei vertexCount = sizeof(Vertices) / sizeof(Vertex);
         glDrawArrays(GL_TRIANGLE_STRIP, 0, vertexCount);

         glDisableClientState(GL_VERTEX_ARRAY);
         glDisableClientState(GL_COLOR_ARRAY);
    }

注意:函数 initializeonSurfaceCreatedgameRunonDrawFrame 调用。

让我感到奇怪的是,当我在手机上按下主页按钮后再次运行应用程序时,系统会调用函数onSurfaceChanged 两次。不确定它是否与其他任何事情有关,只是很奇怪。

如果有人可以帮助我,我将不胜感激:D

【问题讨论】:

    标签: android opengl-es android-ndk java-native-interface


    【解决方案1】:

    好吧,在做了一些测试并与一些示例项目进行比较之后,我注意到了一些事情。在一个项目中,当调用 glOrthof 时,我会为左右传递宽度和高度之间的比率,而我会为顶部和底部传递 -1 和 1:

    float ratio = width / height;
    glOrthof(-ratio, ratio, -1, 1, -1, 1);
    

    当我点击主页按钮然后再次运行应用程序时,我注意到正方形会缩放。

    在另一个项目中,我将简单地创建一个投影矩阵,然后在我的 gameRun 函数上使用 glLoadMatrix 设置它:

    mat4 projection = mat4::Frustum(-2, 2, -h / 2, h / 2, 5, 10);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(projection.Pointer());
    

    当我点击主页按钮然后再次运行应用程序时,我看到这一次正方形会毫无问题地出现。然后我开始阅读OpenGL ES 1.1的文档,发现如下:

    glOrtho 描述了一种产生平行 投影。 当前矩阵(见 glMatrixMode)乘以 这个矩阵和结果替换当前矩阵...

    它突然袭击了我......因为从家庭中断回来后,我的应用程序正在使用之前创建的上下文。所以实际上发生的事情是,当我这次调用glOrthof 时,这些值乘以在我的应用程序被中断之前设置的值。这会导致我的 Ortho 放大一个平方因子。使我的 100 x 100 正方形渲染得非常非常小。为了解决这个问题,我只是在调用glOrthof 之前添加了一个glLoadIndentity

    static jint initialize(JNIEnv* env, jobject obj, jint width, jint height){
       glViewport(0, 0, width, height);
    
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       glOrthof(0, width, height, 0, -1, 1);
    
       glClearColor(100.0f/255.0, 149.0f/255.0f, 237.0/255.0f, 1.0f);
    }
    

    这是因为glLoadIdentity 用单位矩阵替换了之前的值:

    glLoadIdentity 用单位矩阵替换当前矩阵。 它在语义上等价于使用 单位矩阵

    (1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1)

    从而解决问题! :D

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2021-09-14
      • 2020-12-08
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多