четверг, 27 апреля 2017 г.

Angie Engine

Много времени прошло с последнего сообщения. Было много чего переписано/переделано/перелопачено, настолько много, что я не удержался и переименовал движок :)
Встречайте, Angie Engine.

Концептуально изменилось вообще все, от базовых core-классов, до высокоуровневых классов движка: сцен граф, рендерер, ресурс менеджер и т.д.

Архитектура построения сцены, теперь компонентная. Примеры таких архитектур - движки Unity3D и Urho3D. Сцена описывается узлами, объединенными в иерархию "parent-childs". Каждый узел описывает некоторую трансформацию в пространстве (позицию, поворот, масштаб). Функциональность узла определяется и расширяется компонентами.

Ресурсы отделены от сцены. В данный момент существуют следующие типы ресурсов:

Texture
  Любые растровые данные: albedo, normalmap, roughness, metallic, ambient, cubemap, texture array, cubemap array и т.д.

Material
 Материал описывает набор сэмплер-стейтов и констант (юниформов), которые можно менять из вне (например из кода игровой логики). Также материал содержит код (MaterialRoutine), который преобразуется на этапе загрузки материала в glsl шейдер (в будущем также в hlsl шейдер).
 Поддерживается инстансинг материалов. Один и тот-же материал может быть инстанцирован, а для каждого инстанса может быть установлен свой набор текстур и констант, что позволяет уменьшить переключение между шейдерами при рендеринге и эффективно сортировать материалы.

StaticMesh
 Статическая сетка. Совокупность вершинного и индексного буфера. Меши можно загружать из файлов/ассетов или модифицировать вручную, создавая процедурные меши.

DynamicMesh
 Динамическая сетка. Используется для геометрий, которые нуждаются в частой модификации. Кстати, на примере с vertex-based-анимацией на моделях из оригинального Quake используется DynamicMesh.



SkinnedMesh
 Меш со скелетом. Отличается от статического меша форматом вершин (каждая вершина привязана к одной и более костям и содержит веса) и наличием скелета.

SkinnedAnim
 Анимация для SkinnedMesh. Содержит анимацию для всех или группы костей скелета.

В процессе Audio.

Рендерер.
 Рендерер теперь Clustered Forward.
 Вкратце, это forward renderer, при этом фрустум разбивается на кластеры 16x8x24. В каждом кластере хранятся списки источников освещения, которые передаются в буфер на GPU. Для этого на каждом кадре происходит frustum-shaped-вокселизация/кластеризация OBB источников. Все - с использованием SIMD инструкций для оптимизаций (SSE). В шейдере по xyz фрагмента определяется индекс кластера, по индексу извлекается список источников освещения, которыми шейдится фрагмент.
 Ниже приведено видео вокселизации источника освещения в Angie Engine.


 Кластерный рендеринг, для примера, используется в idTech6 (Doom 4) и Avalanche Engine.

 Теперь про освещение. Теперь оно Physically-based (Physically based rendering). Была выбрана техника Metallic/Roughness вместо Specular/Glossiness, т.к. при одних и тех же результатах Metallic/Roughness менее затратна по памяти, т.к. требует всего 2 канала, вместо 4-х. Для отражения используется предрассчитанная Evironment probe. Скоро планируется добавить Screen space reflections (SSR).

 Для отсечения невидимой геометрии и невидимых источников освещения внедрена портальная система. Которую можно продемонстрировать на уровне из Doom 3, загруженном в Angie Engine:

...........видео будет чуть позже.................

 Есть возможность расширять систему отсечений невидимой геометрии, не изменяя сам движок. Так я, чисто по-фану, написал два примера загрузки уровней из Quake и Quake 3 Arena / Quake Live с их BSP/PVS системами. При этом, код движка остается без изменений, отсечение происходит на "верхнем" уровне. Геометрия - в StaticMesh:


В примере можно увидеть, что фильтрация mipmap nearest. Это настраивается через сэмплер-стейты материала, и в данном случае сделано, чтобы сцена с уровнем из Quake выглядела наиболее приближенно к оригиналу.

суббота, 31 мая 2014 г.

Прогресс моего движка Angie Engine

