按照标题,GLSurfaceView在从暂停状态恢复后为空白。渲染器的onSurfaceCreated
,onSurfaceChanged
和在恢复后会被调用,但屏幕仍然为空!Android:GLSurfaceView在恢复应用后为黑色
下面是相关代码:
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
boxWidth = 0.5f;
boxHeight = 0.5f;
boxCenter = new float[] { 0.5f, 0.5f };
Log.v("resume", "onSurfaceCreated");
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 1, 0, 1, -5, 5);
gl.glMatrixMode(GL10.GL_MODELVIEW);
viewHeight = height;
viewWidth = width;
Log.v("resume", "onSurfaceChanged");
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glLoadIdentity();
float halfW = boxWidth/2.0f;
float halfH = boxHeight/2.0f;
float left = Math.max(boxCenter[0]-halfW, 0.001f);
float right = Math.min(boxCenter[0]+halfW, 0.999f);
float top = Math.min(boxCenter[1]+halfH, 0.999f);
float bottom = Math.max(boxCenter[1]-halfH, 0.001f);
boxHeight = Math.max(top - bottom, 0.05f);
boxWidth = Math.max(right - left, 0.05f);
boxCenter[0] = left + boxWidth/2.0f;
boxCenter[1] = bottom + boxHeight/2.0f;
float vertices[] = {
left, top, 0.0f,
left, bottom, 0.0f,
right, bottom, 0.0f,
right, top, 0.0f
};
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
gl.glTranslatef(0.001f, -0.001f, -3.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
vertexBuffer.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
vertexBuffer);
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
Log.v("resume", "drawing");
}
我读过,你需要重新创建内部onSurfaceChanged的GL上下文,但我不知道怎么样,还是我已经做了onSurfaceCreated调用时。
请帮忙!
编辑: 下面是活动的onResume
代码包含GLSurfaceView:(称为GLSurface这里)
public void onResume() {
super.onResume();
if (mGLSurface != null) {
if (mRenderer != null) {
float[] center = new float[2];
center[0] = settings.getFloat("renderer_boxCenter0", 0.5f);
center[1] = settings.getFloat("renderer_boxCenter1", 0.5f);
mRenderer.setBoxCenter(center);
mRenderer.setBoxWidth(settings.getFloat("renderer_boxWidth", 0.5f));
mRenderer.setBoxHeight(settings.getFloat("renderer_boxHeight", 0.5f));
}
mGLSurface.onResume();
}
我没有做太多的的onResume为GLSurfaceView,和我没有”找到任何文件,建议我需要做任何事情,特别是要让我的EGL上下文恢复。
编辑2: 我也想指出,在我GLSurfaceView的构造函数调用setPreserveEGLContextOnPause(true)
没有,遗憾的是,解决我的问题。
也许发布您的onResume()代码,以及您在哪里初始化和设置GLSurfaceView视图 –
已将其添加到我的文章。 – confusedKid
尝试在onSurfaceCreated的结尾处设置'gl.glOrthof(0,1,0,1,-5,5);'并查看当您第一次运行应用程序时是否显示任何内容。如果没有什么区别,可以尝试在onDraw中设置'gl.glClearColor(1.0f,0.0f,0.0f,0.0f);'(即设置背景色为红色),然后将其更改为'gl.glClearColor(0.0f ,0.0f,1.0f,0.0f);调用onResume()后的'(即蓝色)。这样你就可以知道openGL是否对你正在做的事情做出反应 –