NVIDIA 位移微地图工具包
本工具包提供了用于创建和查看位移微网格的库、样本和工具。 这是一项正在进行中的工作,欢迎反馈!
要对微网格进行光线追踪,需要最新的支持 VK_NV_displacement_micromap
的驱动程序,例如可在 https://developer.nvidia.com/vulkan-driver 获取的 Vulkan Beta 驱动程序。
我们建议先查看微网格基础幻灯片以及 dmm_displacement
迷你样本。
还有 NVIDIA GTC 演示 压缩微网格入门 [S51410] 和 基于 GPU 的大型网格交互式重新网格化 [S51567]。
NVIDIA 微网格技术涵盖了不透明度微地图和位移微地图。 目前,此 SDK 仅涉及位移,因为不透明度有单独的 SDK。
构建
此仓库包含子模块。克隆后,使用以下命令初始化它们:
git submodule update --init --recursive --jobs 8
唯一的手动依赖项是 Vulkan SDK。对于 Windows,请确保在安装过程中安装可选的 "glm",或者如果单独安装,请设置 cmake 的 GLM_INCLUDE_DIR
位置。
其他依赖项将在 cmake 配置步骤中下载。
Windows
已在 Visual Studio 2017、2019 和 2022 上测试。使用 cmake-gui 生成项目文件。
- 安装 Vulkan SDK,包括 glm(如果单独安装 glm,请设置 cmake 的
GLM_INCLUDE_DIR
) - 克隆此仓库并初始化子模块
- 运行 cmake-gui,源代码 = 此仓库,构建文件夹 = 任意位置
- 配置并生成。Vulkan 路径应由 SDK 安装程序设置
- 用 Visual Studio 打开 path\to\build\micromesh_toolkit.sln
- 在解决方案资源管理器中,右键单击
micromesh_toolbox
并选择"设为启动项目" - 构建 -> 生成解决方案
有关使用示例,请参阅 docs/examples.md。
Linux
已在 gcc 11.2.1 和 11.3.0 上测试。这假设已安装构建工具和 cmake。
- 安装 Vulkan SDK
- 安装 glm(例如
sudo apt install libglm-dev
或sudo dnf install glm-devel
) - 安装 X11、GLFW 和 nVidia-ML 库
(
sudo apt-get install libx11-dev libxcb1-dev libxcb-keysyms1-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev libxxf86vm-dev libvulkan-dev libglfw3-dev libnvidia-ml-dev
) - 克隆此仓库并初始化子模块
- 运行
source path/to/vulkan-sdk/1.3..<version>/setup-env.sh
- 运行
cmake -DVULKAN_BUILD_DEPENDENCIES=on -S . -B path/to/build
- 运行
make -C path/to/build -j
有关使用示例,请参阅 docs/examples.md。
示例微网格
该工具包提供了一些基本工具来处理和烘焙位移微地图。可以将其视为创建一个应用于低多边形网格的高度图,不同之处在于高度图被高度压缩,支持硬件加速光线追踪,并且不需要 UV。这里提供了一些示例起始资产来演示工具包的使用。下载这些资产以开始,但也可以尝试使用您自己的资产。
请注意,这些工具目前仅支持 glTF 格式的资产。其他格式必须进行转换。
有关使用这些网格的典型资产处理示例,请参阅 docs/examples.md。
SDK和工具包结构
micromesh SDK
NVIDIA 置换微贴图 SDK是一个用于嵌入其他应用程序和工具的低级 API。它具有 C 风格的 API 以及与 API 无关的 GPU 接口,以便于这种嵌入。因此,它有时使用起来不太容易。所有功能都通过 micromesh
命名空间提供,并频繁使用 micromesh::ArrayInfo
结构,这允许它以指针和步长组合的形式传递数据。所有用户可见的数据都由用户分配,因此某些操作分两步执行,其中 micromeshOpSomethingBegin 返回所需的大小,而 micromeshOpSomethingEnd 完成它。也可以使用 micromeshOpContextAbort 中止此类操作。因此,micromesh::Context
是有状态的,但相当轻量级,以便您可以为每个线程创建一个。目前,上下文内还有一些基本的自动线程处理。
micromesh_core
:用于创建或修改微贴图和微网格数据的基本数据结构、实用工具和操作的库。micromesh_displacement_compression
:处理置换微贴图压缩的库。micromesh_displacement_remeshing
:用于基于 GPU 的重新网格化的库。
bary 文件
- NVIDIA 置换微贴图 BaryFile:用于存储
微贴图
的.bary
文件容器的库。该仓库提供了三个库:bary_core
:核心库定义了容器中使用的结构,并提供了辅助验证和序列化的基本函数。C 风格接口。bary_utils
:实用工具库具有 C++ 实用程序,可帮助使用 stl 容器存储数据以及通过文件操作加载或保存内容。bary_tool
:一个命令行工具,用于打印.bary
文件内容的关键信息。
meshops API
meshops
API 是 micromesh
SDK 之上的一层,提供更易于使用的高级操作,如烘焙。这些函数通常对内存中提供的单个网格进行操作,通过称为 meshops::MeshView
的抽象来实现。这一层使用 Vulkan 实现来执行各种基于 GPU 的操作,并利用 nvpro_core
框架来实现。
这个 meshops
层仍在进行中,因为我们正在向其迁移更多功能,可能会比 micromesh
API 看到更多的变化。
meshops_core
:为meshops
命名空间提供主要框架,并涵盖了几个基本操作meshops_bake
:提供各种基于从基础网格到高细节参考网格的光线追踪操作。 我们想指出,这不是商业级的烘焙器,它主要用于示例目的。meshops_remesher
:重新网格化器运行一种新颖的 GPU 加速网格简化算法,并生成其他有助于置换微贴图烘焙的网格属性。- 为高细节参考网格生成置换微贴图,可选择在运行时进行曲面细分以考虑提供的额外高度图置换。
- 从高细节参考网格重新采样现有纹理到基础网格(还允许创建或重新采样切线空间法线贴图)。
工具和库
所有工具都操作 glTF 2.0 文件,并支持 NVIDIA 的额外微贴图特定 glTF 扩展。规范可在 https://github.com/KhronosGroup/glTF/pull/2273 查看。
所有微贴图数据都存储为 .bary
文件,这是一种新的容器/文件格式,专门设计用于允许直接存储光线追踪 API 消耗的数据,无需额外处理。有关更多详细信息,请参阅开源的 NVIDIA 置换微贴图 BaryFile。
micromesh_tool
:这是基于meshops
操作的主要工具。 我们计划将所有工具操作迁移到这里,但尚未完成迁移和重构。 目前工具操作基于独立的场景状态(每次重新加载gltf),未来将有一个持久的内存场景供操作修改。 该工具目前支持:- 使用
meshops_bake
进行烘焙 - 使用
meshops_core
进行预细分,计算细分级别并调整基础网格细分以适应5级细分限制 - 使用
meshops_core
进行位移细分,创建应用所有微图位移的细分网格(将网格展平为传统三角形) - 优化:裁剪和压缩微网格。由于只有压缩的微图与光线追踪API兼容,这可用于准备未压缩的微图进行渲染。
- 使用
meshops_remesher
进行重新网格化,简化网格作为烘焙的基础网格。
- 使用
micromesh_python
:这是一个Python模块,功能类似于micromesh_tool
,公开了meshops_*
层的工具包操作,但不依赖glTF。它操作的网格几何和其他属性由更通用的numpy
数组定义。
微型示例
微型示例以最小化方式展示了我们的API,不依赖加载模型或其他文件,而只是程序化生成内容以减少复杂性
dmm_displacement
:学习如何使用VK_NV_displacement_micromap
扩展对位移微网格进行光线追踪。 它还展示了如何使用micromesh
SDK以最小化方式创建所需数据。 此示例强制要求支持该扩展。
编写时
VK_NV_displacement_micromap
仍处于测试阶段,意味着 扩展可能会发生变化。请勿在生产代码中使用此处的头文件!
微网格工具箱
micromesh_toolbox
是一个图形化工作台,
允许检查微网格并与一些工具交互。它依赖VK_NV_mesh_shader
来实现微网格的光栅化显示。VK_KHR_acceleration_structure
用于烘焙微图。
如果可用,选择Rendering -> RTX时会使用VK_NV_displacement_micromap
通过光线追踪渲染微网格。VK_NV_displacement_micromap
在基于Ada Lovelace架构的RTX 40系列GPU中引入。之前的RTX卡也支持,但Ada性能更佳。如果看到缺少扩展的消息,请更新到最新驱动程序(注意:beta驱动可在https://developer.nvidia.com/vulkan-driver 获取)。
微网格的光栅化,尤其是压缩后的,本身是一个较为复杂的话题。一个专门的示例可在 https://github.com/nvpro-samples/vk_displacement_micromaps 找到。
编写时
VK_NV_displacement_micromap
仍处于测试阶段,意味着 扩展可能会发生变化。请勿在生产代码中使用此处的头文件!
微网格工具
命令行工具micromesh_tool
可用于
自动化和定义持久的资产管道。
微网格Python
工具包的Python绑定,汇总在Jupyter Notebook
中,可用于在任何支持Python环境的应用程序中集成资产管道。
更多详情请参见micromesh_python
。
基本数据结构
微网格是使用2的幂次方方案细分基本三角形的结果。 它由微三角形和微顶点组成。
三角形W,U,V
V V V
x x x
/ \ / \ 微 / \
/ \ / \ 三角形 x _ x 微顶点
/ \ / \ / \ / \
/ \ x _____ x x _ x _ x
/ \ / \ / \ / \ / \ / \
/ \ / \ / \ x _ x _ x _ x
/ \ / \ / \ / \ / \ / \ / \
x _____________ x x _____ x _____ x x _ x _ x _ x _ x
W U W U W U
细分级别0 细分级别1 细分级别2
1个微三角形 4个微三角形 16个微三角形
即基本三角形
有关如何使用它生成位移的更多详细信息,请参见docs/data_structures.md。
微网格资产管道
我们在微网格资产管道幻灯片 以及docs/asset_pipeline.md中描述了从原始输入网格创建微网格资产所需执行的核心步骤
关于最新版本
版本1.2
- 在meshopsOpCompressDisplacementMicromaps()中添加对eR11_unorm_packed_align32的支持
- 添加micromesh_tool --normal-textures-stem选项以生成法线贴图
- micromesh_tool --resample-resolution参数现在接受2D分辨率
- 光线追踪时或缺少法线贴图时的平面着色选项
- 更新到最新的nvpro_core
- 使用heightmap_rtx在光线追踪时预览高度图置换
- 保存场景时并行写入纹理
- 修复从基础网格材质烘焙高度图的问题 - 现在使用参考网格
- 修复加载*.exr高度图的支持
- 使用--height-textures-stem时过滤动态范围的异常值(实验性)
- 使用软件纹理插值在光栅化时预览高度图置换
版本1.1
- 在micromesh_toolkit中实现具有动态LOD的高度图渲染
- 估算分批烘焙高分辨率高度图的内存
- Micromesh USD模式定义和libusd API
- meshopsOpApplyBounds()用于应用(并丢弃)方向边界到位置和方向
- 改进对烘焙整个场景的glTF实例化/节点层级支持
- 修复重采样时图像文件名生成的问题
- 避免保留未使用和空的glTF扩展引用
- 修复automation/link_heightmaps.py中常规纹理名称的匹配问题
第三方许可
本项目嵌入或包含(作为子模块)多个第三方开源库和/或由它们衍生的代码。所有这些库的许可证都包含在本项目或nvpro_core依赖的PACKAGE-LICENSES文件夹中。
支持联系
欢迎直接在GitHub页面提交问题,或通过displacedmicromesh-sdk-support@nvidia.com联系NVIDIA