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/

Другие вопросы по тегам