Skip to content
taurasgPreparing
ENLT

Back

2026Path tracer

Rayxix

An interactive Vulkan path tracer, written from an empty CMake file for my bachelor's thesis: hardware ray tracing, a GGX BSDF, and four denoisers measured against each other.

Role
Everything — bachelor's thesis
Year
2026
Built with
  • C++20
  • Vulkan
  • Slang
  • SVGF
  • ImGui
  • glTF

C++20 on Vulkan's VK_KHR_ray_tracing_pipeline, with an ImGui workspace over the top. The composition root is four lines long — a window, a Vulkan context, a frame coordinator and one tool layer — because everything interesting is underneath it: acceleration structures, descriptor sets, a shader binding table, and the images the path tracer accumulates into.

All of the shading is one Slang file. CMake compiles it into four SPIR-V modules — ray generation, miss, closest hit, and a compute pass for denoising — so the four stages that have to agree about a material are written next to each other rather than in four files that drift. The BSDF is GGX with Smith masking and importance sampling, lights are sampled directly with a shadow ray, and the camera has a real aperture: the lens sample is two numbers added to the ray origin.

Path tracing is an average, and an average of a few samples is noise — so the second half of the project is denoising, and there are four of them rather than one: bilateral, A-trous, temporal reprojection, and SVGF. They are switchable at runtime because the thesis question was never "which is best" but "best at what".

Because it is a thesis, that had to be measured rather than asserted. A deterministic flythrough runs each denoiser across three presets and exports CSV, and the answer turns out to depend entirely on how much ray tracing you are already paying for. At 1 sample per pixel, SVGF costs 46% more GPU time than no denoiser at all; at the quality preset, where tracing dominates the frame, the same SVGF costs about 5% and takes the quality score to 98. In between, temporal reprojection wins outright — 18.16 ms against SVGF's 19.04 for three points less quality, which the mixed score says is the better trade.

© 2026 Tauras Giedraitis · Kaunas, Lithuania · All rights reserved