Wulkan is a personal Vulkan-based real-time renderer focused on learning modern graphics techniques and reproducing the visual quality of a path-traced reference image created during an ETH Computer Graphics course final project.
| Feature | Description |
|---|---|
| Terrain Tessellation | Curvature- and distance-based dynamic tessellation with frustum culling |
| Shadows | Cascaded Shadow Maps with Contact-Hardening Soft Shadows |
| OBJ Loading | PBR-capable OBJ loading with PBR material support |
| CPU Instancing | Supports CPU instancing with multiple different level of detail models |
| Tone mapping | Supports multiple tone mappers such as Rheihard, ACES & AgX |
Supported platforms: Windows
Add binary into the Wulkan folder and execute from there
Requirements:
- Vulkan SDK 1.3+ with TODO
- Visual Studio 2022
Steps:
- Open
Wulkan.slnin Visual Studio - Set the Vulkan SDK paths:
- Add
VulkanSDK\<Version>\Libto Linker -> General -> Additional Library Directories - Add
VulkanSDK\<Version>\Includeto VC++ Directories -> External Include Directories
- Add
- Build in
ReleaseorDebug
Uses mean curavture (precomputed) and distance to camera to decide how much to tesselate. If a patch is completly outside of the camera frustum, it gets culled.
The non symmetry is due to how we use finite difference to estimate the curvature
Visualize terrain with tesselation strength
Shows tesselated terrain with diffuse lighting and its corresponding wireframe
Implements cascaded shadow maps with contact hardening soft shadows
Shows the difference between no shadows, hard shadows and soft shadows. Most notable on the shadow of the baloon in the left half of the images
Enables loading Obj files using tinyobjloader. Supports PBR Materials supporting diffuse, metallic, roughness parameters and diffuse textures.
Shows a simple OBJ file being loaded into the engine
Test scene with a more complex, textured material
TODO Mipmapped Textures
Mipmapped Textures CPU Instancing and LOD
Implements different tonemappers as a post processing step (full screen quad) before ImGUI draws it's UI ontop.
No tonemapper
Rheinhard on Luminance
Extended Rheinhard on Luminance
Uncharted / Hable Filmic with default parameters
ACES tone mapper
AgX with Punchy preset
The white point for extended rheinhard is set using the GUI. Uncharted 2's tonemapper is shown with the default values from the following blog and the plan is to replace it with a tonemapper with more understandable parameters (New Hable filmic).
This image is meant as a visual target to inspire which feature to add to the project and the goal is not prefect parity. Trade off's will need to be made due to real time constraints.
Pathtraced image for my final project in ETH Computer graphics course (two person project).
Lower half of image is used as inspiration/goal for this real time project
- GLFW
- Volk
- vk-bootstrap
- vma
- imgui
- glm
- rapidcsv
- stb_image
- tinyexr
- miniz (used by tinyexr)
- tph_poisson
- tracy
- tinyobjloader
For a roadmap see Wulkan/TODO.md




