Tikan Renderer

Vulkan based voxel renderer

Siebencorgie published on
3 min, 427 words

Tikan engine

Tikan was the next project after Jakar. It is my take on high resolution voxel rendering. Since it does not do much more than rendering, the term engine doesn't really fit here. It is inspired by the Atomontage engine engine and John Lin's voxel experiments at the time.

Before starting the project, I created my first wrapper around Ash/Vulkan called Marp. Utilizing that, I created my first try on a widget toolkit called Widkan. Both are used in Tikan.

While working on Tikan's voxelizer for GLTF2 objects, I briefly worked on Voxer. The goal was to unify different representations of voxels, similar to the image crate, but in 3D. In the end such a unification proved to be not as easy as I thought, so it only became the CPU side container for voxels in Tikan.

The project had two main goals.

  1. See how hard it is to render high resolution voxel objects efficiently
  2. See if we can calculate GI efficiently from such a voxel scene

The first point is more or less a problem of optimising memory usage and primary ray tracing. In the end I settled for a sparse voxel octree since they are easy to build and maintain, while also being easy to trace.

The second point is a little more involved. I tried multiple approaches of gathering GI. The final version is based on the voxel cone idea. My hope was, that both shadows and light emitters could be solved by the same GI gathering pass. The advantage would be that you don't have to implement multiple emitter types, but just mark a voxel as emitting light. In the end, the voxel cones worked well for low frequency effects like GI, but were not suitable to solve all incoming direct light. The main problem was the wide cone angle needed to get a fast enough calculation. It leads to those block-ish light areas seen in the video below the light emitting spheres.

A nice property of this approach is the constant evaluation cost. Since there are no dedicated emitter objects, the rendering cost does not scale with the number of emitters in the scene at all. Adding light is therefore basically free.