在Android上使用OpenGL时自动清除缓冲区

Ank*_*uja 5 android opengl-es egl

我正在写一个特定的OpenGL应用程序,我特意想逐步绘制帧.为此,我想禁用我理解的缓冲区的自动清除,这是GLSurfaceView.Renderer.onDrawFrame()的默认行为.有人可以帮我解决这个问题吗?我需要用Java编写应用程序,而不是使用本机SDK.

我明白我可以这样做: -

(1) setting EGL_SWAP_BEHAVIOR_PRESERVED_BIT bit for EGL_SURFACE_TYPE attribute while doing [eglChooseConfig][1](), and 
(2) setting EGL_SWAP_BEHAVIOR attribute to EGL_BUFFER_PRESERVED by calling [eglSurfaceAttrib][2] on the EGLSurface object
Run Code Online (Sandbox Code Playgroud)

但是,我从Khronos医生那里得知: -

"EGL_SWAP_BEHAVIOR_PRESERVED_BIT are supported only if the EGL version is 1.4 or greater."
"EGL_SWAP_BEHAVIOR is supported only if the EGL version is 1.2 or greater."
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以在Android应用程序中以两种方式访问​​EGL: -

(1) use the Khronos API class [EGL10][3] in javax.microedition.khronos.egl package (EGL11 doesn't seem to be implemented yet)
(2) use the Android API class [EGL14][4] in android.opengl package (similar to using class android.opengl.GLES20)
Run Code Online (Sandbox Code Playgroud)

(1)的问题是版本<1.4,因此它不支持我需要的功能.(2)的问题是我的应用程序只是在我调用EGL14中的任何方法时崩溃,我不确定我应该如何使用它(我找不到关于EGL14是如何使用的单个示例程序/教程应该在app中使用).特别是,我想学习如何从EGL14获得有效的GL上下文:在EGL10的情况下,我可以通过调用javax.microedition.khronos.egl.EGLContext.getGL()来做到这一点.但是,我在类android.opengl.EGLContext中看不到等效方法.事实上,除了EGL14之外,android.opengl中所有与EGL相关的类似乎都是空的.

我最好的选择是遵循与GLES20相同的推理方法:仅在GLSurfaceView.Renderer方法中调用方法:onDrawFrame(),onSurfaceCreated(),onSurfaceChanged(),因为这些提供有效的GL(GL10)和EGL(EGLConfig)作为参数的上下文.所以我将以下代码放在onDrawFrame()中: -

public void onDrawFrame(GL10 gl)
{
    ...
    android.opengl.EGLDisplay d = null;
    if ( (d = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)) == EGL14.EGL_NO_DISPLAY) {
        Log.i("Triangle", "EGL14.eglGetDisplay() failed!");
    } else {
        Log.i("Triangle", "EGL14.eglGetDisplay() succeeded!");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我相信在调用上述内容之前我不必实例化EGL14,因为所有方法都是静态的.但是,对EGL14.eglGetDisplay()的调用会使应用程序崩溃.

任何帮助将不胜感激,谢谢:)

tor*_*nwh 1

您可以扩展 GLSurfaceView 并调用 init,而不是直接使用 EGL setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

此设置可防止重绘 GLSurfaceView 框架,直到您调用 requestRender(),这对于此示例应用程序来说更加高效。

请参阅 android 文档1,了解如何使用 Java 设置 GLES。

构建 OpenGL ES 环境