[M3] 学习日志

Log

启动流程

调用链

  • src\mitsuba\mitsuba.cpp

    • main()

      • 核心模块的启动与注册
      • 解析命令行参数
      • 不同后端(cuda、llvm)的设置
      • 启动渲染流程:render()
      1
      MI_INVOKE_VARIANT(mode, render, parsed[0].get(), sensor_i, filename);
    • render()

      • 调用:integrator->render()
      • SamplingIntegrator:MC PT 的抽象基类
  • src\render\integrator.cpp::render()

    1
    2
    MI_VARIANT typename SamplingIntegrator<Float, Spectrum>::TensorXf SamplingIntegrator<Float, Spectrum>
    ::render(Scene *scene, Sensor *sensor,uint32_t seed,uint32_t spp,bool develop,bool evaluate);
    • 这里只关注 GPU 部分
    • 启动的最大线程数:0xffffffffu(4294967295U)
      • \(\approx 2071\times(1920\times1080)\)
    • 定位像素:如果要修改光线的位置(适应性采样)应该在这里
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Compute discrete sample position
    UInt32 idx = dr::arange<UInt32>((uint32_t) wavefront_size);

    // 省略了部分代码

    // Compute the position on the image plane
    Vector2i pos;
    pos.y() = idx / film_size[0];
    pos.x() = dr::fnmadd(film_size[0], pos.y(), idx);
    • 调用 render_sample() 进行 1spp 的 block 内的渲染
  • src\render\integrator.cpp::render_sample()

    • 调用 sample() 进行渲染
      • 也就是具体的 integrator 的实现