First of all, I'd like to thank everyone that helped and helps me on the Graphics Programming discord, it's an amazing community, that you can find here : https://discord.gg/2nyse8kpKb
This was my first project using C++, the goal of this was to learn both this language, software engineering, rendering, maths and computer graphics. I've decided to end this project here and start a new pathtracer, RomanoRender++, to apply everything I've learned and create a more performant and versatile render engine, instead of rewriting almost everything here. I'll leave this project as it is, to have a memory of it but also compare to my new renderer and see how I've progressed.
RomanoRender uses Vcpkg to manage libraries accross different platforms and CMake to support cross-platforms building.
Libraries needed are :
Make sure Git is installed on your machine and run
git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat
Once Vcpkg is installed, run the following to integrate it within visual studio
.\vcpkg\vcpkg integrate install
Run the following to install the needed libraries. This might take up to 30 min to build everything (OpenImageIO has a lot of dependencies)
cd /path/to/vcpkg/installation
vcpkg install embree
vcpkg install OpenImageIO
vcpkg install Boost
vcpkg install OpenColorIO
Once all needed libraries have been installed, you can run CMake to build the project
mkdir build
cd build
cmake ../
cmake --build ./ --config Release
- Intel embree3
- OpenColorIO support (default configuration shipped with the renderer is ACES 1.0.3)
- OpenImageIO support for image output (various format supported : exr, jpg, png, tiff...)
- Obj file format supported
- Different integrators (Pathtracing, Cartoon, Ambient Occlusion, Scene Viewer)
- Uber-Shader (with different layers : Lambertian BRDF, GGX/Cook-Torrance BRDF/BTDF, Random-Walk SSS)
- Rich render interface with a progressive render-view, scene editor (per scene object transform and material)
- Basic pinhole camera model with depth of field
- Importance Sampling / Multiple Importance Sampling
- More BxDFs
- Texture system
- Small procedural texturing language
- Adaptive sampling
- Improve the ui
- Add support for Alembic file format
- Improve overall performance of the renderer
Journey:
First triangle mesh, exported from maya as obj :
First real mesh rendered with face normal as color, and a proper camera with position and lookat :
The first heavy mesh with a simple acceleration structure :
The Pixar Kitchen rendered with an improved naive acceleration structure :
X Wing rendered with uv coordinates from the obj file :
Finally getting a proper point light working :
Global illumination with point light :
Glass (and embree3 implementation) :
Few bugs through area light implementation :
Finally working :
A more interesting area light render :
Render mixing area and directional lights :
Depth of field and pure reflective material :
The infamous white dome light aka ambien occlusion :
GGX and Cook-Torrance for refraction :
HDRI naive lighting :
Combining all the cool stuff I implemented lately : (thank's to Flore Dechorgnat for the shading -> https://www.instagram.com/flore_dchrgnt)