Sto scrivendo una determinata applicazione OpenGL in cui mi piacerebbe in particolare disegnare frame in modo incrementale. Per questo, mi piacerebbe disabilitare la cancellazione automatica del buffer che capisco, è il comportamento predefinito di GLSurfaceView.Renderer.onDrawFrame(). Qualcuno può aiutarmi per come farlo? Devo scrivere l'applicazione in Java, non usando l'SDK nativo.Cancellazione automatica del buffer durante l'utilizzo di OpenGL su Android
ho capito che avrei potuto fare questo: -
(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
Tuttavia, mi sembra di capire dalla doc Khronos che: -
"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."
Ora, capisco che ho potuto accedere EGL in due modi nella mia applicazione Android: -
(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)
il problema con (1) è che la versione è < 1.4 quindi non supporta la funzionalità di cui ho bisogno. Il problema con (2) è che la mia applicazione si blocca semplicemente nel momento in cui chiamo qualsiasi metodo in EGL14, e non sono sicuro di come dovrei usarlo (non sono riuscito a trovare un singolo programma/tutorial di esempio su come EGL14 dovrebbe essere utilizzato in un'app). In particolare, vorrei imparare come ottenere un contesto GL valido da EGL14: nel caso di EGL10, potrei farlo chiamando javax.microedition.khronos.egl.EGLContext.getGL(). Tuttavia, non vedo alcun metodo equivalente in classe android.opengl.EGLContext. Infatti, tutte le classi relative a EGL in android.opengl eccetto EGL14 sembrano essere per lo più vuote.
La mia scommessa migliore è stato quello di seguire la stessa linea di ragionamento, come in caso di GLES20: per chiamare i metodi solo all'interno dei metodi GLSurfaceView.Renderer: onDrawFrame(), onSurfaceCreated(), onSurfaceChanged(), perché questi fornitura valida GL (GL10) ed EGL (EGLConfig) contesti come argomenti. Così ho messo seguente codice all'interno 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!");
}
...
}
credo che non avrò istanziare EGL14 prima di chiamare il sopra dal momento che tutti i metodi sono statici. Tuttavia, la chiamata a EGL14.eglGetDisplay() arresta l'app in modo anomalo.
Qualsiasi aiuto sarebbe molto apprezzato, grazie :)
Ciao, stavo affrontando lo stesso problema, e ho appena scoperto che il mio problema era una chiamata a "glColorMask" , dopo aver rimosso la mia chiamata a questo metodo, tutto è stato risolto. Probabilmente la causa del tuo problema è diversa, ma nel caso in cui aiuti il tuo, ti lascio il suggerimento. – PerracoLabs