0
目标:机器人API> = 23,的OpenGL ES 2.OpenGL ES:即使没有当前上下文,glDeleteFramebuffers也会成功?
以下代码
private void deleteFBO()
{
android.util.Log.e("FBO", "deleting "+mFramebufferID);
int[] textureIds = new int[1];
int[] mFBORenderToTexture = new int[1];
textureIds[0] = mTextureID;
mFBORenderToTexture[0] = mFramebufferID;
if(GLES20.glGetError()!=GLES20.GL_NO_ERROR)
android.util.Log.e("FBO", "error before deleting");
GLES20.glDeleteTextures(1, textureIds, 0);
GLES20.glDeleteFramebuffers(1, mFBORenderToTexture, 0);
if(GLES20.glGetError()!=GLES20.GL_NO_ERROR)
android.util.Log.e("FBO", "error after deleting");
}
不给我任何错误(即我不能看到 '错误之前/之后删除')甚至尽管它肯定是从不包含任何OpenGL上下文的线程调用的。
这怎么可能?或者,也许glDelete()调用真的会失败,但我的代码无法检测到这一点?
似乎我不明白当持有上下文时需要做什么OpenGL调用?当我尝试调用它而没有保持上下文时,glDrawArrays肯定会给我一个错误,并且我认为我需要在每个情况下都保持它,包括上面的两个glDelete *()。
是的,就是这样 - 我设法证明glGetError()本身失败。这是在Android模拟器和我的Nexus 4上。 – Leszek
这实际上是非常不幸的。那么如何在这种情况下检测到失败的OpenGL调用呢?这里glDelete()默默地失败,应用程序似乎仍在运行,但内存当然不会释放... – Leszek
不要写错误的应用程序 - 这不是你应该在运行时不小心处理的情况。如果必须添加调试检查,只需在'eglGetCurrentContext()'不返回'EGL_NO_CONTEXT'上添加断言。 – solidpixel