图形实验
这里会随机放置一些用于实现/验证图形论文的内容。
要正确克隆此仓库,需要安装 Git LFS。
实现
ReSTIR DI: 基于储层的时空重要性重采样(用于直接光照)
用于实时光线追踪动态直接光照的时空储层重采样 https://research.nvidia.com/publication/2020-07_Spatiotemporal-reservoir-resampling
ReSTIR DI 利用重采样重要性采样(RIS)、加权储层采样(WRS)以及合并多个储层的特性,在主光线命中点实现了从大量发光图元高效采样的能力。
[代码](https://github.com/shocker-0x15/GfxExp/blob/master/restir_di
- 基本实现(有偏RIS估计器、时空重用)
- 高级项目
- 漫反射 + 光泽 BRDF
- 环境光
- 具有MIS权重的无偏RIS估计器
- 实现改进的ReSTIR算法: "重构用于生产的时空重采样" https://research.nvidia.com/publication/2021-07_Rearchitecting-Spatiotemporal-Resampling
来自Morgan McGuire的计算机图形档案的Amazon Lumberyard Bistro(外部)
ReGIR: 基于网格的储层重要性重采样
第23章 "用基于网格的储层渲染多光源", 光线追踪宝石II https://www.realtimerendering.com/raytracinggems/rtg2/index.html
ReGIR与ReSTIR类似,使用流式RIS实现了从大量发光图元高效采样的能力。与ReSTIR DI不同,ReGIR支持二次及以后的光源采样,因此将储层记录在世界空间网格中,并执行两阶段的流式RIS。
[代码](https://github.com/shocker-0x15/GfxExp/blob/master/regir
- 基本实现(均匀网格、时间重用)
- 高级项目
- 漫反射 + 光泽 BRDF
- 环境光
- 使用哈希图的滚动剪裁贴图或稀疏网格
- ReGIR + 多重重要性采样(不可能?)
来自Morgan McGuire的计算机图形档案的Amazon Lumberyard Bistro(内部)
NRC: 神经辐射缓存
用于路径追踪的实时神经辐射缓存 https://research.nvidia.com/publication/2021-06_Real-time-Neural-Radiance
路径追踪 + 神经辐射缓存通过用神经网络缓存的值替换超过某个路径长度的贡献,以小偏差为代价实现了低方差的估计(对某些场景还可以缩短渲染时间)。NRC是一个相对较小的网络,训练采用渲染过程中的在线学习,实现了"通过适应实现泛化",推理执行时间也很短,适合实时渲染。
[代码](https://github.com/shocker-0x15/GfxExp/blob/master/neural_radiance_caching
- 基本实现(基于简单路径追踪、频率/单blob输入编码)
- 高级项目
- 结合多光源采样技术如ReSTIR/ReGIR
- 添加多分辨率哈希网格输入编码:
"使用多分辨率哈希编码的即时神经图形基元"
https://nvlabs.github.io/instant-ngp/
来自开放研究内容档案(ORCA)的Zero-Day
SVGF:时空方差引导滤波
时空方差引导滤波:路径追踪全局光照的实时重建
https://research.nvidia.com/publication/2017-07_spatiotemporal-variance-guided-filtering-real-time-reconstruction-path-traced
SVGF在参考物体表面参数的同时,对通过路径追踪等方法获得的光照结果进行图像空间滤波。它在时间和空间上跟踪每个像素光照的方差,在方差小的区域使用较小的滤波半径,在方差大的区域使用较大的滤波半径,从而在不过度模糊图像的同时减少渲染图像中的视觉噪声。通过使用à-trous滤波器,可以以相对较低的成本实现大的滤波半径。
SVGF在屏幕空间中对通过路径追踪等方法获得的光照结果进行滤波,同时参考表面参数。它在空间和时间上跟踪每个像素光照的方差,然后在方差较低的部分使用较小的滤波半径,在方差较高的部分使用较大的滤波半径,以消除渲染图像中的可感知噪声,同时避免图像过度模糊。它使用à-trous滤波器,因此可以以相对较低的成本使用大的滤波半径。
[代码](https://github.com/shocker-0x15/GfxExp/blob/master/svgf
- 基本实现(时间累积、SVGF、时间抗锯齿)
- 高级项目
- 实现改进算法:
"À-Trous小波降噪器的快速GPU调度"
https://jo.dreggn.org/home/
- 实现改进算法:
来自Morgan McGuire的计算机图形档案的Crytek Sponza
TFDM:无曲面细分位移映射
用于光线追踪的无曲面细分位移映射
https://research.adobe.com/publication/tessellation-free-displacement-mapping-for-ray-tracing/
在TFDM中,高度图的每个纹素的最小值和最大值被层次化记录的Minmax mipmap被用作与基础网格形状分离的隐式BVH(的一部分),从而无需预先进行曲面细分,就能以低内存占用实现对细节丰富的几何体进行光线追踪。在遍历过程中,每个基础三角形都会触发交点着色器。使用三角形每个顶点的位置、法线、纹理坐标和Minmax mipmap的值,通过仿射运算实时计算层次化的AABB并进行光线相交测试,最终与最终形状进行相交测试。
在TFDM中,Minmax mipmap用于层次化存储每个纹素的最小值和最大值,作为与基础网格形状解耦的隐式BVH(的一部分)。这允许在不进行预先曲面细分的情况下对详细几何体进行光线追踪,从而实现低内存占用。在遍历过程中,每个基础三角形都会调用交点着色器。使用三角形顶点的位置、法线、纹理坐标以及Minmax mipmap的值,通过仿射运算实时进行AABB计算和光线相交测试,最后与最终形状进行光线相交测试。
- 基本实现(Minmax mipmap遍历、盒子/两三角形局部相交、非环绕纹理)
- 高级项目
- 更好的根选择
- 灵活的遍历顺序
- 双线性局部相交
- B样条局部相交
- 纹理环绕
- 纹理变换
- 水密性考虑
- 连续细节级别
高度图来自textures.com
用于位移和壳映射的非线性光线追踪
用于位移和壳映射的非线性光线追踪
https://github.com/shinjiogaki/nonlinear-ray-tracing
壳空间——由基本三角形和顶点法线形成的偏移三角形所包围的空间——和纹理空间——位移映射中的高度场和壳映射中的实例BVH"无失真"存在的空间——之间的映射关系表明,在纹理空间中的射线表现为曲线,具体来说是二次有理函数。该方法通过直接求解曲线射线与由Minmax mipmap或实例BVH给出的AABB之间的交叉检测,以及曲线射线与纹理空间中微三角形的交叉检测,实现了高效且低内存消耗的位移映射和壳映射,无需繁琐的初始化处理。
[代码](https://github.com/shocker-0x15/GfxExp/blob/master/nrtdsm
- 基本实现
- 位移映射(非环绕纹理)
- 壳映射(非环绕纹理)
- 高级项目
- 更好的根选择
- 基于射线-包围盒击中距离的遍历顺序
- 纹理环绕
- 纹理变换
- 壳映射的多材质支持
- 验证论文中的数值行为和退化情况
茶壶来自Morgan McGuire的计算机图形档案
其他
使用OptiX Utility作为OptiX/CUDA的包装器。
确认环境
目前已在以下环境中确认程序正常运行。
- Windows 11 (23H2) & Visual Studio Community 2022 (17.9.7)
- Ryzen 9 7950X, 64GB, RTX 4080 16GB
- NVIDIA驱动程序 555.85(注意510-512版本左右存在几个OptiX问题。)
运行程序需要以下库:
- CUDA 12.5
注意CUDA 12.5在Visual Studio 2022 17.10.0中编译C++20时存在问题。 - OptiX 8.0.0(需要Maxwell或更新一代的NVIDIA GPU)
开源软件
- Open Asset Import Library (assimp)
- CUBd
- Dear ImGui
- gl3w
- GLFW
- OptiX Utility
- stb
- Tiny CUDA Neural Networks (tiny-cuda-nn)
- Tiny OpenEXR image library (tinyexr)
2024 @Shocker_0x15