четверг, 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
Здесь все стандартно. Возможно, немного избыточно.