Список классов проекта Expanse
Введение
Проект классов рендеринга 3D сцены.
Назначение
Классы проекта позволяют добавлять дополнительное окно перед окном Gui для рендеринга 3D сцены и манипуляции объектами более высокого уровня (игровые/3D объекты как наборы компонентов/рендеров) по сравнению с отдельными компонентами/рендерами, предоставляемыми Covellite.Api.
Класс окна этого проекта является необязательным (можно обойтись только окном проекта Covellite.Gui), при его добавлении перед окном Gui будут отрисовываться сначала содержащиеся в нем 3D объекты, а уже поверх 3D сцены будет отрисовано Gui.
Диаграмма классов проекта
Классы проекта рассчитаны на рендеринг 3D сцены с учетом следующих возможностей:
- Обновление требуется для всех игровых объектов, а рендеринг - только для находящихся в поле зрения камеры.
- Разбиение сцены на ячейки (квадродерево) для минимизации количества проверок попадания объектов в поле зрения камеры.
- Использование уровней LOD (гарантированно дает выигрыш для высокополигональных объектов).
- Рендеринг в несколько проходов для отрисовки теней, отложенного освещения и постобработки.
Использование
Классы проекта создавались в расчете на логику использования, при которой формируются объекты, содержащие компонент обновления, при активации добавляющие идентификаторы своих объектов в очередь нужного прохода рендеринга, а после рендеринга сцены список рендеринга очищается.
C точки зрения здравого смысла игровая сцена может содержать следующие виды игровых объектов:
- Ландшафт (большое количество малополигональных объектов: ячейки поверхности, трава, камни, кусты, мусор):
- Единый объект для каждого типа объектов, рендерится всегда при помощи инстансинга.
- Единый компонент обновления, который добавляет идентификаторы всех объектов всех типов в очередь рендеринга.
- При рендеринге в функции обратного вызова инстанс-буфера удалившиеся от камеры ячейки заменяются приблизившимися (первый раз придется проверить все, затем можно заменять только те, что выпали из поля зрения камеры на те, что попали, таких ячеек между кадрами будет очень мало).
- Статические объекты (среднее количество среднеполигональных объектов: деревья, дома, стены и т.п.):
- Каждый объект рендеринтся сам по себе.
- Обновление для каждого объекта не требуется, но они должны содержаться в ячейке-контейнере квадродерева, комопнент обновления которой добавляет идентификаторы расположенных в нем объектов в очередь рендеринга.
- При рендеринге требуется отбрасывать объекты, не попадающие в поле зрения камеры, при этом квадродерево можно формировать на стадии добавления объектов в сцену.
- Акторы (небольшое количество высокополигональных анимированных объектов: персонаж, NPC, враги, монстры):
- Каждый объект рендерится как группа отдельных объектов разной внешности/экипировки.
- При обновлении требуется перемещение/действие в независимости от попадания в поле зрения камеры (анимации обновляются в функции обратного вызова вертексного буфера, которая вызывается только при рендеринге, т.е. автоматически только для видимых объектов).
- При рендеринге требуется отбрасывать объекты, не попадающие в поле зрения камеры (возможно, имеет смысл отбрасывать части модели, расположенной рядом с камерой) и использовать уровни LOD.
Для отрисовки 3D сцены необходимо при старте программы:
- Создать объект класса окна covellite::expanse::Window (после окна covellite::api::Window, но ранее окна covellite::gui::Window).
- Создать объект класса игрового мира (клиентский код, объект создается после окна covellite::expanse::Window и получает ссылку на него), который настраивает создание базовых игровых объектов, существующих всегда (таких, которые удаляются только при разрушении объекта игрового мира):
- Ландшафт.
- Базовая ячейка квадродерева (вложенные ячейки которой создаются и удаляются по мере движения камеры) формирует объект обновления, который при вызове (рекурсивно для дочерних ячеек) создает и удаляет статичные игровые объекты при движении камеры, проверяет видимость ячейки, в случае удачной проверки проверяет дочерние ячейки и объекты, добавляет попавшие в поле зрения камеры объекты в список на рендеринг с упорядочиванием по расстоянию до камеры.
- Особая ячейка-контейнер для всех акторов сцены, компоненты обновления которых формируют список рендеринга видимых акторов из идентификаторов требуемого уровня LOD.
Многопроходной рендеринг:
- Первый проход: рендеринг игровых объектов, расположенных рядом с камерой в буфер глубины для последующего расчета теней.
- Второй проход: рендеринг попавших в поле зрения камеры объектов в несколько внеэкранных поверхностей (цвет, нормали, ...)
- Третий проход: отложенное освещение и постпроцессинг с использованием внеэкранных поверхностей, заполненных на предыдущих проходах.