甜甜圈
甜甜圈是由NVIDIA DevTech开发的实时渲染框架,用于各种原型渲染器和代码示例。它提供了一系列可重用且可扩展的渲染通道,可以在应用程序中组合使用,还提供了一个用于加载场景和维护其组件图的系统。
甜甜圈不是游戏引擎。它不提供创建交互式体验的任何手段,比如角色或导航。
甜甜圈源于VRWorks多投影SDK,并在此基础上不断改进和发展。不同版本的甜甜圈已被用于构建Asteroids演示、DLSS SDK和RTXDI SDK。
要求
- Windows或Linux(x64或ARM64)
- CMake 3.10
- C++ 17编译器(Visual Studio 2019、GCC 8或Clang 6)
- 着色器编译器(DX11用FXC,DX12用DXC,Vulkan用DXC-SPIR-V - 越新越好)
依赖项
必需(全部作为git子模块包含):
- cgltf用于加载glTF场景
- JsonCpp用于读写JSON场景和配置文件
- stb用于读写纹理和其他图像
可选(也作为git子模块包含,但可通过CMake变量禁用):
- NVRHI、ImGUI和glfw用于渲染(
DONUT_WITH_NVRHI
) - TaskFlow用于多线程(
DONUT_WITH_TASKFLOW
) - tinyexr用于读取EXR图像(
DONUT_WITH_TINYEXR
) - LZ4用于提取打包媒体(
DONUT_WITH_LZ4
) - miniz用于挂载zip归档(
DONUT_WITH_MINIZ
)
示例
使用甜甜圈的示例项目可以在单独的仓库中找到:donut_examples。
构建
甜甜圈并不设置为单独构建的项目。它应始终作为子模块包含在更大的基于CMake的项目中。请遵循每个项目的说明进行构建。
结构
甜甜圈由4个主要子系统组成,表现为独立的静态库:
donut_core
提供基本功能,包括数学、虚拟文件系统(VFS)、日志记录、JSON和其他实用工具。核心模块不包含任何图形功能。donut_engine
实现场景导入和维护、动画、材质、纹理缓存、描述符表管理、控制台变量和基本音频。依赖于donut_core
。donut_render
提供一系列渲染通道,如前向和延迟着色、时间性抗锯齿、SSAO、阴影贴图、程序化天空、色调映射和泛光。依赖于donut_core
和donut_engine
。donut_app
是用于创建交互式应用程序的框架,包括图形设备管理器、UI绑定和实用工具、相机和媒体文件系统。依赖于donut_core
和donut_engine
。
引擎和渲染模块需要一些着色器,可以在shaders
文件夹中找到,并通过donut_shaders
目标构建。
功能
图形API支持
与图形API的大多数交互都通过NVRHI抽象层完成。甜甜圈和NVRHI支持以下图形API:
- Vulkan 1.2,需要Vulkan头文件版本1.2.162或更高;作为NVRHI的子模块包含(
DONUT_WITH_VULKAN
) - Direct3D 12,需要Windows SDK版本19041或更高(
DONUT_WITH_DX12
) - Direct3D 11,需要兼容版本的Windows SDK(
DONUT_WITH_DX11
)
请注意,NVRHI不提供创建图形API设备或窗口的任何方法,该功能由donut_app
中的DeviceManager
类及其派生类处理。
场景格式
在此版本中,甜甜圈只能导入glTF 2.0模型,有一些限制:
- 不支持变形目标
- 不支持KTX2纹理(但支持DDS纹理)
支持的glTF扩展:
KHR_materials_pbrSpecularGlossiness
KHR_materials_transmission
KHR_lights_punctual
MSFT_texture_dds
除了glTF,甜甜圈还支持自己的基于JSON的场景布局文件。这些文件可以加载多个glTF模型并将它们组合成更大的场景图,还可以添加灯光、相机、动画,并使用从模型导入的场景节点路径将动画应用于这些节点。
渲染通道
完整的渲染通道列表,请参阅include/donut/render文件夹中的头文件。
最有用的通道包括:
- 前向着色
- G缓冲填充
- 延迟着色
- 时间性抗锯齿
- 自适应色调映射
- SSAO
- 程序化天空
光线追踪
甜甜圈不提供任何光线追踪通道,甚至不维护加速结构(AS)。这主要是因为每个应用程序对光线追踪AS的要求不同,而这些要求会影响使用AS的通道。但它确实提供了一个通用的无绑定资源表,在加载场景时会填充纹理和几何数据缓冲。使用甜甜圈的场景表示和NVRHI抽象提供的数据结构,可以轻松地在应用程序端处理场景的加速结构构建。
许可证
甜甜圈基于MIT许可证授权。