Pablo Delgado

Pablo Delgado

@pablode.bsky.social

Rendering @ Chaos. Personal projects: github.com/pablode

78 followers49 following29 posts

Implemented some basic 'primvar analysis' in Gatling. The idea is to detect patterns in secondary primvars (not part of vertex layout) and modify data & interpolation. For now, just checking for constant values, which is surprisingly effective for some assets.

In the future, I may try some ideas to reduce the memory footprint even more: - do the same for 'uniform' interpolation - encode floats in [0/-1,1] as 16-bit UNorm/Snorm - hash primvars, store and refcount the GPU buffers in a global registry

This weekend I added support for the MaterialX <time> and <frame> nodes to Gatling. Procedural materials can now be animated over time, such as this clock authored by Roberto Ziche:

Finally finished Gatling's Metal backend! Here's a teaser of NVIDIA's USD / MDL sample scene 'Attic' running on macOS. What's special about the backend is probably that it uses the same GLSL code as the Vulkan backend, complete with hardware ray tracing. How does that work?

View full thread

As these functions don't have access to intrinsics, we need to pass them along as part of their signature. Which the function tables are parameterized with. Here's an example of how the ray generation shader signature ends up looking with two ray payloads:

In general, it was nice getting to know Metal a bit - and I can't wait writing some user land code on my MacBook Air! Btw: Vulkan backend is ~3,8k LOC and Metal ~2,2k LOC.

Finally finished Gatling's Metal backend! Here's a teaser of NVIDIA's USD / MDL sample scene 'Attic' running on macOS. What's special about the backend is probably that it uses the same GLSL code as the Vulkan backend, complete with hardware ray tracing. How does that work?

View full thread

An important difference between the graphics APIs is that Metal only has 'intersection' shaders that are invoked for non-opaque geometry. This is what I map any-hit shaders to. Their function addresses are stored in an intersection function table (IFT), similar to an SBT.

Closest-hit shaders and miss shaders need to be emulated. They are compiled with their entry points being "visible" and are invoked from visible function tables (VFTs) based on the traversal result. For each payload type we have 1x IFT and 2x VFTs.

Finally finished Gatling's Metal backend! Here's a teaser of NVIDIA's USD / MDL sample scene 'Attic' running on macOS. What's special about the backend is probably that it uses the same GLSL code as the Vulkan backend, complete with hardware ray tracing. How does that work?

On the API side I use metal-cpp and for shaders I partially implement the GLSL_EXT_ray_tracing extension in SPIRV-Cross. It's a bit hacky and it only supports the features I need, but overall content agnostic. Ideally it's transitionary until Slang or KosmicKrisp's compiler can be used.

Pablo Delgado reposted

This scene from WireWheelsClub looks like this out of the box - no editing was required. Performance is not a priority right now, but is good enough with this simple lighting on an RTX 2060 @ WQHD

Btw, a few weeks ago I released a small plugin for usdview. It allows inspection of UsdShade networks using a custom Qt node graph. It’s open source, lightweight and simple to install.

Pablo Delgado reposted

We just posted a recording of the presentation I gave at DigiPro last year on Hyperion's many-lights sampling system. It's on the long side (30 min) but hopefully interesting if you like light transport! Check it out on Disney Animation's website: www.disneyanimation.com/publications...

disneyanimation.comWalt Disney Animation Studios - PublicationsWe engage with the global research community through collaborations with universities around the world, publications in academic journals and participation in top-tier conferences.

Implemented USD point instancer primvar support in my toy renderer the last few days. Can now render this 2D Gaussian Splatting (2DGS) scene with a single mesh & MaterialX material. (Created by Oliver Markowski with Houdini, link see below ⬇️)

Pablo Delgado reposted

Made good progress with gatling lately, and one of the new features is graphical tests. They primarily run on GitHub Actions using Mesa lavapipe (supports ray tracing). Thresholds are specified as USD render settings, diff images are uploaded as artifacts (1/4)

View full thread

To reduce the memory footprint, I first run the geometry through meshoptimizer which culls and deduplicates vertices. Next, the data is compressed with blosc. The results are quite good. Decompression only happens when a BLAS is rebuilt. (3/4)

Made good progress with gatling lately, and one of the new features is graphical tests. They primarily run on GitHub Actions using Mesa lavapipe (supports ray tracing). Thresholds are specified as USD render settings, diff images are uploaded as artifacts (1/4)

Furthermore implemented #MaterialX geompropvalues (MDL scene data), and GeomSubsets. This required quite some code rewriting, as I now store a copy of the CPU geometry data in the renderer itself. Here’s a render of stehrani3d’s MaterialEggs which make use of these features (2/4)

You are up to date.