Android OpenGL ES не растеризован - матричное умножение переключено
Я только что купил новый SGS3 (I9300 - НЕ LTE) и надеялся продолжить разработку приложения OpenGL ES (2). К сожалению, когда я его компилирую, я ничего не вижу.
Я получаю следующие сообщения об ошибках 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
Я также установил пользовательский rom (cyanogenmod 11 - снимок M4), но у меня та же проблема.
Когда я запускаю приложение, я получаю пустой экран без растеризованных вершин. Пока ясный цвет работает, так что основные функции OpenGL работают.
Чтобы быть уверенным, я попробовал это с основным руководством со страницы разработчиков Google с GLES 1 и GLES 2. Оба не работают! Вот скриншоты:
http://developer.android.com/training/graphics/opengl/index.html
Сам проект отлично работает на моем старом Galaxy S1 (также на Cyanogenmod), но не показывает ничего, кроме пустого экрана на моем SGS3.
Возможно ли, что графический драйвер / система Mali-400 MP4 по- разному интерпретирует команды GL? Есть ли другой способ звонка, чем с графическим процессором Hummingbird от моего SGS1?
Кто-нибудь знает, что делать? Это проблема с моим телефоном или затмением? Или это нормально - просто мое непонимание? Как я могу исправить эту проблему?
------- РЕДАКТИРОВАТЬ: РЕШЕНИЕ НАЙДЕНО -------
Хорошо, я нашел ошибку. Документ Google показывает "неправильное" умножение матриц в вершинном шейдере:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = uMVPMatrix * vPosition;
}
Это не проблема для моего старого Galaxy S1, но почему-то S3 (или Mali GPU) требователен к этому. Я изменил порядок умножения на это:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = vPosition * uMVPMatrix;
}
И это работает (также на S1). До сих пор не уверен, почему S1 отлично работает с обеими версиями, но это решает проблему.
Спасибо за вашу помощь!
2 ответа
Прямо из головы, вы проверили настройки проекции? Возможно, эти фигуры нарисованы, но не там, где вы ожидаете.
Также проверьте возвращаемые значения для шагов загрузки шейдера. Если есть проблема с компиляцией, вы получите неверный дескриптор для шейдерной программы.
В вашем коде могут быть некоторые предупреждения или ошибки, которые не попадают в LogCat. Я обнаружил, что использование встроенной оболочки OpenGL из LibGDX на самом деле показывает мне эти ошибки и очень полезно для отладки.
Вы можете найти некоторые полезные советы по настройке библиотек LibGDX здесь - http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/