我正在编写一个特定的 OpenGL 应用程序,我特别想在其中逐步绘制帧。为此,我想禁用自动清除缓冲区,据我所知,这是 GLSurfaceView.Renderer#onDrawFrame()
的默认行为。有人可以帮我怎么做吗?我需要用 Java 编写应用程序,而不是使用原生 SDK。
我知道我可以通过以下方式做到这一点:-
- 在执行
eglChooseConfig
时为EGL_SURFACE_TYPE
属性设置EGL_SWAP_BEHAVIOR_PRESERVED_BIT
位,以及 - 通过调用 EGLSurface 对象上的
eglSurfaceAttrib
将EGL_SWAP_BEHAVIOR
属性设置为EGL_BUFFER_PRESERVED
但是,我从 Khronos 文档中了解到:-
EGL_SWAP_BEHAVIOR_PRESERVED_BIT
只有在 EGL 版本为 1.4 或更高版本。EGL_SWAP_BEHAVIOR
仅当 EGL 版本为 1.2 或更高时才受支持。
现在,我了解到我可以在我的 Android 应用程序中以两种方式访问 EGL:-
- 使用 Khronos API 类
EGL10
javax.microedition.khronos.egl
包(EGL11
好像还没有实现) - 使用
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。
关于android - 在 Android 上使用 OpenGL 时自动清除缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16190869/