# photon_mapping

minimal but extensible header only implementation of photon mapping in C++.

## Features

- Direct illumination with explicit light sampling
- Indirect illumination with final gathering
- Caustics photon map
- Reference path tracing integrator
- Load obj model

## Requirements

## Build

CMake option | Description |
---|---|

BUILD_TESTS | build tests |

```
git submodule update --init
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
```

## Run

place `obj`

model under `build`

and run

```
./examples/main
```

## Structure

Name | Description |
---|---|

`include/camera.h` |
ray generation from camera |

`include/core.h` |
basic data types |

`include/image.h` |
image |

`include/integrator.h` |
implementation of photon mapping, path tracing(for reference) |

`include/light.h` |
light |

`include/material.h` |
implementation of BRDF, BTDFs |

`include/photon_map.h` |
implementation of photon map with kdtree |

`include/primitive.h` |
primitive |

`include/sampler.h` |
random number generation, sampling utilities |

`include/scene.h` |
ray-scene intersection, model loading |

`include/triangle.h` |
point sampling on a triangle |

## Gallery

### Cornell box without final gathering

Parameter | Value |
---|---|

number of photons | 1000000 |

number of nearest neighbors | 100 |

number of samples | 100 |

final gathering | false |

### Cornell box with final gathering

Parameter | Value |
---|---|

number of photons | 1000000 |

number of nearest neighbors | 100 |

number of samples | 100 |

final gathering | true |

### Cornell box with mirror spheres

Parameter | Value |
---|---|

number of photons | 1000000 |

number of nearest neighbors | 100 |

number of photons for caustics photon map | 1000000 |

number of samples | 100 |

### Cornell box with water

Parameter | Value |
---|---|

number of photons | 100000 |

number of nearest neighbors | 100 |

number of photons for caustics photon map | 10000000 |

number of samples | 256 |

This model is available under `models/`

## Externals

## References

- Jensen, Henrik Wann. Realistic image synthesis using photon mapping. AK Peters/crc Press, 2001.
- https://pbr-book.org/3ed-2018/Light_Transport_III_Bidirectional_Methods/Stochastic_Progressive_Photon_Mapping#
- http://www.cs.cmu.edu/afs/cs/academic/class/15462-s12/www/lec_slides/lec18.pdf
- McGuire Computer Graphics Archive
- Rendering Resources | Benedikt Bitterli's Portfolio
- Jensen, Henrik Wann. "Global illumination using photon maps." Eurographics workshop on Rendering techniques. Springer, Vienna, 1996.
- Christensen, Per H. "Faster photon map global illumination." Journal of graphics tools 4.3 (1999): 1-10.
- Hachisuka, Toshiya, Jacopo Pantaleoni, and Henrik Wann Jensen. "A path space extension for robust light transport simulation." ACM Transactions on Graphics (TOG) 31.6 (2012): 1-10.