У меня есть это УБО:
layout(std140)uniform _ObjMatrix
{
layout(row_major)mat4x3 ViewMatrix[256];
};
На рабочем столе OpenGL размер составляет 3 * Vec4 * 256 элементов (общий размер 12288 байт) - это то, что я ожидал = OK
Однако при работе на моем мобильном телефоне OpenGL ES 3.0 размер составляет 4 * Vec4 * 256 элементов (общий размер 16384 байта) = не в порядке
Я подумал, что std140
должен гарантировать одинаковый макет на всех платформах?
Так в чем проблема и как ее исправить?
Мне нужен меньший размер для более быстрой работы (из-за меньшей пропускной способности для передачи)
Работает нормально на настольном компьютере, Apple iOS, но не работает на 2 графических процессорах Android ARM Mali, возможно, это ошибка в драйверах ARM Mali.
Это подтвержденная ошибка драйвера Mali, которая влияет на аннотацию row_major
для объявлений массивов. Обходной путь — применить аннотацию row_major
к юниформ-блоку, а не к элементу массива:
layout(std140, row_major) uniform _ObjMatrix {
mat4x3 ViewMatrix[256];
};
Просто чтобы избежать дублирования усилий - я ответил на этот вопрос на форумах community.arm.com. Похоже на ошибку драйвера Mali, обрабатывающую неквадратные матрицы по строкам.