Современная кроссплатформенная 3D-графическая библиотека и структура рендеринга низкоуровневой графики
Delligent Engine-это легкая кроссплатформенная библиотека абстракции и рендеринга. Он предназначен для в полной мере воспользоваться преимуществами Direct3D12, Vulkan, Metal и WebGPU, одновременно поддерживая старые платформы через Direct3D11, OpenGL, OpenGLES и WebGL. Delligent Engine обнажает общий фронтальный API и использует HLSL в качестве универсального языка затенения на всех платформах и рендеринга на заднем плане. Представления шейдеров, специфичные для платформы (GLSL, MSL, DX Bytecode или Spirv) могут использоваться с соответствующими бэк-концами. Двигатель предназначен для использования в качестве графической подсистемы в игровом двигателе или в любом другом трехмерном приложении. Он распространяется по лицензии Apache 2.0 и может бесплатно использовать.
Платформа | D3D11 | D3D12 | OpenGL/GLES | Вулкан | Металл | Webgpu | Статус сборки |
---|---|---|---|---|---|---|---|
![]() | ✔ | ✔ | ✔ | ✔ | - | ✔ 3 | ![]() |
![]() | ✔ | ✔ | - | - | - | - | ![]() |
![]() | - | - | ✔ | ✔ | - | ✔ 3 | ![]() |
![]() | - | - | ✔ | ✔ | - | - | ![]() |
![]() | - | - | ✔ | ✔ 1 | ✔ 2 | ✔ 3 | ![]() |
![]() | - | - | ✔ | ✔ 1 | ✔ 2 | - | ![]() |
![]() | - | - | - | ✔ 1 | ✔ 2 | - | ![]() |
![]() | - | - | ✔ | - | - | ✔ | ![]() |
1 API Vulkan не поддерживается на платформах MacOS, iOS и TVOS и требует реализации портативности Vulkan, такой как Moltenvk или GFX-маршрута.
2 Доступно по коммерческой лицензии - пожалуйста, свяжитесь с нами для получения подробной информации.
3 Требуется нативная реализация WebGPU, рекомендуется Dawn.
#if defined(_WIN32)
... #elif defined(LINUX)
... #elif defined(ANDROID)
...#if defined(D3D11)
... #elif defined(D3D12)
#elif defined(OPENGL)
...Минимальные поддерживаемые версии API низкого уровня:
Это мастер -репозиторий, который содержит четыре подмодуля. Чтобы получить репозиторий и все подмодули, используйте следующую команду:
git clone --recursive https://github.com/DiligentGraphics/DiligentEngine.git
При обновлении существующего репозитория не забудьте обновить все подмодули:
git pull
git submodule update --recursive
Это также хорошая идея, чтобы перезапустить Cmake и выполнить чистую перестройку после получения последней версии.
Мастер репозиторий включает в себя следующие подмодулы:
Delligent Engine использует Cmake в качестве кроссплатформенного инструмента сборки. Чтобы начать использование CMAKE, загрузите последний выпуск (требуется 3,20 или более позднее). Еще одна предпосылка для сборки - это интерпретатор Python (3,0 или более поздний цвет требуется). Если после следующих инструкций ниже у вас есть проблемы с построением/запуском, посмотрите на устранение неполадок.
Стройте предпосылки:
Поддержка .NET требует .NET SDK 6.0 или более поздней версии.
Используйте или инструмент Cmake Gui или командную строку для генерации файлов сборки. Например, чтобы генерировать 64-разрядные решения для Visual Studio 2022 и файлы проекта в папке Build/Win64 , перейдите в корневую папку двигателя и запустите следующую команду:
cmake -S . -B ./build/Win64 -G "Visual Studio 17 2022" -A x64
Вы можете генерировать решение Win32, которое нацелено на Win8.1 SDK, используя следующую команду:
cmake -D CMAKE_SYSTEM_VERSION=8.1 -S . -B ./build/Win64_8.1 -G "Visual Studio 17 2022" -A x64
Если вы используете Mingw, вы можете генерировать файлы создания, используя приведенную ниже команду (обратите внимание, что функциональность будет ограничена и что Mingw не является рекомендуемым способом создания двигателя):
cmake -S . -B ./build/MinGW -D CMAKE_BUILD_TYPE=Release -G "MinGW Makefiles"
Чтобы включить Vulkan Valideration, вам нужно будет загрузить Vulkan SDK и добавить переменную среды VK_LAYER_PATH
, которая содержит путь к каталогу BIN в папке установки VulkansDK.
Откройте файл DiligentEngine.sln в папке Build/Win64 , выберите конфигурацию и создайте двигатель. Установите желаемый проект в качестве стартап -проекта (по умолчанию, будет выбран GLTF Viewer) и запустите его.
По умолчанию приложения примеров и учебных приложений покажут диалоговое окно «Выбор бэкэнд». Используйте следующие параметры командной строки, чтобы заставить D3D11, D3D12, OpenGL или Vulkan Mode: -Mode D3D11 , -MODE D3D12 , -MODE GL или -MODE VK . Если вы хотите запустить приложение за пределами среды Visual Studio, папка активов приложения должна быть установлена в качестве рабочего каталога. (Для Visual Studio это автоматически настроено CMAKE). В качестве альтернативы, вы можете перейти к цели сборки или установки папки и запустить исполняемый файл оттуда.
Чтобы сгенерировать файлы сборки для универсальной платформы Windows, вам необходимо определить следующие две переменные Cmake:
CMAKE_SYSTEM_NAME=WindowsStore
CMAKE_SYSTEM_VERSION=< Windows Version >
Например, чтобы генерировать 64-разрядное решение для Visual Studio 2022 и файлы проектов в папке Build/UWP64 , запустите следующую команду из корневой папки двигателя:
cmake -D CMAKE_SYSTEM_NAME=WindowsStore -D CMAKE_SYSTEM_VERSION=10.0 -S . -B ./build/UWP64 -G "Visual Studio 17 2022" -A x64
Установите желаемый проект в качестве стартап -проекта (по умолчанию, будет выбран GLTF Viewer) и запустите его.
По умолчанию приложения будут работать в режиме D3D12. Вы можете выбрать D3D11 или D3D12, используя следующие параметры командной строки: -Моде D3D11 , -MODE D3D12 .
ПРИМЕЧАНИЕ. Можно сгенерировать решение, которое нацелено на Windows 8.1, определяя CMAKE_SYSTEM_VERSION = 8.1 переменная CMAKE, но оно не будет построить, поскольку он будет использовать инструмент Visual Studio 2013 (V120), в котором отсутствует надлежащая поддержка C ++ 14.
Ваша среда Linux должна быть настроена для разработки C ++. Если это уже есть, убедитесь, что ваши инструменты C ++ актуальны, поскольку прилежный двигатель использует современные функции C ++ (рекомендуется Clang 10 или более
Вам может потребоваться установить следующие пакеты:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install libx11-dev
sudo apt-get install mesa-common-dev
sudo apt-get install mesa-utils
sudo apt-get install libgl-dev
sudo apt-get install python3-distutils
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libxrandr-dev
sudo apt-get install libxinerama-dev
sudo apt-get install libxcursor-dev
sudo apt-get install libxi-dev
Для настройки Vulkan вам также нужно:
Чтобы сгенерировать файлы создания для конфигурации отладки, запустите следующую команду Cmake из корневой папки двигателя:
cmake -S . -B ./build -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="Debug"
Чтобы построить двигатель, запустите следующую команду:
cmake --build ./build
На Ubuntu 23 и более нове он может потерпеть крах, если у вас нет Libtinfo5, вам нужно добавить его.
Корневая папка двигателя содержит файлы настройки кода Visual Studio, которые настраивают IDE для создания двигателя. Вы можете запускать приложения непосредственно из IDE. Чтобы запустить приложение из командной строки, папка Apper's Assets должна быть текущим каталогом.
Пожалуйста, убедитесь, что ваша машина настроена на разработку Android. Загрузите Android Studio, установите и настраивайте NDK и Cmake и другие необходимые инструменты. NDK R24 или позже требуется. Если вы не используете версию Cmake в комплекте с Android Studio, убедитесь, что ваши файлы сборки правильно настроены. Чтобы убедиться, что ваша среда правильно настроена, попробуйте построить образец чайников, а также учебные пособия Android Vulkan.
Открытые усердные папки/папку Android с Android Studio для создания и запуска учебных пособий и образцов на Android.
По умолчанию приложения будут работать в режиме Vulkan. Чтобы запустить их в режиме Vulkan, добавьте следующие флаги запуска: --es mode gles
(в Android Studio, перейдите к меню «Редактировать конфигурации»)
Предварительные условия:
После того, как вы клонируете репо, запустите следующую команду из корневой папки двигателя, чтобы создать проект XCode:
cmake -S . -B ./build/MacOS -G "Xcode"
Проект будет расположен в папке build/MacOS
.
Обратите внимание, что если Cmake не может найти компилятора, вам может потребоваться запустить следующую команду:
sudo xcode-select --reset
По умолчанию нет реализации Vulkan на macOS. Прилежная загрузка двигателя динамически динамически может использовать реализацию портативности Вулкана, такую как Moltenvk или GFX-маршрута. Установите vulkansdk и убедитесь, что ваша система правильно настроена, как описано здесь. В частности, вам может потребоваться определить следующие переменные среды (при условии, что Vulkan SDK установлен по адресу /Users/MyName/VulkanSDK/1.3.290.0
, и вы хотите использовать Moltenvk):
export VULKAN_SDK=/Users/MyName/VulkanSDK/1.3.290.0/macOS
export PATH=$VULKAN_SDK/bin:$PATH
export DYLD_LIBRARY_PATH=$VULKAN_SDK/lib:$DYLD_LIBRARY_PATH
export VK_ADD_LAYER_PATH=$VULKAN_SDK/share/vulkan/explicit_layer.d
export VK_ICD_FILENAMES=$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json
export VK_DRIVER_FILES=$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json
Обратите внимание, что переменные среды, установленные в оболочке, не видны приложениями, запущенными с LaunchPad или другого настольного графического интерфейса. Таким образом, чтобы убедиться, что приложение находит библиотеки Vulkan, его необходимо запустить из командной строки. По той же причине файл проекта XCode также должен быть открыт из оболочки с помощью команды open
. С версиями XCode 7 и более поздним
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
Пожалуйста, обратитесь к этой странице для получения более подробной информации.
DYLD_LIBRARY_PATH
и LD_LIBRARY_PATH
игнорируются на macOS, если только защита целостности системы не отключена (что обычно не рекомендуется). Чтобы исполнить, чтобы найти библиотеку Вулкан, она должна быть в RPATH. Если установлена переменная среды VULKAN_SDK
и указывает на правильное местоположение, Delligent Engine будет автоматически настроить RPATH для всех приложений.
Последняя проверенная версия SDK Vulkan: 1.3.290.0.
Предварительные условия:
Запустите команду ниже из корневой папки двигателя, чтобы генерировать проект XCode, настроенный для iOS Build:
cmake -S . -B ./build/iOS -DCMAKE_SYSTEM_NAME=iOS -G "Xcode"
При необходимости вы можете предоставить цель развертывания iOS (требуется 13,0 или позже), а также другие параметры, например:
cmake -S . -B ./build/iOS -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 -G "Xcode"
iphonesimulator
System. Вы также можете использовать переменную CMAKE_OSX_ARCHITECTURES
для указания целевой архитектуры, например:
cmake -S . -B ./build/iOSSim -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=arm64 -G "Xcode"
Откройте файл проекта Xcode в папке build/IOS
и создайте двигатель. Чтобы запустить приложения на устройстве iOS, вам нужно будет установить соответствующую команду разработчиков в настройках проекта.
Чтобы включить Vulkan на iOS, загрузите и установите vulkansdk. На iOS нет вулканского погрузчика, и прилежные связи двигателя непосредственно с Moltenvk XCFrameWork (см. Руководство по установке Moltenvk), который реализует Vulkan на металле. Чтобы включить Vulkan в прилежном двигателе на iOS, укажите путь к Vulkan SDK, например, при запуске Cmake (при условии, что Vulkan SDK установлен по адресу /Users/MyName/VulkanSDK/1.3.290.0
):
cmake -DCMAKE_SYSTEM_NAME=iOS -DVULKAN_SDK=/Users/MyName/VulkanSDK/1.3.290.0 -S . -B ./build/iOS -G "Xcode"
По умолчанию двигатель связывается с Moltenvk Xcframework, расположенным в Vulkan SDK. Если это не желательно или приложение хочет использовать конкретную библиотеку, оно может предоставить полный путь к библиотеке через переменную Cmake MOLTENVK_LIBRARY
.
См. Руководство пользователя Moltenvk для получения дополнительной информации об установке и использовании Moltenvk.
Последняя проверенная версия SDK Vulkan: 1.3.290.0.
Стройте предпосылки:
Активировать путь и другие переменные среды в текущем терминале
source ${PATH_TO_EMSDK} /emsdk/emsdk_env.sh
${PATH_TO_EMSDK}/emsdk/emsdk_env.bat
вместо source ${PATH_TO_EMSDK}/emsdk/emsdk_env.sh
Чтобы сгенерировать проект, запустите следующую команду Cmake из корневой папки двигателя:
emcmake cmake -S . -B ./build/Emscripten -G "Ninja"
Чтобы построить двигатель, запустите следующую команду:
cmake --build ./build/Emscripten
Чтобы проверить приложения Emscripten, запустите базовый веб -сервер
cd ./build/Emscripten
python https_server.py
Откройте браузер и перейдите на http://localhost
Например, учебник Hello Triangle будет доступен в
http://localhost/DiligentSamples/Tutorials/Tutorial01_HelloTriangle/Tutorial01_HelloTriangle.html
Чтобы получить доступ к серверу с другого компьютера в локальной сети, используйте HTTPS Server. Чтобы включить это, сначала установите cryptography
модуль. Вы можете сделать это, выполнив следующую команду:
pip install cryptography
Чтобы запустить сервер HTTPS, используйте следующую команду:
python https_server.py --mode=https
Используйте протокол HTTPS, чтобы открыть страницы. Например:
https://localhost/DiligentSamples/Tutorials/Tutorial01_HelloTriangle/Tutorial01_HelloTriangle.html
При использовании HTTPS -сервера, в отличие от HTTP -сервера, вы можете встретить следующую ошибку при загрузке страницы: net::ERR_CERT_AUTHORITY_INVALID
.
Есть два способа решить эту проблему:
Advanced
, а затем выберите Proceed to localhost (unsafe)
.python https_server.py --mode=https --register
Мы используем порты по умолчанию для протоколов HTTP/HTTPS, 80
и 443
соответственно. Если у вас уже есть сервер, работающий на этих портах, вы можете указать другой номер порта, используя аргумент --port
и включить соответствующий номер порта в URL -адрес после IP -адреса. Например:
http://localhost:${YOUR_PORT}/DiligentSamples/Tutorials/Tutorial01_HelloTriangle/Tutorial01_HelloTriangle.html
Delligent имеет модульную структуру, поэтому для вашего проекта вы можете использовать только те подмодули, которые реализуют требуемую функциональность. На приведенной ниже диаграмме показаны зависимости между модулями.
Core
|
+------>Tools----------.
| | |
| V |
+------->FX---------. |
| | |
| V V
'----------------->Samples
Не забудьте рекурсивно инициализировать подмодули, если вы добавляете усердные репо в качестве подмодулей в ваш проект.
Если ваш проект использует Cmake, добавление прилежного двигателя требует всего несколько строк кода. Предположим, что структура каталогов выглядит так:
|
+-DiligentCore
+-HelloDiligent.cpp
Затем необходимо сделать следующие шаги:
add_subdirectory(DiligentCore)
Ниже приведен пример файла Cmake:
cmake_minimum_required ( VERSION 3.6)
project (HelloDiligent CXX)
add_subdirectory (DiligentCore)
add_executable (HelloDiligent WIN32 HelloDiligent.cpp)
target_compile_options (HelloDiligent PRIVATE -DUNICODE)
target_link_libraries (HelloDiligent
PRIVATE
Diligent-GraphicsEngineD3D11-shared
Diligent-GraphicsEngineOpenGL-shared
Diligent-GraphicsEngineD3D12-shared
Diligent-GraphicsEngineVk-shared
)
copy_required_dlls(HelloDiligent)
copy_required_dlls()
- это удобная функция, которая копирует общие библиотеки рядом с исполняемым файлом, чтобы система могла найти и загружать их. Пожалуйста, также посмотрите на начало работы для Windows и Linux.
На большинстве платформ основные библиотеки двигателей встроены как в статических, так и в динамических версиях (например, Diligent-GraphicsEngineD3D12-static
и Diligent-GraphicsEngineD3D12-shared
). Вы можете выбрать, с какой версией ссылается, изменив целевое имя в команде target_link_libraries()
cmake. При связывании с динамическими библиотеками будет определен макрос ENGINE_DLL
, и библиотеки должны будут быть загружены во время выполнения. Например, для Backend Direct3D12:
# if ENGINE_DLL
// Load the dll and import GetEngineFactoryD3D12() function
auto GetEngineFactoryD3D12 = LoadGraphicsEngineD3D12();
# endif
auto * pFactoryD3D12 = GetEngineFactoryD3D12();
При использовании статического связывания макрос ENGINE_DLL
не будет определен, а функция GetEngineFactoryD3D12
будет статически связана с исполняемым файлом.
Файл SampleApp.cpp приводит пример того, как инициализировать двигатель на разных платформах, используя статическое или динамическое связывание.
Вы можете использовать FetchContent для загрузки прилежных модулей двигателя. Единственное предостережение заключается в том, что вам необходимо указать исходный каталог для каждого модуля, чтобы быть таким же, как и имя модуля, чтобы можно было найти файлы заголовков. Ниже приведен пример файла cmake, который использует FetchContent:
cmake_minimum_required ( VERSION 3.6)
project (HelloDiligent CXX)
include (FetchContent)
FetchContent_Declare(
DiligentCore
GIT_REPOSITORY https://github.com/DiligentGraphics/DiligentCore.git
SOURCE_DIR _deps/DiligentCore
)
FetchContent_Declare(
DiligentTools
GIT_REPOSITORY https://github.com/DiligentGraphics/DiligentTools.git
SOURCE_DIR _deps/DiligentTools
)
FetchContent_Declare(
DiligentFX
GIT_REPOSITORY https://github.com/DiligentGraphics/DiligentFX.git
SOURCE_DIR _deps/DiligentFX
)
FetchContent_MakeAvailable(DiligentCore DiligentTools DiligentFX)
add_executable (HelloDiligent WIN32 HelloDiligent.cpp)
target_include_directories (HelloDiligent
PRIVATE
${diligentcore_SOURCE_DIR}
${diligenttools_SOURCE_DIR}
${diligentfx_SOURCE_DIR}
)
target_compile_definitions (HelloDiligent PRIVATE UNICODE)
target_link_libraries (HelloDiligent
PRIVATE
Diligent-BuildSettings
Diligent-GraphicsEngineD3D11-shared
Diligent-GraphicsEngineD3D12-shared
Diligent-GraphicsEngineOpenGL-shared
Diligent-GraphicsEngineVk-shared
DiligentFX
)
copy_required_dlls(HelloDiligent)
Если ваш проект не использует CMAKE, рекомендуется создавать библиотеки с помощью CMAKE и добавить их в вашу систему сборки. Вы можете скачать последние артефакты сборки от GitHub.
Глобальный каталог установки Cmake контролируется переменной CMAKE_INTALL_PREFIX. Обратите внимание, что по умолчанию по умолчанию /usr/local
на Unix и c:/Program Files/${PROJECT_NAME}
в Windows, что может не быть тем, что вы хотите. Используйте -D CMAKE_INSTALL_PREFIX=install
для использования локальной install
папки вместо этого:
cmake -S . -B ./build/Win64 -D CMAKE_INSTALL_PREFIX=install -G "Visual Studio 17 2022" -A x64
Чтобы установить библиотеки и файлы заголовков, запустите следующую команду Cmake из папки Build:
cmake --build . --target install
Справочник по установке DiligentCore будет содержать все, что необходимо для интеграции двигателя:
Более простой способ - связать с динамическими библиотеками. При связывании статически вам нужно будет перечислить DiligentCore, а также все сторонние библиотеки, используемые двигателем. Кроме того, вам также необходимо указать системные библиотеки, специфичные для платформы. Например, для платформы Windows список библиотек, с которыми ваш проект должен будет ссылаться, может выглядеть так:
DiligentCore.lib glslang.lib HLSL.lib OGLCompiler.lib OSDependent.lib spirv-cross-core.lib SPIRV.lib SPIRV-Tools-opt.lib SPIRV-Tools.lib glew-static.lib GenericCodeGen.lib MachineIndependent.lib dxgi.lib d3d11.lib d3d12.lib d3dcompiler.lib opengl32.lib
Заголовки Deligent Engine требуют определения одного из следующих макросов платформы как 1
: PLATFORM_WIN32
, PLATFORM_UNIVERSAL_WINDOWS
, PLATFORM_ANDROID
, PLATFORM_LINUX
, PLATFORM_MACOS
, PLATFORM_IOS
.
Вы можете управлять тем, какие компоненты двигателя вы хотите установить, используя следующие параметры Cmake: DILIGENT_INSTALL_CORE
, DILIGENT_INSTALL_FX
, DILIGENT_INSTALL_SAMPLES
и DILIGENT_INSTALL_TOOLS
.
Другим способом интеграции двигателя является создание файлов сборки (таких как проекты Visual Studio) и добавить их в систему сборки. Настройка, описанная ниже, может помочь настроить настройки для ваших конкретных потребностей.
Доступные параметры Cmake суммированы в таблице ниже:
Вариант | Значение по умолчанию | Описание |
---|---|---|
DILIGENT_NO_DIRECT3D11 | Нет | Не строить Backend Direct3D11 |
DILIGENT_NO_DIRECT3D12 | Нет | Не строить Backend Direct3D12 |
DILIGENT_NO_OPENGL | Нет | Не строить бэкэнд OpenGL |
DILIGENT_NO_VULKAN | Нет | Не строить бэкэнд Vulkan |
DILIGENT_NO_METAL | Нет | Не строить металлический бэкэнд |
DILIGENT_NO_WEBGPU | Нет | Не строить бэкэнд WebGPU |
DILIGENT_NO_ARCHIVER | Нет | Не строить архивателя |
DILIGENT_NO_RENDER_STATE_PACKAGER | Нет | Не строить инструмент рендеринга State Packager |
DILIGENT_ENABLE_DRACO | Нет | Включить поддержку сжатия Draco в GLTF Loader |
DILIGENT_USE_RAPIDJSON | Нет | Используйте анализатор Rapidjson в GLTF Loader |
DILIGENT_BUILD_TOOLS | Да | Создайте инструменты модуля |
DILIGENT_BUILD_FX | Да | Построить модуль FX |
DILIGENT_BUILD_SAMPLES | Да | Построить образцы модуля |
DILIGENT_BUILD_SAMPLE_BASE_ONLY | Нет | Создайте только проект SampleBase и никаких других образцов/учебных пособий |
DILIGENT_BUILD_TESTS | Нет | Построить модульные тесты |
DILIGENT_NO_GLSLANG | Нет | Не строить Glslang и Spriv-Tools |
DILIGENT_NO_HLSL | Нет | Отключить поддержку HLSL в бэкэндах без обращения |
DILIGENT_NO_FORMAT_VALIDATION | Да | Отключить проверку форматирования исходного кода |
DILIGENT_LOAD_PIX_EVENT_RUNTIME | Нет | Включить поддержку событий Pix |
DILIGENT_NVAPI_PATH | Путь к NVAPI SDK | |
DILIGENT_INSTALL_CORE | Да | Установите основной модуль |
DILIGENT_INSTALL_TOOLS | Да | Установите модуль инструментов |
DILIGENT_INSTALL_FX | Да | Установите модуль FX |
DILIGENT_INSTALL_SAMPLES | Да | Установите модуль образцов |
DILIGENT_INSTALL_PDB | Нет | Установить базу данных отладки программы |
DILIGENT_DEAR_IMGUI_PATH | Необязательный путь к предоставлению пользователям дорогого Imgui Project | |
DILIGENT_ARGS_DIR | Необязательный путь к предоставленному пользователю проекту ARGS | |
DILIGENT_NUKLEAR_DIR | Необязательный путь к предоставлению пользователям нуклеарного проекта | |
DILIGENT_MSVC_COMPILE_OPTIONS | Дополнительные параметры компиляции MSVC для всех конфигураций | |
DILIGENT_MSVC_DEBUG_COMPILE_OPTIONS | Дополнительные параметры компиляции MSVC для конфигурации отладки | |
DILIGENT_MSVC_RELEASE_COMPILE_OPTIONS | /Gl /arch: avx2 | Дополнительные параметры компиляции MSVC для конфигураций выпуска |
DILIGENT_CLANG_COMPILE_OPTIONS | Дополнительные параметры компиляции Clang для всех конфигураций | |
DILIGENT_CLANG_DEBUG_COMPILE_OPTIONS | Дополнительные параметры компиляции Clang для конфигурации отладки | |
DILIGENT_CLANG_RELEASE_COMPILE_OPTIONS | -Мавкс2 | Дополнительные параметры компиляции Clang для конфигураций выпуска |
DILIGENT_USD_PATH | Путь к папке USD -установки |
По умолчанию все блокировки, доступные на текущей платформе. Чтобы отключить конкретные бэк-энды, используйте следующие параметры: DILIGENT_NO_DIRECT3D11
, DILIGENT_NO_DIRECT3D12
, DILIGENT_NO_OPENGL
, DILIGENT_NO_VULKAN
, DILIGENT_NO_METAL
, DILIGENT_NO_WEBGPU
. Бэкэнд WebGPU включен по умолчанию при создании для Интернета. Чтобы включить его на других платформах, используйте DILIGENT_NO_WEBGPU=OFF
. Параметры можно установить через пользовательский интерфейс Cmake или из командной строки, как в примере ниже:
cmake -D DILIGENT_NO_DIRECT3D11=TRUE -S . -B ./build/Win64 -G "Visual Studio 17 2022" -A x64
Кроме того, отдельные компоненты двигателя могут быть включены или отключены, используя следующие параметры: DILIGENT_BUILD_TOOLS
, DILIGENT_BUILD_FX
, DILIGENT_BUILD_SAMPLES
. Если вы хотите только создать проект SampleBase
, вы можете использовать опцию DILIGENT_BUILD_SAMPLE_BASE_ONLY
.
По умолчанию Vulkan Back-End связан с GLSLANG, который позволяет компиляции шейдеров HLSL и GLSL для Spirv во время выполнения. Если компиляция времени выполнения не требуется, GLSLANG может быть отключен с помощью опции CMake DILIGENT_NO_GLSLANG
. Кроме того, поддержка HLSL в бэкэндах без обработки 3D может быть отключена с помощью опции DILIGENT_NO_HLSL
. Включение вариантов значительно уменьшает размер вильканских и открытых двоичных файлов, которые могут быть особенно важны для мобильных приложений.
Delligent Engine использует формат Clang для обеспечения последовательного форматирования по всей базе кода. Проверка может быть отключена с помощью опции Cmake DILIGENT_NO_FORMAT_VALIDATION
. Обратите внимание, что любой запрос на вытягивание не удастся, если будут обнаружены проблемы с форматированием.
Delligent Engine использует обширную проверку, которая всегда включена в сборку отладки. Некоторые из проверок могут быть включены в конфигурациях выпуска, установив опцию Cmake DILIGENT_DEVELOPMENT
.
Чтобы включить поддержку событий PIX, установите флаг Cmake DILIGENT_LOAD_PIX_EVENT_RUNTIME
.
Чтобы включить некоторые расширенные функции на графических процессорах NVIDIA (например, нативную косвенную поддержку Multi Draw в Direct3D11), загрузите NVAPI и установите переменную DILIGENT_NVAPI_PATH
Cmake.
Delligent Engine использует несколько сторонних библиотек. Если файл CMAKE приложения определяет любую из этих библиотек, Diligent будет использовать существующие цели. Приложение должно будет убедиться, что настройки сборки совместимы с усердным.
Сллежный двигатель позволяет клиентам настраивать настройки сборки, предоставляя файл скрипта конфигурации, который определяет следующие дополнительные функции Cmake:
custom_configure_build()
- определяет глобальные свойства сборки, такие как конфигурации сборки, флаги компиляции C/C ++, флаги ссылок и т. Д.custom_pre_configure_target()
- определяет пользовательские настройки для каждой цели в сборке и вызывается до того, как система сборки двигателя начнет настраивать цель.custom_post_configure_target()
- вызван после того, как система сборки двигателя настроила цель, чтобы позволить клиенту переопределить свойства, установленные двигателем. Путь к сценарию конфигурации должен быть предоставлен с помощью переменной BUILD_CONFIGURATION_FILE
при запуске Cmake и должен быть относительно папки Cmake Root, например:
cmake -D BUILD_CONFIGURATION_FILE=BuildConfig.cmake -S . -B ./build/Win64 -G "Visual Studio 17 2022" -A x64
Если определено, функция custom_configure_build()
вызывается перед добавлением какой -либо цели сборки. По умолчанию Cmake определяет следующие четыре конфигурации: отладка, выпуск, relwithdebinfo, minsizerel. Если вы хотите, вы можете определить свои собственные конфигурации сборки, установив переменную CMAKE_CONFIGURATION_TYPES
. Например, если вы хотите иметь только две конфигурации: Debug и Releasemt, добавьте следующую строку в функцию custom_configure_build()
:
set (CMAKE_CONFIGURATION_TYPES Debug ReleaseMT CACHE STRING "Configuration types: Debug, ReleaseMT" FORCE )
Система сборки должна знать список конфигураций отладки и выпуска (оптимизированных), поэтому должны также быть установлены следующие две переменные, когда определена переменная CMAKE_CONFIGURATION_TYPES
:
set (DEBUG_CONFIGURATIONS DEBUG CACHE INTERNAL "" FORCE )
set (RELEASE_CONFIGURATIONS RELEASEMT CACHE INTERNAL "" FORCE )
Обратите внимание, что из -за специфики CMAKE, имена конфигурации, указанные в DEBUG_CONFIGURATIONS
и RELEASE_CONFIGURATIONS
должны быть зачислены .
Если вы определите какую -либо конфигурацию, отличную от четырех стандартных Cmake, вам также необходимо установить следующие переменные, для каждой новой конфигурации:
CMAKE_C_FLAGS_<Config>
- c компиляции флаговCMAKE_CXX_FLAGS_<Config>
- C ++ Компиляции ФлагиCMAKE_EXE_LINKER_FLAGS_<Config>
- Флаги исполняемой ссылкиCMAKE_SHARED_LINKER_FLAGS_<Config>
- Общие флаги ссылки на библиотекуНапример:
set (CMAKE_C_FLAGS_RELEASEMT "/MT" CACHE INTERNAL "" FORCE )
set (CMAKE_CXX_FLAGS_RELEASEMT "/MT" CACHE INTERNAL "" FORCE )
set (CMAKE_EXE_LINKER_FLAGS_RELEASEMT "/OPT:REF" CACHE INTERNAL "" FORCE )
set (CMAKE_SHARED_LINKER_FLAGS_RELEASEMT "/OPT:REF" CACHE INTERNAL "" FORCE )
Ниже приведен пример функции custom_configure_build ():
function (custom_configure_build)
if (CMAKE_CONFIGURATION_TYPES)
# Debug configurations
set (DEBUG_CONFIGURATIONS DEBUG CACHE INTERNAL "" FORCE )
# Release (optimized) configurations
set (RELEASE_CONFIGURATIONS RELEASEMT CACHE INTERNAL "" FORCE )
# CMAKE_CONFIGURATION_TYPES variable defines build configurations generated by cmake
set (CMAKE_CONFIGURATION_TYPES Debug ReleaseMT CACHE STRING "Configuration types: Debug, ReleaseMT" FORCE )
set (CMAKE_CXX_FLAGS_RELEASEMT "/MT" CACHE INTERNAL "" FORCE )
set (CMAKE_C_FLAGS_RELEASEMT "/MT" CACHE INTERNAL "" FORCE )
set (CMAKE_EXE_LINKER_FLAGS_RELEASEMT "/OPT:REF" CACHE INTERNAL "" FORCE )
set (CMAKE_SHARED_LINKER_FLAGS_RELEASEMT "/OPT:REF" CACHE INTERNAL "" FORCE )
endif ()
endfunction ()
Если определено, custom_pre_configure_target()
требуется для каждой цели, созданной системой сборки, и позволяет настраивать свойства целевых специфических.
По умолчанию система сборки устанавливает некоторые целевые свойства. Если custom_pre_configure_target()
устанавливает все необходимые свойства, он может сообщить системе сборки, что дальнейшая обработка не требуется TRUE
установив TARGET_CONFIGURATION_COMPLETE
set (TARGET_CONFIGURATION_COMPLETE TRUE PARENT_SCOPE )
Ниже приведен пример функции custom_pre_configure_target()
:
function (custom_pre_configure_target TARGET )
set_target_properties ( ${TARGET} PROPERTIES
STATIC_LIBRARY_FLAGS_RELEASEMT /LTCG
)
set (TARGET_CONFIGURATION_COMPLETE TRUE PARENT_SCOPE )
endfunction ()
Если клиент должен только переопределить некоторые настройки, он может определить функцию custom_post_configure_target()
, которая вызвана после того, как двигатель завершит настройку цели, например:
function (custom_post_configure_target TARGET )
set_target_properties ( ${TARGET} PROPERTIES
CXX_STANDARD 17
)
endfunction ()
Пожалуйста, обратитесь к этой странице. Кроме того, учебники и образцы, перечисленные ниже, являются хорошим местом для начала.
Смотрительное обозначение государства рендеринга-это язык, основанный на JSON, который описывает шейдеры, состояния трубопроводов, подписи ресурсов и другие объекты в удобной форме, например:
{
"Shaders" : [
{
"Desc" : {
"Name" : " My Vertex shader " ,
"ShaderType" : " VERTEX "
},
"SourceLanguage" : " HLSL " ,
"FilePath" : " cube.vsh "
},
{
"Desc" : {
"Name" : " My Pixel shader " ,
"ShaderType" : " PIXEL "
},
"SourceLanguage" : " HLSL " ,
"FilePath" : " cube.psh " ,
}
],
"Pipeleines" : [
{
"GraphicsPipeline" : {
"DepthStencilDesc" : {
"DepthEnable" : true
},
"RTVFormats" : {
"0" : " RGBA8_UNORM_SRGB "
},
"RasterizerDesc" : {
"CullMode" : " FRONT "
},
"BlendDesc" : {
"RenderTargets" : {
"0" : {
"BlendEnable" : true
}
}
}
},
"PSODesc" : {
"Name" : " My Pipeline State " ,
"PipelineType" : " GRAPHICS "
},
"pVS" : " My Vertex shader " ,
"pPS" : " My Pixel shader "
}
]
}
Файлы JSON могут динамически анализировать во время выполнения. В качестве альтернативы, приложение может использовать инструмент Packager для предварительного обработки конвейеров (компилированные шейдеры для целевых платформ, определить внутренние макеты ресурсов и т. Д.) В двоичный архив, оптимизированный для производительности времени выполнения.
Учебник | Скриншот | Описание |
---|---|---|
01 - привет треугольник | ![]() | В этом уроке показано, как отображать простой треугольник с помощью усердного API двигателя. |
02 - Куб | ![]() | Этот учебник демонстрирует, как отображать фактический 3D -объект, куб. Он показывает, как загружать шейдеры из файлов, создавать и использовать вершину, индекс и равномерные буферы. |
03 - текстурирование | ![]() | Этот учебник демонстрирует, как применить текстуру к 3D -объекту. Он показывает, как загрузить текстуру из файла, создать объект привязки ресурсов шейдера и как попробовать текстуру в шейдере. |
03 - Textural -C | ![]() | Этот учебник идентичен Tutorial03, но реализован с использованием C API. |
03 - Textural -Dotnet | ![]() | Этот учебник демонстрирует, как использовать усердный API двигателя в приложениях .NET. |
04 - Инстатье | ![]() | Этот учебник демонстрирует, как использовать Instancing, чтобы отобрать несколько копий одного объекта, используя уникальную матрицу преобразования для каждой копии. |
05 - массив текстур | ![]() | Этот учебник демонстрирует, как комбинировать инстигацию с массивами текстур, чтобы использовать уникальную текстуру для каждого экземпляра. |
06 - Многопользовательский | ![]() | В этом уроке показано, как генерировать списки команд параллельно из нескольких потоков. |
07 - Геометрия Шейдер | ![]() | В этом учебном пособии показано, как использовать геометрический шейдер для визуализации гладкого каркаса. |
08 - Тесселяция | ![]() | В этом учебном пособии показано, как использовать аппаратную тесселяцию для реализации простого алгоритма рендеринга адаптивного рельефа. |
09 - Квадраты | ![]() | В этом учебном пособии показано, как отображать несколько двухмерных квадроциклов, часто переключая текстуры и режимы смешивания. |
10 - потоковая передача данных | ![]() | В этом уроке показана стратегия динамического сопоставления буфера с использованием MAP_FLAG_DISCARD и MAP_FLAG_DO_NOT_SYNCHRONIZE FLAGS для эффективного потокового потока данных в GPU. |
11 - Обновления ресурсов | ![]() | Этот учебник демонстрирует различные способы обновления буферов и текстур в усердном двигателе и объясняет важные внутренние детали и последствия для производительности, связанные с каждым методом. |
12 - Цель рендеринга | ![]() | Этот учебник демонстрирует, как отображать трехмерный куб в целевую рендеринг за кадром и выполнять простой эффект после обработки. |
13 - Карта тени | ![]() | Этот урок демонстрирует, как отображать базовые тени, используя карту тени. |
14 - Вычислительный шейдер | ![]() | В этом уроке показано, как реализовать простую систему моделирования частиц с использованием вычислительных шейдеров. |
15 - Несколько окон | ![]() | Этот учебник демонстрирует, как использовать усердный двигатель для рендеринга в несколько окон. |
16 - Бесвязочные ресурсы | ![]() | В этом учебном пособии показано, как реализовать ресурсы Bindless, метод, который использует функцию индексации ресурсов динамического шейдера, включенную API-интерфейсом следующего поколения, чтобы значительно повысить производительность рендеринга. |
17 - MSAA | ![]() | Этот учебник демонстрирует, как использовать анти-алиаты MultiSample (MSAA) для того, чтобы геометрические края выглядели более плавными и временно стабильными. |
18 - Запросы | ![]() | Этот урок демонстрирует, как использовать запросы для получения различной информации о операции GPU, такой как количество примитивов, продолжительность обработки команд и т. Д. |
19 - рендерин | ![]() | Этот учебник демонстрирует, как использовать API рендеринга для реализации простого отложенного затенения. |
20 - сетчатый шейдер | ![]() | Этот учебник демонстрирует, как использовать амплификацию и сетчатые шейдеры, новые программируемые этапы, для реализации просмотра Frustum Culling и расчета LOD на GPU. |
21 - трассировка лучей | ![]() | Этот урок демонстрирует основы использования API трассировки лучей в прилежном двигателе. |
22 - Гибридный рендеринг | ![]() | Этот урок демонстрирует, как реализовать простой гибридный рендеринг, который сочетает в себе ратеризацию с трассировкой лучей. |
23 - очереди командных | ![]() | Этот учебник демонстрирует, как использовать несколько командных очередей для выполнения рендеринга параллельно с операциями копирования и вычисления. |
24 - затенение с переменной скоростью | ![]() | Этот учебник демонстрирует, как использовать затенение с переменной скоростью, чтобы уменьшить нагрузку на затенение пикселей. |
25 - Упаковщик Render State | ![]() | В этом уроке показано, как создавать и архивировать состояния трубопровода с помощью автономного инструмента Render Packager на примере простого трассера пути. |
26 - Кэш рендеринга состояния | ![]() | Этот урок расширяет метод отслеживания пути, реализованную в предыдущем учебном пособии, и демонстрирует, как использовать кэш состояния рендеринга для сохранения состояний трубопровода, созданных во время выполнения, и загружать их при запуске приложения. |
27 - Пост -обработка | ![]() | Этот учебник демонстрирует, как использовать эффекты после обработки из модуля DiligentFX. |
Образец | Скриншот | Описание |
---|---|---|
Образец атмосферы | ![]() | Этот образец демонстрирует, как интегрировать эпиполярное рассеяние света постобработки в применение для визуализации физически на основе атмосферы. |
GLFW Демо | ![]() | Этот Mini-игра Maze демонстрирует, как использовать GLFW для создания окна и обработки клавиатуры и ввода мыши. |
GLTF Viewer | ![]() | Этот образец демонстрирует, как использовать погрузчик активов и визуализатор PBR для загрузки и отображения моделей GLTF. |
Зритель долларов США | ![]() | Этот образец демонстрирует, как отображать файлы USD с использованием гидрогента, реализации API рендеринга Hydra в прилежном двигателе. |
Тени | ![]() | Этот образец демонстрирует, как использовать компонент затенения, чтобы отображать высококачественные тени. |
Уважаемая демо | ![]() | Этот образец демонстрирует интеграцию двигателя с дорогой библиотекой UI IMGUI. |
Нуклеарная демонстрация | ![]() | Этот образец демонстрирует интеграцию двигателя с библиотекой Nuklear UI. |
Привет, ар | ![]() | Этот образец демонстрирует, как использовать старательный двигатель в базовом приложении Android AR. |
Астероиды | ![]() | Этот Sampple является эталоном производительности, который отдает 50 000 уникальных текстурированных астероидов и позволяет сравнивать производительность различных режимов рендеринга. |
Интеграция Unity Demo | ![]() | Этот проект демонстрирует интеграцию прилежного двигателя с единством. |
Функциональность рендеринга высокого уровня реализована модулем DiligentFX. Следующие компоненты теперь доступны:
![]() | ![]() |
![]() | ![]() |
Временные анти-альцы
Утилиты для картирования тона Шейдера
Мы были бы признательны, если бы вы могли отправить нам ссылку на случай, если ваш продукт использует усердный двигатель.
Крупномасштабная система визуализации местности для пилотных симуляторов Elbit Systems
Lumenrt: программное обеспечение для моделирования визуализации и реалити -моделирования Bentley Systems
Godus: отмеченная наградами игра с песочницей.
Graphics VRMAC: кроссплатформенная графическая библиотека для .NET
Diligent Engine is an open project that may be freely used by everyone. We started it to empower the community and help people achieve their goals. Sadly enough, not everyone's goals are worthy. Please don't associate us with suspicious projects you may find on the Web that appear to be using Diligent Engine. We neither can possibly track all such uses nor can we really do anything about them because our permissive license does not give us a lot of leverage.
See Apache 2.0 license.
Each module has some third-party dependencies, each of which may have independent licensing:
To contribute your code, submit a Pull Request to this repository. Diligent Engine is licensed under the Apache 2.0 license that guarantees that content in the DiligentEngine repository is free of Intellectual Property encumbrances. In submitting any content to this repository, you license that content under the same terms, and you agree that the content is free of any Intellectual Property claims and you have the right to license it under those terms.
Diligent Engine uses clang-format to ensure consistent source code style throughout the code base. The format is validated by CI for each commit and pull request, and the build will fail if any code formatting issue is found. Please refer to this page for instructions on how to set up clang-format and automatic code formatting.
Coding Guidelines
Performance Best Practices
Code Formatting
See Release History
diligentgraphics.com