Лица нарисованы в порядке их определения. Теперь при вращении куба порядок их прорисовки не изменяется. Некоторые лица сначала рисуются рядом с камерой. Затем после этого рисуется какое-то лицо, но Z-тест говорит, что уже есть пиксель ближе к камере, поэтому рисовать не нужно.
Проблема здесь в том, что OpenGL | ES 2.0 не сортирует грани, когда они отображаются. Правильная обработка прозрачности и глубины остается серьезной проблемой в 3D-программировании, но для такого простого случая, как этот, вы можете просто отсортировать грани назад. Отрисовка на передний план называется «алгоритм художника», а сортировка - «сортировка по глубине» или «сортировка по z».
Простой, безусловно, не лучший и, безусловно, неэффективный способ может работать так:
- Рассчитать центр вершины грани
рассчитав среднее из трех
Вершины
- Проецирование их на экранное пространство путем преобразования их через камеру (вид + проекция) и возможные матрицы моделей
- Сортировка их Z-значений по алгоритму сортировки
- Построить буфер вершин с вершинами в этом порядке или просто переписать индексный буфер в новом порядке (меньше материала для перемещения, если вершины не изменены)
- Визуализация куба как обычно
Существуют более эффективные способы решения этой проблемы, и существуют всевозможные дополнительные оптимизации. Но я не нашел ни одного учебника, который бы охватил такой простой случай. Возможно, я просто не нашел правильных ключевых слов.