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

标签 android opengl-es egl

我正在编写一个特定的 OpenGL 应用程序,我特别想在其中逐步绘制帧。为此,我想禁用自动清除缓冲区,据我所知,这是 GLSurfaceView.Renderer#onDrawFrame() 的默认行为。有人可以帮我怎么做吗?我需要用 Java 编写应用程序,而不是使用原生 SDK。

我知道我可以通过以下方式做到这一点:-

  1. 在执行 eglChooseConfig 时为 EGL_SURFACE_TYPE 属性设置 EGL_SWAP_BEHAVIOR_PRESERVED_BIT 位,以及
  2. 通过调用 EGLSurface 对象上的 eglSurfaceAttribEGL_SWAP_BEHAVIOR 属性设置为 EGL_BUFFER_PRESERVED

但是,我从 Khronos 文档中了解到:-

  • EGL_SWAP_BEHAVIOR_PRESERVED_BIT 只有在 EGL 版本为 1.4 或更高版本。
  • EGL_SWAP_BEHAVIOR 仅当 EGL 版本为 1.2 或更高时才受支持。

现在,我了解到我可以在我的 Android 应用程序中以两种方式访问​​ EGL:-

  1. 使用 Khronos API 类 EGL10 javax.microedition.khronos.egl包(EGL11好像还没有实现)
  2. 使用 android.opengl package 中的 Android API 类 EGL14(类似于使用类 android.opengl.GLES20)

(1) 的问题在于版本 < 1.4,因此它不支持我需要的功能。 (2) 的问题是,当我调用 EGL14 中的任何方法时,我的应用程序就崩溃了,而且我不确定我应该如何使用它(我找不到单个示例程序/教程EGL14 应该如何在应用程序中使用)。特别是,我想了解如何从 EGL14 获取有效的 GL 上下文:对于 EGL10,我可以通过调用 javax.microedition.khronos.egl.EGLContext.getGL()。但是,我在 android.opengl.EGLContext 类中看不到等效方法。事实上,android.opengl 中所有与 EGL 相关的类,除了 EGL14 似乎大部分都是空的。

我最好的选择是遵循与 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!");
    }
    ...
}

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

非常感谢任何帮助,谢谢:)

最佳答案

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

This setting prevents the GLSurfaceView frame from being redrawn until you call requestRender(), which is more efficient for this sample app.

请参阅 android 文档 1关于如何使用 Java 设置 GLES。

Building an OpenGL ES Environment

关于android - 在 Android 上使用 OpenGL 时自动清除缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16190869/

相关文章:

OpenGL 4.4/ES 3.0 和缓存 channel 之间的顶点数据

java - GLES2.0 : Use GL_TEXTURE_EXTERNAL_OES via glEGLImageTargetTexture2DOES

linux - 使用 NVidia GPU 的屏幕 EGL 显示

java - 应用程序内的区域设置更改不起作用

android - 错误 : android. app.SuperNotCalledException

linux - 在 Ubuntu 中找不到 X11/Xlib.h

oop - 在面向对象的设置中使用OpenGL绘图操作?

android - 滚动的 TextView 值被截断

Android - 如何阻止 fragment 自动恢复其状态?

c++ - EGL 在第一次 opengl 函数调用时崩溃