Обзор игрового движка Panda3D и его особенностей
Я занимаюсь разработкой с использованием движка Panda3D почти 4 года. Уже достаточно хорошо разбираюсь в его особенностях. Этот движок малоизвестный и не достаточно популярный, поэтому хотелось бы поделиться информацией о нем.
Движок Panda3D разработан компанией Дисней и в последствии передан университету CMU и сообществу.
Лицензия была изменена на достаточно свободную - BSD, которая позволяет использовать движок и даже модифицировать его в том числе и в коммерческих целях без каких либо обязанностей выплачивать роялти.
На данный момент его разработкой занимается сообщество, а университет оказывает небольшую поддержку в виде предоставления хостинга для сборки и публикации новых версий.
Также разработка финансируется из пожертвований собранных через вебсайт Open Collective.
Исходный код движка полностью открыт, что позволяет глубже его изучить и при необходимости вносить изменения.
Возможности движка
Движок написан на языке C++ и небольшая его часть - на Python. Panda3D спроектирован таким образом чтобы разработка проектов с его использованием велась на языке Python в большей степени, а также на языке C++, если это необходимо.
Графическое API
- OpenGL (кроссплатформенный, основной вариант и наиболее поддерживаемый)
- Direct3D
- OpenGL ES
- Software Rendering
- Vulkan (на очень ранней стадии разработки)
Поддержка шейдеров
- NVIDIA CG
- Генератор шейдеров для NVIDIA CG (в комплекте поставляются простейшие шейдеры)
- GLSL (можно подключить GLSL шейдеры из проекта RenderPipeline)
- Генератор шейдеров для GLSL (на начальной стадии разработки)
Звук
- Поддержка 3D звука
- Звуковые библиотеки: OpenAL, FMOD
Физические движки
- Bullet (основной вариант)
- ODE
- Собственный движок PandaPhysics (используется для системы частиц)
- PhysX
Сеть
- HTTP
- TCP
- UDP (reliable UDP не поддерживается)
Графический интерфейс
- DirectGUI (собственная система UI, частично написана на Python, основной вариант, не достаточно гибкая, не очень удобная)
- libRocket (не поддерживался долгое время, удален в этом году)
- cefpython (сторонняя библиотека на основе движка браузера Chromium)
- LUI (сторонняя библиотека, в комплекте тема оформления по умолчанию, не развивается)
Поддержка операционных систем
- Windows версии 7 и выше (поддержка XP была прекращена в этом году)
- Linux
- Mac OSX (плохая поддержка шейдеров и графических API)
- Android (в разработке, в экспериментальном состоянии)
- WebGL (замена устаревшему плагину для браузера - Panda3D Runtime, на начальной стадии разработки)
Прочие возможности
- Система чистиц (инстумент для настройки частиц не развивается)
- Рассчет коллизий (используя физический движок)
- Поддержка системы конечных автоматов (FSM)
- Поддержка клавиатуры, мыши (включая raw input), геймпадов
- Инструменты профайлинга (как локальные, так и работающие по сети)
- Скелетная анимация (есть интерполяция и блендинг, но отсутствует поддержка IK)
- Встроенные средства процедурной анимации (перемещение, изменение масштаба, цвета)
- Иструменты упаковывания ассетов (используется собственный формат multify и виртуальная файловая система)
- Поддержка большого количества форматов графических ассетов
- ИИ (библиотека PandAI)
- Occlusion Culling (в том числе используя порталы)
- Hardware Instancing
- Поддержка LOD
Отличия от популярных движков
Крупные и достаточно известные игровые движки, такие как Unreal Engine 4, Unity3D и подобные развились до уровня конструкторов игр, в которых за пару кликов мышкой можно собрать готовую игру из доступных модулей. Такие движки содержат в себе редактор, который является обязательным инструментом и определяет весь workflow разработки. К примеру Unity3D полностью берет на себя задачу обработки C # скриптов.
У Panda3D подход к разработке несколько другой, многие ошибочно пытаются найти некоторый редактор игр сразу после установки движка. Так как игровые движки выросли до уровня констукторов игр, то для таких движков как Panda3D и ему подобных используют термин - framework.
Panda3D не содержит в себе ни конструктора игр, ни редактора игровых уровней. И так как он является некоммерческим, то стандартные ассеты высокого качества и магазин с ними тоже отсутствуют.
Движок не предлагает собственный workflow, а вместо этого встраивается в текущий. То есть все модули движка подключаются к стандартному C++ или Python приложению как отдельные библиотеки. Таким образом можно встраивать движок в том числе и в уже существующее приложение, а также использовать только те модули движка, которые необходимы в данный момент. Например в приложении рассчета физики можно полностью выключить рендеринг и использовать его таким образом на серверах.
Движок достаточно простой в изучении. Кривая сложности - линейная, то есть вы постепенно прогрессируете равными шагами. В отличие от Unreal Engine 4 и Unity3D, где кривая сложности - экспонента, когда очень просто начать и сделать прототип, но гораздо сложнее завершить начатое и решать более сложные задачи.
Структура движка
Внутренняя структура Panda3D представляет собой граф в виде дерева, где каждый элемент это контейнер ноды (NodePath). Каждый такой контейнер может содержать в себе одну ноду любого типа (на основе PandaNode) или ни одной (пустой контейнер). Нодами же могут быть меши с геометрией, коллайдеры, звуки, источники света, скелеты, кости, элементы интерфейса и другие объекты. Каждая нода упаковывается в свой собственный контейнер и из таких контейнеров строится дерево.
Для каждого контейнера ноды доступны такие параметры как положение его в пространтве, масштаб, материалы, текстуры, включение/выключение рендеринга и прочие. Контейнеры нод можно свободно перемещать между собой внутри дерева. Все параметры контейнера ноды будут наследовать и дочерние контейнеры, таким образом можно применить текстуру сразу ко всей ветке дерева или вообще выключить ее рендеринг.
Если необходимо изменить параметры которые относятся непосредственно к определенному типу ноды (например громкость звука или сила источника света), то нужно обращаться к ноде, которая находится внутри соответствующего контейнера. Данные параметры не наследуются.
Рендеринг графики
Стандартный рендеринг
Движок перешел в статус некоммерческой разработки очень давно, когда большинство современных графических технологий и возможностей отсутствовало. Вся разработка сейчас находится в руках сообщества, поэтому в нем остутствуют современные высококачественные шейдеры, системы рассчета теней и отражений.
В стандартном комплекте движка есть генератор шейдеров, который создает шейдеры в формате NVIDIA CG (версия генератора для GLSL еще в разработке). Он предоставляет следующие возможности:
- Простейшие модели шейдинга для Diffuse (Lambert) и Specular (Blinn-Phong)
- Тени для Direct Light и Spot Light (очень сильно снижают производительность)
- Cel-Shading (Toon-Shading)
- HDR
- Blur
- Bloom
- Ambient Occlusion
- Outline
- Normal Mapping и Parallax Bump Mapping
Материалы используют модель specular - glossiness (shininess) и текстурные карты, такие как normal map, diffuse, specular, glow, gloss, height, decal и прочие.
Но всего этого уже недостаточно чтобы выйти на современный уровень графики. Приложения использующие стандартные возможности Panda3D будут выглядеть как игры начала 00-х годов. Это обусловлено отсутствием современных шейдеров, PBR материалов и пост-процессинга.
RenderPipeline
RenderPipeline это сторонний проект, целью которого является пересмотреть стандартный способ рендеринга в Panda3D - Forward Rendering и вместо него предложить альтернативный - Deferred Rendering.
RenderPipeline представляет из себя библиотеку расширяющую возможности рендеринга в Panda3D и набор инструментов для настройки и визуализации процесса рендерига.
В отличие от specular - glossiness модели материалов и текстур в режиме RGB, используемых по умолчанию, RP использует roughness - metallic PBR и текстуры в режиме sRGB. Также он использует собственную систему освещения (RPLight) написанную на языке C++, которая теперь входит в комплект Panda3D, что упрощает установку и использование RenderPipeline.
RenderPipeline использует Deferred Rendering и модульную систему для рендеринга отдельных слоев/буферов (Stage), где каждый Stage использует свои шейдеры, а в конечном итоге они все объединяются в один кадр.
Также RP поддерживает систему плагинов, позволяющую расширять его возможности и добавлять новые плагины со своими шейдерами. В стандартный комплект входят следующие плагины:
- Ambient Occlusion (SSAO, HBAO, SSVO, ALCHEMY)
- Atmospheric Scattering
- Bloom
- Color Correction (пост процессинг включающий в себя Tonemapping, различные фильтры для камеры, автоматическую экспозицию, Color LUT, Sharpen)
- Depth of Field
- FXAA и SMAA
- Motion Blur
- Separable Screen Space Subsurface Scattering (SSSSS или Skin Shading)
- Sky Occlusion
- Тени от солнца, Spot Light и Point Light
- Voxel Global Illumination (в экспериментальном состоянии)
- Volumetric Clouds & Lighting (в экспериментальном состоянии)
- Screen Space Reflections (в экспериментальном состоянии)
Также RP включает в себя поддержку Normal Mapping, Parallax Bump Mapping, динамической смены времени суток (дня и ночи).
Инструменты визуализации позволяют в реальном времени отслеживать весь процесс рендеринга каждого Stage, и того как из них строится кадр.
Из минусов можно отметить, то что RP уже долгое время не развивается и многие шейдеры не достаточно оптимизированы. Но проект достаточно компактный, гибкий и хорошо документирован, что позволяет интегрировать мего в свой проект и поддерживать собственными силами.
Поддержка форматов графических ассетов
Panda3D поддерживает множество форматов текстур и моделей, а также инструментов для импорта/экспорта и конвертирования между форматами.
Для текстур поддерживаются форматы: PNG, JPEG, DXT, TGA и другие.
Для моделей используются следующие форматы:
- EGG (собственный текстовый формат)
- BAM (собственный бинарный формат)
- X (с ограничениями)
- glTF (в активной разработке)
Также существуют множество плагинов экспорта моделей для таких программ как:
- Blender (основной и наиболее поддерживаемый, есть экспорт в формат glTF)
- 3Ds Max
- Maya
YABEE
Blender плагин для экспорта моделей в формат EGG.
Основная версия, поддерживает Blender до версии 2.79, не развивается. Использует параметры материалов и текстуры из Blender Render.
Обновленная версия адаптированная под Blender 2.80+ и новые Cycles материалы.
Panda3D BAM Exporter
Blender плагин для экспорта моделей в формат BAM. Использует материалы совместимые с RenderPipeline.
blend2bam
Утилита конвертирования моделей из формата Blender в BAM.
Поддерживает несколько пайплайнов для конвертирования:
- Blender - glTF - BAM
- Blender - EGG - BAM
panda3d-gltf
Плагин для Panda3D который добавляет поддержку формата glTF в движок. Позволяет напрямую загружать файлы в формате glTF.
Минимальный пример
Минимальный пример который создает окно, загружает модель со скелетной анимацией и воспроизводит анимацию.
Игры использующие Panda3D
Toontown Online - старая MMORPG от Дисней, закрылась
Pirates of the Caribbean Online - старая MMORPG от Дисней, закрылась
Ghost Pirates of Vooju Island - adventure, доступна в Steam
A Vampyre Story - adventure, доступна в Steam
Подборка инди игр на itch.io
Мало картинок(
Судя по списку сделанных игр, кривая сложности представлена не линейной, а сигма-функцией.
Красноречиво.
Комментарий недоступен
Слишком много текста и слишком мало картинок, неплохобы привести примеры рендера, кода и тд а так не возникло желния качать движок даже что бы попробовать.
Добавила минимальный пример и скриншотов.
Разработчики пока не хотят пилить собранный в единое целое gui для работы с движком, а жаль. Панда могла бы конкурировать с годотом