您好,我最近一直在 android ndk 上使用 OpenGL ES 1.1,但我遇到了一个问题。发生的事情是我在屏幕上呈现一个简单的红色方块,当我启动应用程序时,方块完美显示,但是当我点击主页按钮并返回应用程序时,方块不再显示。getError
我在调用后尝试调用glDrawArrays
以查看是否发生错误并且它总是返回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);
}
注意:该函数initialize
是从onSurfaceCreated
和gameRun
从调用的onDrawFrame
。
让我感到奇怪的一件事是,在我的手机上按主页按钮后再次运行该应用程序时,系统会调用该功能onSurfaceChanged
两次。不知道它是否与任何事情有关,但它只是奇怪。
如果有人可以帮助我,我将非常感激:D