Open GL error de configuración incorrecta en Samsung S4
Estoy recibiendo el siguiente error en Samsung S4
10-21 16:25:44.100: E/AndroidRuntime(29778): FATAL EXCEPTION: GLThread 11320 10-21 16:25:44.100: E/AndroidRuntime(29778): Process: <bundle ID>, PID: 29778 10-21 16:25:44.100: E/AndroidRuntime(29778): java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1201) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1192) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1042) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1409) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
El error se debe a:
- Framerate tartamudea ocasionalmente en Android opengl es 2.0
- ¿Cuándo debemos utilizar LAYER_TYPE_HARDWARE
- El ejemplo de Android openGL da una pantalla en blanco
- Uso de objetos de búfer de píxeles (PBO) en Android
- Android "cpu puede estar vinculado" error
this.setEGLContextFactory(new MyDefaultContextFactory()); this.setEGLConfigChooser(GL_RED_SIZE, GL_GREEN_SIZE, GL_BLUE_SIZE, GL_ALPHA_SIZE, GL_DEPTH_SIZE, 0);//<-this line this.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS); this.setPreserveEGLContextOnPause(true); this.setEGLContextClientVersion(2);
Donde la configuración pasada es: 8,8,8,8,24
Mover la línea anterior al final funciona sin embargo. ¿Cuál es la razón de esto?
PS: El código funciona bien en Nexus5 o MotoG en ambos casos. Todos los dispositivos que ejecutan Kitkat 4.4.2
- Android ICS: ¿Qué es lo que realmente hace el sistema "Forzar Rendición de GPU"?
- Cómo cargar un objeto 3d en Android?
- Necesita ayuda para OpenGL de Android
- Excepción OutofMemoryError dalvik.system.VMRuntime.newNonMovableArray (Método nativo)
- Tutorial para Android OpenGL ES
- ¿Hay una mejor manera de depurar OpenGL que de llamar a glGetError después de cada comando?
- ¿Cómo puedo crear una nueva NativeWindow en Android NDK?
- Cómo mover un cuadrado OpenGL con el dedo?
No lo veo claramente especificado en la documentación , pero mirando el código fuente de GLSurfaceView
, realmente parece ser el caso que setEGLContextClientVersion()
debe ser llamado antes de setEGLConfigChooser()
.
No copiar ningún código porque no estoy seguro si eso violaría los derechos de autor, pero puedes seguirlo si subes el enlace de código arriba:
- La sobrecarga de
setEGLContextChooser()
utilizada en su código crea una instancia deComponentSizeChoser
, con los tamaños especificados pasados al constructor. - El constructor de
ComponentSizeChooser
invoca al constructor de clase base, pasando los tamaños especificados empaquetados en una especificación de configuración al constructor de base. La clase base esBaseConfigChooser
. - El constructor de
BaseConfigChooser
invoca un método privadofilterConfigSpec()
, pasándole la especificación de configuración, -
filterConfigSpec()
examina el valor de la variable miembromEGLContextClientVersion
y la utiliza para determinar el valor del atributoEGL_RENDERABLE_TYPE
, que añade a la especificación de configuración. A continuación, devuelve la especificación de configuración con este atributo adicional. - De nuevo en el constructor
BaseConfigChooser
, la especificación de configuración modificada se asigna a una variable miembro. - La especificación de configuración en esta variable miembro se utiliza más tarde cuando se llama al método
chooseConfig()
, donde se selecciona la configuración actual.
mEGLContextClientVersion
es el valor establecido por setEGLContextClientVersion()
. Por lo tanto, el valor establecido con este método sólo se incluirá en la selección de configuración si setEGLContextClientVersion()
se llama antes de setEGLContextChooser()
.
Algunos dispositivos proporcionan configuraciones que admiten tanto ES 1.X como ES 2.0 / 3.0, mientras que otros proporcionan configuraciones separadas para soporte 1.X y 2.0 / 3.0. Esto es más probable por qué la creación de contexto tiene éxito con las llamadas en el orden "incorrecto" en algunos dispositivos, mientras que falla en otros.