NVIDIA Falcor的路径追踪器(PathTracer)是一个基于DXR 1.1实现的无偏路径追踪器,支持屏幕空间光线生成、重要性采样和嵌套介质处理,适用于实时渲染中的高质量全局光照计算。
使用PathTracer1. 运行环境配置
- 构建与启动:在Visual Studio中构建Falcor项目,选择Mogwai作为启动项目。
- 加载脚本:运行Source/Mogwai/Data/PathTracer.py(基础版)或PathTracerNRD.py(去噪版)。
- 加载场景:加载media/Arcade/Arcade.pyscene文件,拖动相机视角可观察降噪效果(快速拖动时噪点明显)。
2. 渲染层架构
- 四层RenderPass:PathTracer是核心层,基于屏幕空间信息生成路径,支持无偏渲染。
- 输入参数:
必选:vbuffer(命中网格体/原始序号及重心坐标,用于获取首次碰撞的顶点和材质数据)。
可选:mvec(运动向量)、viewW(观察方向)、sampleCount(自适应采样数)。
- 输出参数:
基础输出:color(最终Radiance)、albedo(漫反射率)、normal(法线)。
调试输出:rayCount(光线数目)、pathLength(路径长度)。
去噪输出:nrd*(NRD去噪器专用数据)。
渲染层:PathTracer1. 执行流程
2. 光线弹射控制
3. 参数更新逻辑
- renderRenderingUI函数:标记参数是否被修改(dirty),若被修改则触发重新编译。
- updatePrograms函数:检查mRecompile标志,若为true则重新编译程序。
bool PathTracer::renderRenderingUI(Gui::Widgets& widget) { // ... if (dirty) mRecompile = true;}void PathTracer::updatePrograms() { FALCOR_ASSERT(mpScene); if (mRecompile == false) return; // ...}采样策略(Sampling Strategies)1. BSDF采样(MIS)
- 材质模型:迪士尼各向同性漫反射、Trowbridge-Reitz GGX镜面反射/透射。
- 采样选择:随机选择漫反射、镜面反射或透射,粗糙度接近0时采用理想镜面反射/透射。
2. 环境贴图采样(MIS)
- 加速结构:使用Mipmap加速,基于Mipmap层级计算入射Radiance加权和。
- 采样方法:采样PDF与入射Radiance成比例,忽略余弦项和可见项。
3. 自发光网格采样(MIS)
- 层次结构:对发光三角形构建BVH,预积分光通量并排除非发光三角形。
- 采样方法:层次重要性采样,优先采样高光通量区域。
4. 解析光源采样
- 光源类型:点光源、方向光源、远距离光源、四边形/圆盘/球体光源。
- 采样方法:等概率选择各光源,避免单一光源主导采样结果。
嵌套介质材料(Nested Dielectric Materials)1. 场景配置
- 材料属性:在.pyscene文件中配置透射材质(如玻璃、液体),需设置以下参数:
indexOfRefraction:折射率(如玻璃1.55、水1.33)。
specularTransmission:透射率(1表示完全透射)。
doubleSided:启用双面渲染,避免法线方向问题。
nestedPriority:优先级标识,值越大优先级越高(默认0为最高优先级)。
2. 示例配置
# 配置玻璃材质glass = sceneBuilder.getMaterial("TransparentGlass")glass.roughness = 0glass.metallic = 0glass.indexOfRefraction = 1.55glass.specularTransmission = 1glass.doubleSided = Trueglass.nestedPriority = 5# 配置水材质water = sceneBuilder.getMaterial("Water")water.roughness = 0water.metallic = 0water.indexOfRefraction = 1.33water.specularTransmission = 1water.doubleSided = Truewater.nestedPriority = 13. 优先级处理
- 栈方法:Falcor使用基于栈的方法解决嵌套介质优先级问题,通过nestedPriority变量标识优先级。
- 避免空气夹缝:嵌套介质网格需重合,优先级高的材质优先处理光线交互。