/Ensemble-Denoising

Source Code for SIGGRAPH Asia 2021 Paper "Ensemble Denoising for Monte Carlo Renderings"

Primary LanguageC++MIT LicenseMIT

Ensemble Denoising

Source Code for SIGGRAPH Asia 2021 Paper Ensemble Denoising for Monte Carlo Renderings.

Paper | Code | Talk Slides

Dependencies

  • A C++17 conformant compiler for building the code
  • CMake for configuring the project
  • Eigen3 for linear algebra data structures and operations
  • OpenCV for image IO and basic operators
  • cxxopts (included as a git submodule) for parsing CLI options
  • fbstab (optional, included as a git submodule) for linearly constrained quadratic programming as the baseline solver

Compiling the Project

First, please make sure that Eigen3 and OpenCV are properly install in your system and can be found by CMake.

To clone the repository:

git clone --recursive https://github.com/Mike-Leo-Smith/EnsembleDenoising.git

Then, use CMake to configure the build:

cmake -S <project-dir> -B <build-dir> -D CMAKE_BUILD_TYPE=Release

Note: to help CMake find Eigen3 and OpenCV, you may need to provide -D Eigen3_DIR=... and -D OpenCV_DIR=... as well. Also, you can use the -G <generator> option to specify your favorite generator, and -D CMAKE_CXX_COMPILER=<...> to choose the C++ compiler.

After the project is properly configured, use the following command to build the program:

cmake --build <build-dir>

And the executable EnsembleDenosing should appear in <build-dir> if successfully built.

Preparing Input Data

The input data should be organized in the following structure:

<input-dir>
  │
  ├─ color.exr, colorA.exr, colorB.exr, albedo.exr, normal.exr
  │
  ├─ <base-denoiser-1>
  │    │
  │    └─ <base-denoiser-1>.exr <base-denoiser-1>A.exr <base-denoiser-1>B.exr
  │
  ├─ <base-denoiser-2>
  │    │
  │    └─ <base-denoiser-2>.exr <base-denoiser-2>A.exr <base-denoiser-2>B.exr
  ...

For example, if denoising-data is the input directory and two denoisers oidn and nfor are used, the directory structure should be

denoising-data
  │
  ├─ color.exr, colorA.exr, colorB.exr, albedo.exr, normal.exr
  │
  ├─ oidn
  │    │
  │    └─ oidn.exr oidnA.exr oidnB.exr
  │
  └─ nfor
       │
       └─ nfor.exr nforA.exr nforB.exr

You can use any scene, renderer, and denoiser to generate these data. In the paper, we use Tungsten for rendering.

Running the Program

To print the help message:

./EnsembleDenoising -h

To perform the ensemble denoising:

./EnsembleDenoising -i <input-dir> -o <output-dir> -m <base-denoiser-1>[,<base-denoiser-2>[...]]