我正在编写一个特定的opengl应用程序,我特别希望在其中以增量方式绘制帧。为此,我想禁用glsurfaceview.renderer.onDrawFrame()的默认行为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
然而,我从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."
现在,我知道我可以通过两种方式在我的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)
(1)的问题是版本(2)的问题是,当我调用egl14中的任何方法时,我的应用程序只会崩溃,我不确定应该如何使用它(我找不到一个关于egl14应该如何在应用程序中使用的示例程序/教程)。特别是,我想学习如何从egl14获取有效的gl上下文:对于egl10,我可以通过调用javax.microedition.khronos.egl.egl context.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!");
}
...
}
我相信在调用上述方法之前不必实例化egl14,因为所有方法都是静态的。但是,对egl14.eglgetdisplay()的调用会使应用程序崩溃。
任何帮助都将不胜感激,谢谢:)
最佳答案
实现的egl版本可能高于您正在使用的接口。实际版本由egl10.eglinitialize()返回。如果是[1,4]或更高,则可以在调用egl10.eglchooseconfig()时传递[egl10.egl_surface_type,egl14.egl_swap_behavior_preserved_bit]。这里可以使用egl14定义的egl_swap_behavior_preserved_bit——它只是由egl规范定义的一个int。
egl14.eglgetdisplay()如何使应用程序崩溃。是不是抛出了一个没有被抓到的异常?可能值得在https://code.google.com/p/android/issues/list上提交一个bug(关于你在做什么和在什么设备上做的同样详细)。