Repository navigation
Transforms, Instancing, 8-wide KDOP BLAS
Transforms!
Transforms (location, rotation, scale) are now part of the engine.
Other new features:
- Instancing
- TLAS/BLAS separation
- Wide trees
- KDOP bounding boxes
- Mixed wide/binary trees
- Transformed primitives
- misc performance optimizations
Notes:
In this update, transforms are nodes with one child that manipulate the ray that hits them. Transforms are tracked using a separate stack.
Instancing is a natural byproduct of transforms. Constructors such as loadSplat and loadObj now return pointers to their instances and transforms add an instance of that mesh/splat to the scene graph.
The scene graph then looks like:
root
├── transform
| └──Instance BLAS
└── transform
└──Instance BLAS
The scene graph supports more elaborate structures with nested transforms and BLAS structures with chains that might look like
root
└── transform
└── Group BLAS
├── Instance BLAS
└── transform
└── Instance BLAS
Or any other combination of tree, transform, and primitive nodes
Performance considerations
Performance has been increased considerably from previous versions.
According to NVIDIA Nsight the primary source of warp latency and stalls is Long Scoreboard stalls when retrieving primitive, acceleration structure, and stack nodes from memory.
Gaussian splat primitives are especially taxing on the acceleration structures due to their oblong and overlapping natures. Triangle meshes do not see the same performance impact as Gaussians of the same size due to triangle meshes usually not having large amounts of overlap and triangles are usually uniform in size.
Work is being done to reduce the latency. At the moment, wide KDOP acceleration structures provide 10x performance improvement compared to traditional binary AABBs, reducing the number of traversals (caused by fewer bounding box misses) and increasing ray throughput. The acceleration structure still struggles with large (5+ million primitive) BLAS.
That being said, this release can support moderate numbers of primitives at interactive framerates (30+ fps, 19ms per frame with spikes of 30-40 ms).
