Piszę pewną aplikację OpenGL gdzie bym specjalnie lubią rysować ramki stopniowo. W tym celu chciałbym wyłączyć automatyczne usuwanie bufora, które rozumiem, jest domyślnym zachowaniem GLSurfaceView.Renderer.onDrawFrame(). Czy ktoś może mi pomóc, jak to zrobić? Muszę napisać aplikację w Javie, nie używając natywnego SDK.Automatyczny bufor jasne podczas korzystania z OpenGL na Androida
Rozumiem, że mógłbym to zrobić: -
(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
jednak wnoszę z doc Khronos, że: -
"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."
Teraz rozumiem, że mogę uzyskać dostęp EGL w dwa sposoby, w mojej aplikacji 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)
problem z (1) jest to, że wersja jest < 1.4, więc nie obsługuje potrzebnej mi funkcjonalności. Problem z (2) jest to, że moja aplikacja po prostu zawiesza się w chwili, kiedy wywołać dowolną metodę w EGL14, a ja nie wiem, jak mam go używać (nie mogłem znaleźć jeden przykład program/tutorial jak EGL14 ma być używany w aplikacji). W szczególności chciałbym dowiedzieć się, jak ważny kontekst GL z EGL14: w przypadku EGL10 mogłem zrobić wywołując javax.microedition.khronos.egl.EGLContext.getGL(). Jednak nie widzę żadnej równoważnej metody w klasie android.opengl.EGLContext. W rzeczywistości wszystkie klasy związane z EGL w android.opengl z wyjątkiem EGL14 wydają się być w większości puste.
Moim najlepszym pomysłem było podążanie tą samą linią rozumowania, jak w przypadku GLES20: wywoływanie metod tylko wewnątrz metod GLSurfaceView.Renderer: onDrawFrame(), onSurfaceCreated(), onSurfaceChanged(), ponieważ te zaopatrzenie jest ważne GL (GL10) i EGL (EGLConfig) konteksty jako argumenty. Włożyłem więc następujący kod wewnątrz 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!");
}
...
}
wierzę, że nie będzie musiał instancję EGL14 przed wywołaniem wyżej ponieważ wszystkie metody są statyczne. Jednak wywołanie funkcji EGL14.eglGetDisplay() powoduje awarię aplikacji.
Każda pomoc będzie mile widziane, dzięki :)
Witam, byłem w obliczu tego samego problemu, a ja po prostu okazało się, że mój problem był wezwaniem do „glColorMask” , po usunięciu mojego wezwania do tej metody wszystko zostało rozwiązane. Prawdopodobnie przyczyna twojego problemu jest inna, ale na wszelki wypadek, gdy ci pomoże, podam ci wskazówkę. – PerracoLabs