我正在编写一个特定的 OpenGL 应用程序,我特别想在其中逐步绘制帧。为此,我想禁用我理解的缓冲区的自动清除,这是GLSurfaceView.Renderer#onDrawFrame()
. 有人可以帮助我如何做到这一点吗?我需要用 Java 编写应用程序,而不是使用本机 SDK。
我知道我可以通过以下方式做到这一点:-
- 在执行时设置属性
EGL_SWAP_BEHAVIOR_PRESERVED_BIT
位,并且EGL_SURFACE_TYPE
eglChooseConfig
- 通过调用EGLSurface 对象来设置
EGL_SWAP_BEHAVIOR
属性EGL_BUFFER_PRESERVED
eglSurfaceAttrib
但是,我从 Khronos 文档中收集到:-
EGL_SWAP_BEHAVIOR_PRESERVED_BIT
仅当 EGL 版本为 1.4 或更高版本时才受支持。EGL_SWAP_BEHAVIOR
仅当 EGL 版本为 1.2 或更高版本时才受支持。
现在,我知道我可以在我的 Android 应用程序中以两种方式访问 EGL:-
EGL10
使用包中 的 Khronos API 类javax.microedition.khronos.egl
(EGL11
似乎还没有实现)EGL14
在中使用 Android API 类android.opengl package
(类似于使用类android.opengl.GLES20
)
(1) 的问题是版本小于 1.4,所以它不支持我需要的功能。(2) 的问题是,当我在 EGL14 中调用任何方法时,我的应用程序就会崩溃,而且我不确定我应该如何使用它(我找不到一个关于 EGL14 的示例程序/教程应该在应用程序中使用)。特别是,我想学习如何从 EGL14 获取有效的 GL 上下文:在 EGL10 的情况下,我可以通过调用javax.microedition.khronos.egl.EGLContext.getGL()
. 但是,我在 class 中没有看到等效的方法android.opengl.EGLContext
。事实上,android.opengl
除了 EGL14 之外,所有与 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!");
}
...
}
我相信我不必在调用上述方法之前实例化 EGL14,因为所有方法都是静态的。但是,调用EGL14.eglGetDisplay()
会使应用程序崩溃。
任何帮助将不胜感激,谢谢:)