現代的跨平台低級3D圖形庫和渲染框架
勤奮的引擎是輕巧的跨平台圖形API抽像庫和渲染框架。它旨在充分利用Direct3D12,Vulkan,Metal和WebGPU,同時通過Direct3D11,OpenGL,OpenGLES和WebGL支持較舊的平台。勤奮的引擎曝光了通用前端API,並在所有平台上使用HLSL作為通用陰影語言,並呈現後端。可以與相應的後端一起使用平台特定的著色器表示(GLSL,MSL,DX字節碼或SPIRV)。該引擎旨在在遊戲引擎或任何其他3D應用程序中用作圖形子系統。它是根據Apache 2.0許可證分發的,可以免費使用。
平台 | D3D11 | D3D12 | OpenGL/Gles | VULKAN | 金屬 | WebGPU | 建立狀態 |
---|---|---|---|---|---|---|---|
![]() | ✔️ | ✔️ | ✔️ | ✔️ | - | ✔️3 | ![]() |
![]() | ✔️ | ✔️ | - | - | - | - | ![]() |
![]() | - | - | ✔️ | ✔️ | - | ✔️3 | ![]() |
![]() | - | - | ✔️ | ✔️ | - | - | ![]() |
![]() | - | - | ✔️ | ✔️1 | ✔️2 | ✔️3 | ![]() |
![]() | - | - | ✔️ | ✔️1 | ✔️2 | - | ![]() |
![]() | - | - | - | ✔️1 | ✔️2 | - | ![]() |
![]() | - | - | ✔️ | - | - | ✔️ | ![]() |
1 MacOS,iOS和TVOS平台上的VULKAN API並未在本地支持,並且需要Vulkan的可移植性實現,例如MoltenVK或GFX-Portability。
2可在商業許可下獲得 - 請與我們聯繫以獲取詳細信息。
3需要對WebGPU進行本機實施,建議黎明。
#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並進行乾淨的重建也是一個好主意。
主存儲庫包括以下子模型:
勤奮的引擎使用CMAKE作為跨平台構建工具。要開始使用CMAKE,請下載最新版本(需要3.20或更高版本)。另一個構建先決條件是Python解釋器(需要3.0或更高版本)。如果按照下面的說明有構建/運行問題,請查看故障排除。
建立先決條件:
.NET支持需要.NET SDK 6.0或更高版本。
使用CMAKE GUI或命令行工俱生成構建文件。例如,要在build/win64文件夾中生成Visual Studio 2022 64位解決方案和項目文件,請導航到引擎的根文件夾並運行以下命令:
cmake -S . -B ./build/Win64 -G "Visual Studio 17 2022" -A x64
您可以使用以下命令生成針對Win8.1 SDK的Win32解決方案:
cmake -D CMAKE_SYSTEM_VERSION=8.1 -S . -B ./build/Win64_8.1 -G "Visual Studio 17 2022" -A x64
如果使用mingw,則可以使用下面的命令生成製造文件(請注意,功能將受到限制,並且不是推薦構建引擎的方法):
cmake -S . -B ./build/MinGW -D CMAKE_BUILD_TYPE=Release -G "MinGW Makefiles"
要啟用Vulkan驗證層,您將需要下載Vulkan SDK並添加環境變量VK_LAYER_PATH
該vk_layer_path包含vulkansdk安裝文件夾中BIN目錄的路徑。
在build/win64文件夾中打開diligentengine.sln文件,選擇配置並構建引擎。將所需項目設置為啟動項目(默認情況下,將選擇GLTF查看器)並運行它。
默認情況下,示例和教程應用程序將顯示渲染的後端選擇對話框。使用以下命令行選項強制D3D11,D3D12,OpenGL或Vulkan模式: - 模式D3D11 , - 模式D3D12 , - 模式GL或- 模式VK 。如果要在Visual Studio環境之外運行應用程序,則必須將應用程序的資產文件夾設置為工作目錄。 (對於Visual Studio,這是由CMake自動配置的)。另外,您可以導航到構建目標或安裝文件夾並從那裡運行可執行文件。
要為通用Windows平台生成構建文件,您需要定義以下兩個CMAKE變量:
CMAKE_SYSTEM_NAME=WindowsStore
CMAKE_SYSTEM_VERSION=< Windows Version >
例如,要在build/uwp64文件夾中生成Visual Studio 2022 64位解決方案和項目文件,請從引擎的根文件夾中運行以下命令:
cmake -D CMAKE_SYSTEM_NAME=WindowsStore -D CMAKE_SYSTEM_VERSION=10.0 -S . -B ./build/UWP64 -G "Visual Studio 17 2022" -A x64
將所需項目設置為啟動項目(默認情況下,將選擇GLTF查看器)並運行它。
默認情況下,應用程序將以D3D12模式運行。您可以使用以下命令行選項選擇D3D11或D3D12: - 模式D3D11 , - 模式D3D12 。
注意:可以通過定義cmake_system_version = 8.1 cmake變量來生成針對Windows 8.1的解決方案,但是它將無法構建,因為它將使用Visual Studio 2013(V120)工具集,該工具集缺乏適當的C ++ 14支持。
需要為C ++開發設置您的Linux環境。如果已經存在,請確保您的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運行應用程序。要從命令行運行應用程序,應用程序的資產文件夾必須是當前目錄。
請確保為Android開發設置了機器。下載Android Studio,安裝和配置NDK和CMAKE以及其他必需的工具。需要NDK R24或更高版本。如果您不使用與Android Studio捆綁在一起的CMAKE版本,請確保正確配置了構建文件。要驗證您的環境是否正確設置,請嘗試構建茶壺樣品以及Vulkan Android教程。
使用Android Studio打開診斷樣品/Android文件夾,在Android上構建和運行樣品。
默認情況下,應用程序將在Vulkan模式下運行。要以Vulkan模式運行它們,請添加以下啟動標誌: --es mode gles
(在Android Studio中,轉到Run->編輯配置菜單)
先決條件:
克隆回購後,請從引擎的根文件夾中運行以下命令,以生成Xcode Project:
cmake -S . -B ./build/MacOS -G "Xcode"
該項目將位於build/MacOS
文件夾中。
請注意,如果Cmake未能找到編譯器,則可能需要運行以下命令:
sudo xcode-select --reset
默認情況下,MacOS上沒有Vulkan實現。勤奮的發動機會動態加載Vulkan,並可以使用Vulkan的可移植性實現,例如熔融VK或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或其他桌面GUI啟動的應用程序中都看不到的。因此,為確保應用程序找到Vulkan庫,需要從命令行啟動。由於同樣的原因,還應使用open
Command從Shell打開Xcode項目文件。使用Xcode版本7及以後,可能首先使用以下命令啟用此行為:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
請參閱此頁面以獲取更多詳細信息。
DYLD_LIBRARY_PATH
和LD_LIBRARY_PATH
環境變量在MACOS上被忽略,除非禁用系統完整性保護(通常不建議使用)。為了使可執行成員找到Vulkan庫,必須處於RPATH中。如果設置了VULKAN_SDK
環境變量並要糾正位置,則勤奮的引擎將自動配置所有應用程序。
最新測試的Vulkan SDK版本:1.3.290.0。
先決條件:
從引擎的根文件夾中運行下面的命令,以生成為iOS構建配置的XCode項目:
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
系統root。您也可以使用CMAKE_OSX_ARCHITECTURES
變量來指定目標體系結構,例如:
cmake -S . -B ./build/iOSSim -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=arm64 -G "Xcode"
在build/IOS
文件夾中打開Xcode項目文件並構建引擎。要在iOS設備上運行應用程序,您將需要在項目設置中設置適當的開發團隊。
要在iOS上啟用Vulkan,請下載並安裝VulkansDK。 iOS上沒有VULKAN裝載機,並且勤奮的發動機與熔融XCframeWork(請參閱MoltenVK安裝指南)直接鏈接,可在金屬上實現Vulkan。為了在iOS上啟用勤奮的引擎中的Vulkan,請在運行CMake時指定通往Vulkan SDK的路徑(假設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"
默認情況下,發動機與位於Vulkan SDK的熔融XCframework鏈接。如果不需要或應用程序要使用特定的庫,則可以通過MOLTENVK_LIBRARY
Cmake變量提供通往庫的完整路徑。
有關熔融VK安裝和使用情況的更多信息,請參閱熔融VK用戶指南。
最新測試的Vulkan SDK版本: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應用程序,請運行基本的Web服務器
cd ./build/Emscripten
python https_server.py
打開瀏覽器並導航到http://localhost
例如,Hello Triangle教程將在
http://localhost/DiligentSamples/Tutorials/Tutorial01_HelloTriangle/Tutorial01_HelloTriangle.html
要從本地網絡上的另一台計算機訪問服務器,請使用HTTPS服務器。要啟用此功能,請首先安裝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
參數指定不同的端口號,並在IP地址之後的URL中包含相應的端口號。例如:
http://localhost:${YOUR_PORT}/DiligentSamples/Tutorials/Tutorial01_HelloTriangle/Tutorial01_HelloTriangle.html
勤奮的結構具有模塊化結構,因此對於您的項目,您只能使用實現所需功能的那些子模塊。下圖顯示了模塊之間的依賴關係。
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
宏,並且需要在運行時加載庫。例如,對於Direct3D12後端:
# if ENGINE_DLL
// Load the dll and import GetEngineFactoryD3D12() function
auto GetEngineFactoryD3D12 = LoadGraphicsEngineD3D12();
# endif
auto * pFactoryD3D12 = GetEngineFactoryD3D12();
使用靜態鏈接時,將無法定義ENGINE_DLL
宏,並且GetEngineFactoryD3D12
函數將與可執行文件靜態鏈接。
SampleApp.cpp文件提供了一個示例,說明瞭如何使用靜態或動態鏈接在不同平台上初始化引擎。
您可以使用FetchContent下載勤奮的引擎模塊。唯一的警告是,您需要為每個模塊指定源目錄與模塊名稱相同,以便找到標頭文件。以下是使用fetchcontent的cmake文件的示例:
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變量控制。請注意,它默認為unix上的/usr/local
在Windows上的unix和c:/Program Files/${PROJECT_NAME}
,這可能不是您想要的。使用-D CMAKE_INSTALL_PREFIX=install
以使用本地install
文件夾:
cmake -S . -B ./build/Win64 -D CMAKE_INSTALL_PREFIX=install -G "Visual Studio 17 2022" -A x64
要安裝庫和標題文件,請從構建文件夾中運行以下CMAKE命令:
cmake --build . --target install
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
勤奮的發動機標頭要求以下平台宏之一定義為1
: PLATFORM_WIN32
, PLATFORM_UNIVERSAL_WINDOWS
, PLATFORM_ANDROID
,platform_android, PLATFORM_LINUX
, PLATFORM_MACOS
, PLATFORM_IOS
。
您可以使用以下CMAKE選項來控制要安裝的引擎的哪些組件: DILIGENT_INSTALL_CORE
, DILIGENT_INSTALL_FX
, DILIGENT_INSTALL_SAMPLES
和DILIGENT_INSTALL_TOOLS
。
集成引擎的另一種方法是生成構建文件(例如Visual Studio Projects)並將其添加到您的構建系統中。下面描述的構建自定義可以幫助調整設置滿足您的特定需求。
可用的CMAKE選項總結在下表中:
選項 | 預設值 | 描述 |
---|---|---|
DILIGENT_NO_DIRECT3D11 | 不 | 不要構建Direct3D11後端 |
DILIGENT_NO_DIRECT3D12 | 不 | 不要構建Direct3D12後端 |
DILIGENT_NO_OPENGL | 不 | 不要構建OpenGL後端 |
DILIGENT_NO_VULKAN | 不 | 不要建立Vulkan後端 |
DILIGENT_NO_METAL | 不 | 不要建立金屬後端 |
DILIGENT_NO_WEBGPU | 不 | 不要構建WebGPU後端 |
DILIGENT_NO_ARCHIVER | 不 | 不要建立檔案館 |
DILIGENT_NO_RENDER_STATE_PACKAGER | 不 | 不要構建渲染狀態包裝工具 |
DILIGENT_ENABLE_DRACO | 不 | 在GLTF加載器中啟用Draco壓縮支持 |
DILIGENT_USE_RAPIDJSON | 不 | 在GLTF加載器中使用Rapidjson解析器 |
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 | 不 | 禁用非直接3D後端中的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項目的可選路徑 | |
DILIGENT_ARGS_DIR | 用戶提供的ARGS項目的可選路徑 | |
DILIGENT_NUKLEAR_DIR | 提供用戶提供的Nuklear項目的可選路徑 | |
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 | -mavx2 | 釋放配置的其他clang編譯選項 |
DILIGENT_USD_PATH | 通往美元安裝文件夾的路徑 |
默認情況下,構建了當前平台上的所有後端。要禁用特定的後端,請使用以下選項: DILIGENT_NO_DIRECT3D11
, DILIGENT_NO_DIRECT3D12
, DILIGENT_NO_OPENGL
, DILIGENT_NO_VULKAN
, DILIGENT_NO_METAL
, DILIGENT_NO_WEBGPU
。 WebGPU後端在為Web構建時默認啟用。要在其他平台上啟用它,請使用DILIGENT_NO_WEBGPU=OFF
。可以通過CMAKE UI或命令行設置選項,如下示例:
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的後端與GLSlang相關,該glslang可以在運行時將HLSL和GLSL著色器編譯到Spirv。如果不需要運行時彙編,則可以使用DILIGENT_NO_GLSLANG
cmake選項禁用GLSLANG。此外,可以使用DILIGENT_NO_HLSL
選項禁用非直系3D後端中的HLSL支持。實現選項可以大大減少Vulkan和OpenGL後端二進製文件的大小,這對於移動應用程序尤其重要。
勤奮的引擎使用clang-Format來確保整個代碼庫中的格式一致。可以使用DILIGENT_NO_FORMAT_VALIDATION
cmake選項禁用驗證。請注意,如果發現格式化問題,任何拉的請求都會失敗。
勤奮的引擎使用了廣泛的驗證,這些驗證始終在調試構建中啟用。通過設置DILIGENT_DEVELOPMENT
CMake選項,可以在發布配置中啟用一些檢查。
要啟用PIX事件支持,請設置DILIGENT_LOAD_PIX_EVENT_RUNTIME
cmake標誌。
要在NVIDIA GPU上啟用一些高級功能(例如Direct3D11中的本機多繪製間接支持),請下載NVAPI並設置DILIGENT_NVAPI_PATH
cmake cmake變量。
勤奮的引擎使用多個第三方庫。如果應用程序的cmake文件定義了任何這些庫,則勤奮將使用現有目標。該應用程序將需要確保構建設置與勤奮兼容。
勤奮的引擎允許客戶端通過提供定義以下可選CMAKE函數的配置腳本文件來自定義構建設置:
custom_configure_build()
- 定義全局構建屬性,例如構建配置,C/C ++編譯標誌,鏈接標誌等。custom_pre_configure_target()
- 定義構建中每個目標的自定義設置,並在發動機的構建系統開始配置目標之前被調用。custom_post_configure_target()
- 引擎構建系統已配置了目標以使客戶端覆蓋引擎設置的屬性。運行cmake時,應通過BUILD_CONFIGURATION_FILE
變量提供配置腳本的路徑,例如,必須相對於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
變量來定義自己的構建配置。例如,如果您只想具有兩種配置:調試和復發,請在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()
設置了所有必需的屬性,則可以告訴構建系統,通過將TARGET_CONFIGURATION_COMPLETE
parent parent scope變量設置為TRUE
不需要進一步處理:
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文件可以在運行時動態解析。另外,應用程序可以將包裝工具使用包裝工具來預處理管道描述(針對目標平台的編譯著色器,定義內部資源佈局等),以優化用於運行時加載性能的二進制檔案。
教程 | 螢幕截圖 | 描述 |
---|---|---|
01-你好三角 | ![]() | 本教程顯示瞭如何使用勤奮的引擎API渲染簡單的三角形。 |
02-立方體 | ![]() | 該教程演示瞭如何渲染實際的3D對象,即一個立方體。它顯示瞭如何從文件中加載著色器,創建和使用頂點,索引和統一緩衝區。 |
03-紋理 | ![]() | 本教程演示瞭如何將紋理應用於3D對象。它顯示瞭如何從文件中加載紋理,創建著色器資源綁定對像以及如何在著色器中採樣紋理。 |
03-紋理-C | ![]() | 該教程與Tutorial03相同,但使用C API實現。 |
03-紋理點網 | ![]() | 本教程演示瞭如何在.NET應用中使用勤奮的引擎API。 |
04-實例 | ![]() | 本教程演示瞭如何使用每個副本的唯一轉換矩陣來呈現一個對象的多個副本。 |
05-紋理陣列 | ![]() | 本教程演示瞭如何將實例與紋理陣列相結合以在每個實例中使用唯一的紋理。 |
06-多線程 | ![]() | 本教程顯示瞭如何從多個線程並行生成命令列表。 |
07-幾何著色器 | ![]() | 本教程顯示瞭如何使用幾何設計著色器來渲染光滑的線框。 |
08-鑲嵌 | ![]() | 本教程顯示瞭如何使用硬件鑲嵌來實現簡單的自適應地形渲染算法。 |
09-四邊形 | ![]() | 本教程顯示瞭如何渲染多個2D四邊形,經常切換紋理和混合模式。 |
10-數據流 | ![]() | 本教程使用MAP_FLAG_DISCARD 和MAP_FLAG_DO_NOT_SYNCHRONIZE 標誌顯示了動態緩衝映射策略,以有效地將數據傳輸到GPU。 |
11-資源更新 | ![]() | 本教程展示了在勤奮的引擎中更新緩衝區和紋理的不同方法,並解釋了與每種方法相關的重要內部細節和性能影響。 |
12-渲染目標 | ![]() | 該教程演示瞭如何將3D立方體渲染到屏幕外渲染目標中並做出簡單的後處理效果。 |
13-影子地圖 | ![]() | 本教程演示瞭如何使用影子地圖渲染基本陰影。 |
14-計算著色器 | ![]() | 本教程顯示瞭如何使用計算著色器實現簡單的粒子模擬系統。 |
15-多個窗戶 | ![]() | 該教程演示瞭如何使用勤奮的引擎渲染到多個窗口。 |
16-無限資源 | ![]() | 本教程顯示瞭如何實現無綁定資源,該技術利用了下一代API啟用動態著色器資源索引功能,以顯著提高渲染性能。 |
17- MSAA | ![]() | 本教程演示瞭如何使用多樣本抗氧化(MSAA)使幾何邊緣看起來更加順暢,更暫時穩定。 |
18-查詢 | ![]() | 本教程演示瞭如何使用查詢檢索有關GPU操作的各種信息,例如呈現的原始數量,命令處理持續時間等。 |
19-渲染通行證 | ![]() | 本教程演示瞭如何使用渲染通過API實現簡單的遞延陰影。 |
20-著色器著色器 | ![]() | 本教程演示瞭如何使用放大和網格著色器(新的可編程階段)來實現gpu上的視圖flustum culling和對象LOD計算。 |
21-射線跟踪 | ![]() | 該教程展示了在勤奮發動機中使用射線追踪API的基礎知識。 |
22-混合渲染 | ![]() | 該教程演示瞭如何實現將柵格化與射線跟踪相結合的簡單混合渲染器。 |
23-命令隊列 | ![]() | 本教程演示瞭如何使用多個命令隊列與復制和計算操作並行執行渲染。 |
24-可變速率陰影 | ![]() | 本教程演示瞭如何使用可變速率陰影來減少像素陰影負載。 |
25-渲染狀態包裝器 | ![]() | 本教程在簡單的路徑示踪劑的示例中顯示瞭如何使用呈現狀態包裝器離線工具來創建和存檔管道狀態。 |
26-渲染狀態緩存 | ![]() | 本教程擴展了上一個教程中實現的路徑跟踪技術,並演示瞭如何使用渲染狀態緩存來保存在運行時間創建的管道狀態並在應用程序啟動時加載它們。 |
27-後處理 | ![]() | 本教程演示瞭如何使用DiligentFX模塊中的後處理效果。 |
樣本 | 螢幕截圖 | 描述 |
---|---|---|
氣氛樣本 | ![]() | 該樣本演示瞭如何將異性光散射後處理效果整合到呈現基於物理的大氣的應用中。 |
GLFW演示 | ![]() | 這個迷宮迷你游戲演示瞭如何使用GLFW創建窗口並處理鍵盤和鼠標輸入。 |
GLTF查看器 | ![]() | 該樣本演示瞭如何使用資產加載器和PBR渲染器來加載和渲染GLTF模型。 |
USD查看器 | ![]() | 該示例演示瞭如何使用Julogent渲染USD文件,這是勤奮發動機中Hydra渲染API的實現。 |
陰影 | ![]() | 該示例演示瞭如何使用陰影組件來渲染高質量的陰影。 |
親愛的imgui演示 | ![]() | 該樣本演示了引擎與Dear Imgui UI庫的集成。 |
Nuklear演示 | ![]() | 該樣本證明了引擎與Nuklear UI庫的集成。 |
你好AR | ![]() | 該樣本演示瞭如何在基本的Android AR應用中使用勤奮的引擎。 |
小行星 | ![]() | 該樣品是一個性能基準,可提供50,000個獨特的紋理小行星,並允許比較不同渲染模式的性能。 |
統一集成演示 | ![]() | 該項目展示了將勤奮的引擎與團結集成在一起的。 |
高級渲染功能由DiligentFX模塊實現。現在可用以下組件:
![]() | ![]() |
![]() | ![]() |
暫時性抗氧化
音調映射著色器實用程序
如果您的產品使用勤奮的引擎,我們將不勝感激,如果您可以向我們發送鏈接。
大規模的地形可視化系統,用於試驗訓練模擬器的大型地形系統
Lumenrt:Bentley Systems的可視化和現實建模軟件
Godus:屢獲殊榮的沙盒遊戲
VRMAC圖形:.NET的跨平台圖形庫
勤奮的引擎是一個開放的項目,每個人都可以自由使用。我們啟動了它,以增強社區的能力,並幫助人們實現目標。可悲的是,並不是每個人的目標都值得。請不要將我們與您可能在網絡上發現的可疑項目聯繫起來,這些項目似乎正在使用勤奮的引擎。我們既不能追踪所有這些用途,也無法對它們做任何事情,因為我們的允許許可並不能給我們帶來很多槓桿作用。
請參閱Apache 2.0許可證。
每個模塊都有一些第三方依賴性,每個依賴性可能具有獨立的許可:
為了貢獻您的代碼,請向此存儲庫提交拉動請求。勤奮的發動機已獲得Apache 2.0許可證的許可,該許可證保證了DiligentEngine存儲庫中的內容沒有知識產權。在將任何內容提交給本存儲庫時,您可以根據相同條款許可該內容,並且您同意內容沒有任何知識產權索賠,並且您有權根據這些條款許可。
勤奮的引擎使用Clang-Format來確保整個代碼庫中的一致源代碼樣式。該格式由CI驗證每個提交和拉的請求,如果找到任何代碼格式問題,則構建將失敗。請參閱此頁面,以獲取有關如何設置Clang-Format和自動代碼格式的說明。
編碼指南
績效最佳實踐
代碼格式
請參閱發布歷史記錄
diligentgraphics.com