二十八、NVIDIA Falcor教程 - 路径追踪器(PathTracer)

二十八、NVIDIA Falcor教程 - 路径追踪器(PathTracer)
最新回答
紅太極

2022-06-14 01:03:57

NVIDIA Falcor的路径追踪器(PathTracer)是一个基于DXR 1.1实现的无偏路径追踪器,支持屏幕空间光线生成、重要性采样和嵌套介质处理,适用于实时渲染中的高质量全局光照计算。

使用PathTracer

1. 运行环境配置

  • 构建与启动:在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去噪器专用数据)。

渲染层:PathTracer

1. 执行流程

  • 光线生成:通过raygen shader对每个像素追踪光线,直到达到最大路径长度。
  • 着色处理:由hit/miss shader完成,可见性光线通过TraceRayInline追踪。
  • 采样策略

    屏幕空间采样:每个像素追踪samplesPerPixel根光线,实时渲染中SPP通常为1或小整数。

    光源采样:随机选择解析光源、环境贴图或网格光源,使用重要性采样(MIS)。

2. 光线弹射控制

  • 参数调整:通过maxSurfaceBounces、maxDiffuseBounces、maxSpecularBounces和maxTransmissionBounces控制光线弹射次数。

    透射(Transmission):通常设置为较高值(如10),允许光线通过更多介质表面。

    漫反射/镜面反射:通常设置为较低值(如3)。

  • 参数修改界面:在渲染层编辑器或Mogwai中直接调整参数。

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 = 1

3. 优先级处理

  • 栈方法:Falcor使用基于栈的方法解决嵌套介质优先级问题,通过nestedPriority变量标识优先级。
  • 避免空气夹缝:嵌套介质网格需重合,优先级高的材质优先处理光线交互。