Z-порядок с альфа-смешиванием в трехмерном мире
Я работаю над игрой в трехмерном мире только с двухмерными спрайтами (например, игра "Не голодай"). (OpenGL ES2 с C++)
В настоящее время я упорядочиваю элементы задом наперед, прежде чем рисовать их без пакета (поэтому 1 элемент = 1 вызов). Я хотел бы реализовать пакетирование в моей структуре, чтобы уменьшить количество вызовов отрисовки.
Вот что я получил на данный момент:
- Закажите все элементы моей сцены задом наперед.
- Отправить список заказов элементов в Renderer.
Renderer ищет в своем менеджере партий, существует ли партия для данного элемента с его Материалом.
- Пакет не существовал: создайте новый.
- Партия существует для элемента с этим Материалом: Добавить спрайт в партию.
Вычислить большую сетку со всеми спрайтами для каждой партии (1 тип материала = 1 партия).
Когда все партии в порядке, менеджер пакетов вычисляет команды рисования для средства визуализации.
Команды рисования процесса рендеринга (связать шейдер, связать текстуры, связать буферы, нарисовать элемент)
Изображение, чтобы показать мою проблему здесь: Изображение
Но у меня есть некоторые проблемы, потому что объекты могут находиться за другими объектами внутри другого пакета.
Как я могу сделать что-то подобное?
1 ответ
Похоже, вы пытаетесь оптимизировать рендеринг для двух взаимоисключающих целей.
- Рендеринг в отсортированном Z-порядке для получения правильных результатов прозрачности
- Рендеринг сгруппирован по типу материала, предположительно для уменьшения количества изменений состояния GL, возникающих при переключении материалов.
Один из них должен иметь приоритет над другим. Поскольку Z-порядок важен для правильного отображения прозрачности, вам, вероятно, придется иметь этот приоритет. Как только вы это сделаете, вы по-прежнему можете группировать предметы из того же материала в Z-порядке.