NVIDIA 渲染接口(NRI)
NRI 是一个低级抽象渲染接口,目前支持三个后端:D3D11、D3D12 和 Vulkan(VK)。NRI 的设计目标是支持 D3D12 和 VK API 的所有(至少是主要的)低级功能,同时简化使用并减少所需的代码量(特别是与 VK 相比)。NRI 使用 C++ 编写,但同时支持 C++ 和 C 接口。
目标:
非目标:
- 高级渲染硬件接口
- 暴露图形 API 中不存在的实体
- D3D11 级别的抽象
- 任何形式的隐式管理
主要特性:
- 兼容 C++ 和 C 接口
- D3D12、VK 和 D3D11 图形 API 的通用泛化
- 低开销
- 光线追踪支持
- 网格着色器支持
- D3D12 Ultimate 功能支持,包括增强型屏障
- VK printf 支持
- 验证层(图形 API 和 NRI 提供)
- 默认 D3D11 行为更改为匹配 D3D12/VK,在适用的情况下使用 NVAPI 或 AMD AGS 库
- 尽可能支持启用 VK 的平台:Windows、Linux、MacOS、Android
- 可作为 共享 或 静态 库使用。
NRI 应用于:
C/C++ 接口差异
C++ | C |
---|---|
nri::Interface | NriInterface |
nri::Enum::MEMBER | NriEnum_MEMBER |
nri::CONST | NRI_CONST |
nri::nriFunction | nriFunction |
nri::Function | nriFunction |
引用 & | 指针 * |
实体
NRI | D3D11 | D3D12 | VK |
---|---|---|---|
Device | ID3D11Device | ID3D12Device | VkDevice |
CommandBuffer | ID3D11DeviceContext (延迟) | ID3D12CommandList | VkCommandBuffer |
CommandQueue | ID3D11DeviceContext (即时) | ID3D12CommandQueue | VkQueue |
Fence | ID3D11Fence | ID3D12Fence | VkSemaphore (时间线) |
CommandAllocator | 不适用 | ID3D12CommandAllocator | VkCommandPool |
Buffer | ID3D11Buffer | ID3D12Resource | VkBuffer |
Texture | ID3D11Texture | ID3D12Resource | VkImage |
Memory | 不适用 | ID3D12Heap | VkDeviceMemory |
Descriptor | ID3D11*View | D3D12_CPU_DESCRIPTOR_HANDLE | Vk*View 或 VkSampler |
DescriptorSet | 不适用 | 不适用 | VkDescriptorSet |
DescriptorPool | 不适用 | ID3D12DescriptorHeap | VkDescriptorPool |
PipelineLayout | 不适用 | ID3D12RootSignature | VkPipelineLayout |
Pipeline | ID3D11*Shader 和 ID3D11*State | ID3D12StateObject | VkPipeline |
AccelerationStructure | 不适用 | ID3D12Resource | VkAccelerationStructure |
构建说明
- 安装 Cmake 3.15+
- 安装以下内容:
- Windows:最新的 WindowsSDK 和 VulkanSDK
- Linux(x86-64):最新的 VulkanSDK 以及可选的 libx11-dev 和 libwayland-dev
- Linux(aarch64):可选的 libx11-dev 和 libwayland-dev
- 构建(方式1)- 显式使用 Git 和 CMake
- 克隆项目并初始化子模块
- 使用 CMake 生成并构建项目
- 构建(方式2)- 运行脚本:
- 运行
1-Deploy
- 运行
2-Build
- 运行
注意:
- 可以同时启用 Xlib 和 Wayland
- 最低支持的客户端为 Windows 8.1+。Windows 7 支持需要少量工作,可根据需求添加
CMAKE 选项
NRI_STATIC_LIBRARY
- 将 NRI 构建为静态库(默认为off
)NRI_ENABLE_VK_SUPPORT
- 启用 VULKAN 后端(默认为on
)NRI_ENABLE_D3D11_SUPPORT
- 启用 D3D11 后端(Windows 默认为on
)NRI_ENABLE_D3D12_SUPPORT
- 启用 D3D12 后端(Windows 默认为on
)
仅限 VK:
NRI_ENABLE_XLIB_SUPPORT
- 启用 Xlib 支持(默认为on
)NRI_ENABLE_WAYLAND_SUPPORT
- 启用 Wayland 支持(默认为on
)
仅限 D3D12:
NRI_ENABLE_AGILITY_SDK_SUPPORT
- 启用 Agility SDK(默认为off
)NRI_AGILITY_SDK_PATH
- 包含 Agility SDK 的目录路径:.nupkg/build/native/
的内容(默认为C:/AgilitySDK
)NRI_AGILITY_SDK_VERSION
- Agility SDK 版本(711
或更新版本)NRI_AGILITY_SDK_DIR
- Agility SDK 二进制文件将被复制到的目录,相对于CMAKE_RUNTIME_OUTPUT_DIRECTORY
(默认为AgilitySDK
)
AGILITY SDK
概述 和 下载 部分可以在这里找到。
D3D12 后端使用 Agility SDK 来访问最新的 D3D12 功能。一旦这些功能在操作系统中可用,Agility SDK 的安装将被弃用。 安装步骤:
- 下载Agility SDK包
- "预览"版本需要在Windows中启用开发者模式
- 将".nupkg"重命名为".zip"
- 将".nupkg/build/native"的内容解压到"NRI_AGILITY_SDK_PATH"文件夹中
- 可以位于任何位置
- 将"NRI_AGILITY_SDK_DIR"设置为需要复制"bin"文件夹的路径
- 最好靠近可执行文件
- 将"NRI_AGILITY_SDK_VERSION"设置为包的版本
- 启用"NRI_ENABLE_AGILITY_SDK_SUPPORT"
- 重新部署项目
- 在使用NRI的可执行文件代码中包含自动生成的"NRIAgilitySDK.h"头文件
示例概述
NRI示例可以在此处找到。
示例:
- DeviceInfo - 查询并打印系统中设备组的信息
- Clear - 仅使用帧缓冲清除的最小渲染示例
- CTest - C接口使用的非常简单的示例
- Triangle - 简单的纹理三角形渲染
- SceneViewer - 加载和渲染带材质的网格
- BindlessSceneViewer - 无绑定GPU驱动渲染测试
- Readback - 将数据从GPU传回CPU
- AsyncCompute - 演示图形和计算工作负载的并行执行
- MultiThreading - 展示多线程命令缓冲区录制的优势
- MultiGPU - 多GPU示例
- RayTracingTriangle - 通过光线追踪进行简单的三角形渲染
- RayTracingBoxes - 更高级的光线追踪示例,TLAS中包含多个BLAS
- Wrapper - 展示如何将原生D3D11/D3D12/VK对象封装到NRI实体中
- Resize - 演示窗口大小调整
许可证
NRI采用MIT许可证。本项目包含NVAPI软件。NVAPI软件的所有使用均受此处指定的许可条款约束。