(c) 2017 - 2018 Michał Siejak (@Nadrin)
An implementation of physically based shading model & image based lighting in various graphics APIs.
The goal of this project is to showcase the use of various modern graphics APIs and to provide a clear side-by-side comparison of them. I believe that an implementation of physically based shading is a sufficiently non-trivial use case for that comparison to be useful.
Each implementation is completely self contained within a single source/header pair residing directly in
The coding style is mostly procedural ("C with classes") using simple POD structs for grouping related data together.
This was done for simplicity, readability, and to not impose any particular renderer design/organization.
Shared functionality (loading of images & 3D models, application event loop & entry point, misc utility functions)
can be found in
Please note that it was not my goal to try to come up with the most efficient/optimized use of each API. The rendered scene is very simple anyway (only handful of drawcalls, mostly static data), and when in doubt I tried to refrain from using "clever" tricks and went for simple solutions.
Shaders are heavily commented because there's where interesting stuff happens. :)
Visual Studio solution is available at
projects/msvc2017/PBR.sln. After successful build the resulting executable
and all needed DLLs can be found in
data directory. Note that precompiled third party libraries are only available
for x64 target.
sudo apt install build-essential cmake pkg-config libglfw3-dev libassimp-dev libgl1-mesa-dev libvulkan-dev
Download & install glslang. Make sure that
glslangValidator binary is in
PATH or in
Configure & build the project:
mkdir -p projects/cmake/build cd projects/cmake/build cmake .. make install
Make sure to run from within
data directory as all paths are relative to it. API to be used can be specified on the command line
as a single parameter (
-d3d12). When run with no parameters
-d3d11 is used
on Windows, and
-opengl on other platforms.
|LMB drag||Rotate camera|
|RMB drag||Rotate 3D model|
|Scroll wheel||Zoom in/out|
|F1-F3||Toggle analytical lights on/off|
This implementation of physically based shading is largely based on information obtained from the following courses:
Other resources that helped me in research & implementation:
This project makes use of the following open source libraries:
The following assets are bundled with the project: