现代的跨平台低级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许可证。
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.
编码指南
Performance Best Practices
代码格式
See Release History
diligentgraphics.com