A graphics engine built on top of Vulkan+OpenGL. Serves also as playground for learning various best practices in Graphic APIs, CMake, Rust, ....
(see also Official homepage)
Key Features β’ How To Use β’ Download β’ Credits β’ Related β’ License
Table of Contents
This project provides me a solid Vulkan/OpenGL renderer starting point for implementing
modern established rendering techniques and getting quickly started in own research topics.
As this project evolved it gained additional functionality:
- collecting/using CMake best practices
- collecting/using C++ best practices and testing new lang features π
- collecting experience in fuzzy/benchmark testing in C++
- collecting experience in integrating π Rust π code in Cmake projects
Frequently tested under
- [latest windows and ubuntu version]
- [GCC/CLANG/MSVC/CLANG-CL]
Category | Feature | Implement Status |
---|---|---|
Vulkan Render agnostic | Rasterizer | βοΈ |
Raytracing | βοΈ | |
Path tracing | βοΈ | |
PBR support (UE4, Disney, etc.) | βοΈ | |
.obj Model loading | βοΈ | |
Mip Mapping | βοΈ | |
OpenGL Render agnostic | ||
Directional Lights | βοΈ | |
Point Lights | βοΈ | |
Spot Lights | βοΈ | |
Directional Shadow Mapping | βοΈ | |
Omni-Directional Shadow Mapping | βοΈ | |
Cascaded Shadow Mapping | βοΈ | |
Cloud system | βοΈ | |
3D-worley noise generation | βοΈ | |
.obj Model loading | βοΈ | |
PBR support (UE4,disney,phong, etc.) | βοΈ | |
Support for #include directives in shaders. |
βοΈ | |
Sky box | βοΈ | |
Supporting compute shader | βοΈ | |
On the fly 3D worley/perlin noise creation | βοΈ | |
C++/CMake agnostic | Code coverage for Clang | βοΈ |
Advanced unit testing | πΆ | |
Advanced performance testing | πΆ | |
Advanced fuzz testing | πΆ |
Legend:
- βοΈ - completed
- πΆ - in progress
- β - not started
- Vulkan 1.3
- OpenGL 4.6
- GLAD
- glm
- glfw
- tinyobjloader
- stb
- vma
- tinygltf
- doxygen
- gtest
- gbenchmark
- google fuzztest
- cmake
- gsl
- NSIS
- nlohmann_json
- SPDLOG
Dependencies to libraries are stated above.
C++23 or higher required.
C17 or higher required.
CMake 3.28.3 or higher required.
-
Clone the repo
git clone --recurse-submodules [email protected]:Kataglyphis/Kataglyphis-Renderer.git
-
Then build your solution with [CMAKE] (https://cmake.org/)
Here the recommended way over command line after cloning the repo:
NOTE: Here we use CmakePresets to simplify things. Consider using it too or just build on a common way.
For now the features in Rust are experimental. If you want to use them install
Rust and set RUST_FEATURES=ON
on your CMake build.
(for clarity: Assumption you are in the dir you have cloned the repo into)
$ mkdir build ; cd build
# enlisting all available presets
$ cmake --list-presets=all ../
$ cmake --preset <configurePreset-name> ../
$ cmake --build --preset <buildPreset-name> .
Alternatively you can use the build scripts I use for my standard configuration:
- [
buildEngine.sh
] - [
buildEngine.bat
]
$ {WORKING_DIR}/GraphicsEngineVulkan/buildEngine[.sh/.bat]
I provide two ways for compiling shaders with. Hence if you want to add new
files as #include
in your shaders you have to modify the files: (should be self-explanatory)
- [
include/vulkan_base/ShaderIncludes.hpp
] - [
cmake/CompileShadersToSPV.cmake
]
appropriately.
I have two tests suites.
-
Compilation Test Suite: This suite gets executed every compilation step. This ensures the very most important functionality is correct before every compilation.
-
Commit Test Suite: This gets executed on every push. More expensive tests are allowed :)
clang --analyze --output-format html $(find Src -name '*.cpp' -o -name '*.cc')
scan-build cmake --build .
clang-tidy -p=./build/compile_commands.json $(find Src -name '*.cpp' -o -name '*.cc')
conda create -n cmake_formating python=3.10
pip install pyyaml
pip install cmake-format
cmake-format -c ./.cmake-format.yaml -i $(find cmake -name '*.cmake' -o -name 'CMakeLists.txt')
clang-format -i $(find include -name "*.cpp" -or -name "*.h" -or -name "*.hpp")
Build the docs
pip install sphinx
pip install sphinx-press-theme
pip install myst-parser
cd docs
make html
Watch the refman generated by doxygen.
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
Distributed under the BSD 3-Clause "New" or "Revised" License. See LICENSE
for more information.
Jonas Heinle - @Cataglyphis_ - [email protected]
Project Link: https://github.com/Kataglyphis/GraphicsEngineVulkan
You will find important links to information in the code. But here in general some good sources of information:
Thanks for free 3D Models:
Some very helpful literature, tutorials, etc.
Rust
CMake/C++
OpenGL
Clouds
- pbr-book
- Inigo Quilez
- Shadertoy Horizon Zero Dawn
- Sebastian Lague
- Horizon Zero Dawn
- Clouds and noise
- Shadertoy Clouds using 3D Perlin noise
Noise
Vulkan
- Udemy course by Ben Cook
- Vulkan Tutorial
- Vulkan Raytracing Tutorial
- Vulkan Tutorial; especially chapter about integrating imgui
- NVidia Raytracing tutorial with Vulkan
- Blog from Sascha Willems
Physically Based Shading
- Advanced Global Illumination by Dutre, Bala, Bekaert
- The Bible: PBR book
- Real shading in Unreal engine 4
- Physically Based Shading at Disney
- RealTimeRendering
- Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs
- Sampling the GGX Distribution of Visible Normals
Path tracing