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 the code is already in the 👈 repo.
Here is a walkthrough of relevant files and codes:
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][slang] | |
SPixelVisibilityEXPass | and we compute mutual average visibility and contributions between each pair of superpixel and supervoxel | [cpp][slang] | |
VXTreeTopLevelPass | build the sampling distribution for LightSlice | [cpp][slang] | |
Path Tracing!! | VXGuiderGIPass | do adaptive guided sample, and MIS here | [cpp][slang] |
2. ReSTIR GI + 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] |
Hold GBuffer | VBuffer2GBufferPass | convert VBuffer to GBuffer for ReSTIR usage | [cpp][slang] |
GBufferHolderSource | hold and load the GBuffer from previous frame | [cpp] | |
VXPG | ... | all passes similar to previous section, the only difference is that the guided samples are stored as proposal reservoirs | 👆 |
ReSTIR Reuse | TemporalResampling | temporal reuse | [cpp][slang] |
SpatialResampling | spatial reuse | [cpp][slang] | |
Shading | FinalShading | finally shading the scene with ReSTIR samples | [cpp][slang] |
3. A-SVGF + vxpg [cpp]
High-Level Pipeline | Actual Pass | Description | Code |
---|---|---|---|
VXPG | ... | all passes similar to previous section, the only difference is that the guided samples are stored as proposal reservoirs | 👆 |
A-SVGF | ... | again lots of passes for A-SVGF, just read the code 👉 | [cpp][slang] |