Vxpg
Real-Time Path Guiding Using Bounding Voxel Sampling
Install / Use
/learn @SuikaSibyl/VxpgREADME
vxpg
code for SIGGRAPH 2024 paper "Real-Time Path Guiding Using Bounding Voxel Sampling".
project page: https://suikasibyl.github.io/vxpg

Noteice: The current codebase is a bit messy,
and there could be problems to build the project.
Please contact me through hal128@ucsd.edu for any questions.
I'll probably upload a clean and more easy to build version latter.
Our implementation bases on my toy renderer SIByL2023, and <u>the code is already in the 👈 repo</u>.
Here is a walkthrough of relevant files and codes:
Render Graphs
The render pipelines in SIByL are defined and scheduled with Render Dependency Graph (RDG).
For simplicity, I serialize the pipeline and show them below.
In the paper, we present 3 variants of vxpg pipeline:
1. vanilla vxpg [cpp]
| High-Level Pipeline | Actual Pass | Description | Code | |------|-------|-------|----| | Render VBuffer | RayTraceVBuffer | render and hold V-Buffer for further reuse of 1st shading points | [cpp][slang] | | Geometry Injection | PrebakeDummyPass | load prebake geometry information from external resources | [cpp]| | | VXGuiderClearPass | clear relevant resources for geometry & light injection | [cpp][slang] | | | VXGuiderGeometryDynamicPass | dynamic objects geometry injection | [cpp][slang] | Light Injection | VXGuider1stBounceInjection | draw 1st path sample, inject the irradiance to voxels | [cpp][slang]| | | VXGuiderCompactPass | compact all populated voxels for faster manupulation later | [cpp][slang]| | Superpixel Clustering | InitClusterCenterPass | set 64x64 pixel tile center as cluster center | [cpp][slang] | | | FindCenterAssociationPass | use gSLICr to find nearst pixel cluster in local 3x3 field | [cpp][slang]| | Supervoxel Clustering | VXInfoClearPass | clear data relevant to voxel clustering | [cpp][slang]| | | RowColumnPresamplePass | randomly select 1 pixel per superpixel & 1 vertex per populated voxel | [cpp][slang]| | | RowVisibilityPass | for each voxel, use the selected vertex to evaluate the mutual visibility with every representative pixels proposed in 👆 pass; then pack the visiblity as a unsigned int bitfield | [cpp][slang]| | | RowKmppCenterPass | use kmpp to initialize voxel cluster center by visibility bitfield | [cpp][slang]| | | RowFindCenterPass | find the nearest voxel cluster, which has most similar visibility bitfield | [cpp][slang] | | Supervoxel Merging (optional) | VXTreeEncodePass | encode the voxels with cluster and position information | [cpp][slang] | | | BitonicSort Subgraph | sort the voxels as tree leaves for parallel tree building | [cpp][slang] | | | VXTreeIIntializePass | initialize tree leaves and nodes for parallel tree building | [cpp][slang] | | | VXTreeInternalPass | and this is parallel binary tree building | [cpp][slang] | | | VXTreeMergePass | merge voxel nodes along the binary tree to get cluster information (bounding box, irradiance sum)| [cpp][slang] | | LightSlice Building | VXInfoRearrangePass | rearange voxel information for further visibility check | [cpp][slang] | | | SPixelClearPass | clear the data structure relavent to superpixel samples | [cpp][slang] | | | SPixelGatherPass | each superpixel draw some sample pixels from its domain | [[cpp](https://github.com/SuikaSibyl/SIByLEngine2023/blob/8c1adad28c16e07592bc79122cb9d0c9738699bc/Engine/Source/Addon/VXGuid
Security Score
Audited on Dec 14, 2025
