Android OpenGL ES no rasterizado-Multiplexión de matrices conmutada
opengl-es mali (2)
Acabo de comprar un nuevo SGS3 (I9300 - NO LTE ) y esperaba seguir desarrollando una aplicación OpenGL ES (2). Desafortunadamente cuando lo compilo no veo nada.
Recibo los siguientes mensajes de error de LogCat:
D/libEGL(6890): loaded /system/lib/egl/libEGL_mali.so
D/libEGL(6890): loaded /system/lib/egl/libGLESv1_CM_mali.so
D/libEGL(6890): loaded /system/lib/egl/libGLESv2_mali.so
E/(6890): Device driver API match
E/(6890): Device driver API version: 23
E/(6890): User space API version: 23
E/(6890): mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Wed Oct 9 21:05:57 KST 2013**
D/OpenGLRenderer(6890): Enabling debug mode 0
También instalé una rom personalizada (cyanogenmod 11 - snapshot M4) pero me sale el mismo problema.
Cuando inicio la aplicación, aparece la pantalla en blanco sin vértices rasterizados. El color claro funciona hasta el momento, por lo que la funcionalidad básica de OpenGL está funcionando.
Para asegurarse de que lo intenté con el tutorial básico de la página de Google Developers con GLES 1 y GLES 2. ¡Ambos no funcionan! Aquí están las capturas de pantalla:
http://developer.android.com/training/graphics/opengl/index.html
El proyecto en sí mismo funciona bien en mi viejo Galaxy S1 (también en Cyanogenmod) pero no muestra nada más que una pantalla en blanco en mi SGS3.
¿Es posible que el controlador / sistema de gráficos Mali-400 MP4 interprete los comandos GL de manera diferente? ¿Hay una manera diferente de llamar que con la GPU Hummingbird de mi SGS1?
¿Alguien tiene una idea de qué hacer? ¿Esto es un problema con mi teléfono o eclipse? ¿O es esto normal, solo mi falta de comprensión? ¿Como puedo solucionar este problema?
------- EDIT: SOLUCIÓN ENCONTRADA -------
De acuerdo, encontré el error. El documento de google muestra un "error" en la multiplicación de las matrices en el sombreador de vértices:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = uMVPMatrix * vPosition;
}
Esto no parece ser un problema para mi antiguo Galaxy S1 pero de alguna manera el S3 (o el GPU de Mali) es exigente con esto. Cambié el orden de la multiplicación a esto:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = vPosition * uMVPMatrix;
}
Y funciona (también en el S1). Todavía no estoy seguro de por qué el S1 funciona bien con ambas versiones, pero esto resuelve el problema.
¡Gracias por tu ayuda!
Justo en la parte superior de mi cabeza, ¿revisaste la configuración de proyección? Es posible que esas formas se dibujen, simplemente no donde espera que estén.
Además, verifique los valores de retorno para los pasos de carga del sombreador. Si hay un problema de compilación, obtendrá un identificador no válido para el programa de sombreado.
Puede haber algunas advertencias o errores en su código que no están burbujeando en LogCat. Descubrí que el uso de un contenedor OpenGL nativo de LibGDX realmente me muestra esos errores y es muy útil para la depuración.
Puede encontrar algunos consejos útiles para configurar las bibliotecas LibGDX aquí - http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/