voxolith

Research and credits

The published research Voxolith's techniques build on, what each paper contributed, and further reading for the renderer's next steps.

Voxolith stands on published graphics research. This page credits the work its techniques draw on, says what each paper contributed and what Voxolith does differently, and lists further reading that shapes where the renderer goes next. When a new technique lands, its papers are added here, on the pages that describe it, in the package README, in the code and in the commit that brings it.

Posing animated voxels on the GPU

Rigged instances (engine: stamping and crowds, renderer: instances) draw a creature from one rest model shared by every copy: each frame only its bone matrices change, and the renderer takes each world cell back through every bone's inverse into the rest model.

  • Gruen et al. animate a coarse tetrahedral cage instead of the geometry inside it, and transform each ray entering a deformed tetrahedron back into the static rest pose, so the dense geometry and its acceleration structure never change and are shared by every animated copy. Voxolith takes that principle: move the samples, not the geometry, and share one rest representation between all instances. (author's version)
  • Kao et al. map rays in deformed space back to a voxelised rest space voxel by voxel, with the deformation approximated as locally linear inside each voxel, to train a neural intersection function that works across poses. Voxolith uses the non-neural half of that idea: sampling the posed shape through a per-part inverse into the rest voxels. (paper)
  • Luton and Tricard encase meshless representations, including 3D textures (voxel grids), in a coarse rigged tetrahedral mesh to animate them; Gruen et al. build on it. It is the origin of the cage idea for voxels, and the reference for smooth (non-rigid) deformation if Voxolith adds it.

What is Voxolith's own: the deformation is rigid per bone, because a generated creature binds each voxel to exactly one bone, so no cage is needed; sampling runs over the renderer's brick index at world voxel centres, exactly reproducing what baking a pose on the CPU writes (checked cell for cell in engine/tools/verify-animation.ts); each creature is one entry in the per-cell instance lists, with a small grid of 32-bit part masks per 8³ brick so a sample tests one or two bones and a ray skips the empty bricks of the creature's box; joints are welded as baking does; and the rig's cover (fur over flesh a pose uncovers) is precomputed into the rest model.

Tight occupancy for instance cells

The sub-cell tables of static instance cells list, per 16³ sub-cell, only the instances that can draw a voxel there, so a ray through a dense wood tests two or three instances a step and skips the bricks none of them reaches.

  • Yoshimura and Harada observe that a bounding box is a loose fit for what it holds, so many rays that hit the box miss everything inside, and cull those rays against a coarse occupancy of sub-volumes within each box. Voxolith took the idea and the analysis: measure how much of the traversal is spent in space that only a loose box claims, and mark tight occupancy instead. On nightwood, marked from turned model brick boxes, 58% of the fine steps were in such space.
  • Their technique itself was tried and not kept. A sub-cell mask per box with a ray-mask table was implemented and measured on nightwood: over the tables below it saved another 2.5 to 8 points at 20, 50 and 100 voxels per metre, for 4, 44 and 245 MiB of masks, and masks on world bricks made the world page 4 to 12% slower.

What is Voxolith's own: the tables are marked from each model's occupied 2³ sub-cells, turned into world space, so a brick is marked and an instance listed only where a world voxel centre can sample one of them; and every listed static cell gets a table, not only crowded ones. With the shader unchanged, that took nightwood's frame down by 29 to 47% depending on the scale.

Temporal accumulation of shadows

Temporal accumulation (RenderQuality.temporal) keeps each pixel's shadows and AO across frames, so a still view stops tracing them and the key light's shadows turn soft.

  • Heitz et al. evaluate direct light analytically without shadows, estimate the shadowed share stochastically, and apply the ratio of the two, so the noisy estimate only carries visibility. Voxolith takes two things from it: accumulating a stochastic, jittered shadow visibility over frames into soft shadows, and, for point lights, keeping the ratio of shadowed to unshadowed light and applying it to the unshadowed light evaluated every frame, so a light that changes colour or brightness keeps its history.

What is Voxolith's own: the estimate is accumulated per pixel across frames rather than denoised within one; history is rejected without motion vectors, by a hash of the voxel face each pixel hit and its distance, reprojected through the previous camera; and what changes the shading of a face a pixel still sees (edits, moving instances, their shadows) is reported as change stamps on 8-voxel columns, swept along each shadowing light, which make those pixels trace afresh. When most of the world changes in one frame, that frame renders without accumulation.

The key light's jitter follows the R2 low-discrepancy sequence from Martin Roberts, The Unreasonable Effectiveness of Quasirandom Sequences (2018, blog post).

Further reading

Papers from AMD's publications that fit the renderer's next steps. Nothing on this list is implemented yet.

Global illumination (lamps and emissive voxels lighting their surroundings, colour bleeding):

  • Guillaume Boissé, Sylvain Meunier, Heloise de Dinechin, Pieterjan Bartels, Alexander Veselov, Kenta Eto, Takahiro Harada. GI-1.0: A Fast and Scalable Two-level Radiance Caching Scheme for Real-time Global Illumination. 2022. PDF, arXiv:2310.19855
  • Guillaume Boissé. World-space Spatiotemporal Reservoir Reuse for Ray-traced Global Illumination. SIGGRAPH Asia 2021 Technical Communications. doi:10.1145/3478512.3488613
  • Kenta Eto, Sylvain Meunier, Takahiro Harada, Guillaume Boissé. Real-Time Rendering of Glossy Reflections Using Ray Tracing and Two-Level Radiance Caching. SIGGRAPH Asia 2023. PDF
  • Sylvain Meunier, Takahiro Harada. Weighted À-Trous Linear Regression (WALR) for Real-Time Diffuse Indirect Lighting Denoising. AMD Technical Report, 2022. PDF

Many lights (hundreds of lights, emissive voxels as lights, lit fog):

  • Yusuke Tokuyoshi. Efficient Visibility Reuse for Real-time ReSTIR. SIGGRAPH 2024 Talks. doi:10.1145/3641233.3664320
  • Yusuke Tokuyoshi. Efficient Spatial Resampling Using the PDF Similarity. Proc. ACM Comput. Graph. Interact. Tech. 6(1), Article 4 (I3D 2023). PDF
  • Yusuke Tokuyoshi, Sho Ikeda, Paritosh Kulkarni, Takahiro Harada. Hierarchical Light Sampling with Accurate Spherical Gaussian Lighting. SIGGRAPH Asia 2024 Conference Papers, Article 82. PDF
  • Yusuke Tokuyoshi. Tiled Reservoir Sampling for Many-Light Rendering. AMD Technical Report, 2021. PDF
  • Shin Fujieda, Yusuke Tokuyoshi, Takahiro Harada. Stochastic Light Culling for Single Scattering in Participating Media. Eurographics 2022 Short Papers. PDF

Voxel traversal:

  • Mehmet Oguz Derin, Takahiro Harada, Yusuke Takeda, Yasuhiro Iba. Sparse Volume Rendering using Hardware Ray Tracing and Block Walking. SIGGRAPH Asia 2021. PDF

Know of work Voxolith builds on that is missing here? Open an issue or a pull request against voxolith.github.io.

On this page