Renderer
2D Scene, Multipass 2D materials
2D Shape scene
Widget-style GUI
3D Scene
3D Shape scene
Deferred rendering
MVT - Multiunit Virtual Textures (Improved megatexture pipeline)
Point Lights
Per-pixel light emission and specular
Per-pixel precomputed AO and static shadows
Per-vertex material
SSAO
HDR Bloom
KD - Tree level structure (for static geometry)
Skinned mesh, instancing (for dynamic geometry)
Solid mesh (for static and dynamic geometry)

Entity physics
Havok

Временно отключены:
directional lights,
spot lights,
light shafts,
point light cube shadows,
DOF,
forward-rendered glass pass,
glass cube shadows,
shadows on glass,
sky box,
HDR eye adaptation,
air distortion


пятница, 22 ноября 2013 г.

Angie Engine Tech Demo: Point Light Soft Shadows


Тени от точечных источников света. Для каждого такого источника сцена рендерится в кубическую карту (cubemap), при этом рендерится только глубина. Далее путем сравнения глубины фрагментов с глубиной в полученной в cubemap-е строится черно-белое изображение тени. Данное изображение размывается ping-pong фильтром для получения мягкой тени. Далее полученные две текстуры смешиваются друг с другом по расстоянию от фрагмента до источника света.

понедельник, 4 ноября 2013 г.

Lost Lands Tech Demo: Rendering passes, SSAO, Eye adaptation

Не знаю, что написать, поэтому прикреплю только видео некоторого прогресса в моем движке)

Screen Space Ambient Occlusion


Rendering passes


Eye adaptation


пятница, 1 ноября 2013 г.

Lost Lands Tech Demo: Glass, Light Volumes

В данной демонстрации использованы 2 техники: deferred для непрозрачных объектов и forward для стекла. Стеклянный куб на видео рисуется в два прохода (лицевая и нелицевая грань). Все точечные источники освещения имеют свой радиус действия, т.о. рисуются только те источники, которые в данный момент попадают в пирамиду видимости (проверка попадания сферы). Каждый точечный источник освещения рисуется в виде AABB. Для большей оптимизации отрисовки прозрачных объектов планируется реализовать проверку пересечения объемов освещения с объемом прозрачного объекта.
Параметры прозрачных объектов (материал,свет,бамп и т.п) ничем не отличаются от непрозрачных объектов за исключением того, что они имеют параметр "прозрачность", принимающий значение от 0 до 1. Возможно в последующем будет иметь смысл дать возможность задавать прозрачность объекта попиксельно, т.е. в альфа канале текстуры.



Немного о свете и материале
Я выложил несколько демонстраций, но так и не сказал, какими атрибутами обладают источники света и материал. Чтобы исправить данный недостаток я решил привести их в данном посте.

Итак, точечный источник освещения (Point Light Source):
vec3 position
rgb ambient
rgb diffuse
rgb specular
vec3 attenuation
float radius
Помимо стандартного параметра затухания (attenuation) введен дополнительный параметр - радиус действия источника. Радиус действия источника - это то расстояние, за пределами которого вклад действия источника в освещение сцены равен нулю.

Направленный источник освещения (Directed Light Source):
vec3 position
rgb ambient
rgb diffuse
rgb specular
Направленный источник освещения отличается от точечного отсутствием затухания и радиуса действия. Свет от него также распространяется во все стороны.

Прожектор (Spot Light Source):
vec3 position
rgb ambient
rgb diffuse
rgb specular
vec3 attenuation
float radius
float exponent
vec2 direction (третья компонента получается из условия нормировки)
float сutoff

Материал:
rgb emission
rgb ambient
rgb diffuse
rgb specular
float shininess
Здесь все стандартно. Возможно, немного избыточно.

понедельник, 21 октября 2013 г.

Deferred shading, Per pixel lighting, Bump

Прогресс не стоит на месте и после долгих раздумий было решено использовать Deferred shading :)
В качестве примера представлен точечный источник света и попиксельное освещение с использованием карты нормалей.

Часть 1


Часть 2


Часть 3 - Несколько источников света



Пример эффекта, полученного только путем настройки параметров источника света и материала на том же шейдере.