Max Liani

@maxliani.bsky.social

Tracing rays at NVIDIA. Former lighting artist, working on computer graphics rendering tech for all humans and robots alike. I mostly post stuff about light transport simulation, and my hobby project Workbench.

TinyBVH has just been 𝘂𝗽𝗱𝗮𝘁𝗲𝗱 𝘁𝗼 𝟭.𝟴.𝟬. For CPU ray tracing, it is now the fastest option in most cases - Outperforming Intel Embree and Madmann91 for BVH build time and single-ray performance. On GPU, performance exceeds 4B rays per second - 4 rays per pixel at 4k/120Hz. github.com/jbikker/tiny...

Bild

People who bought SpaceX thinking what they bought is an aerospace company 🤦🏻‍♂️ What they got instead is a tiny share of xAI, and a minuscule one of aerospace sector.

Maybe I see this in rosy retrospection, but I feel that the work I did many years ago to create the Glimpse production renderer still feels to me the most insane project I ever started.

I always had some envy about people who can read books, novels before going to sleep. If I read something I find myself immersed in, goodby sleep, I won’t be able to sleep at all.

About 3.5 years ago I did some experiment to improve the behavior of microfacet normals at glancing angles. Many surfaces become highly reflective even though having high roughness. Check the discussion in the thread. Here is my implementation reusing equations you already have:

Bild
Yining Karl Li@yiningkarlli.bsky.social · 3mo ago

There's a neat short paper from Eurographics this year that evaluates how well microfacet shading models actually predict measured reflectance. The answer is: not nearly as well as one would hope! (1/3) ssteinberg.xyz/2026_surface...

Screenshot of the first page of a computer graphics research paper titled “On the Accuracy of Surface Scattering Theories,” by Matthew Avolio, Eugene D’Eon, and Shlomi Steinberg from the University of Waterloo and Nvidia. The page uses a standard academic layout with a large centered title, author names below, and a wide comparison figure occupying most of the page.

The main figure compares real photographs of reflective metal surfaces with rendered predictions from two surface scattering models. Five vertical panels, labeled 1 through 5, each show checkerboard reflections on glossy metal viewed at grazing angles. Within each panel are image strips labeled “photo,” “GGX,” and “SSA,” allowing direct comparison between measured appearance and rendered results. The surfaces range from blurry and diffuse on the left to sharper and more mirror-like on the right. Above each panel are colored line graphs representing measured surface profile data, and along the right edge are small blue-green 3D visualizations of microscopic surface geometry.
The figure caption explains that the paper compares photographs to GGX microfacet and smooth-surface generalized Harvey-Shack predictions derived from measured surface geometry using AFM and profilometer scans.

Below the figure is the abstract, which states that the paper evaluates how accurately surface scattering theories predict appearance directly from measured geometry instead of fitting reflectance data. The authors conclude that existing models fail at some viewing angles, especially grazing angles, and suggest that the characteristic “GGX look” may result from wave-optical effects on Gaussian surfaces rather than non-Gaussian geometry.

Cut tool. It does more or less what you'd expect from a cut tool. Snap to points and edges, fractional placement, cut across faces, slice. No support for edge loops yet.

I need to revamp my modeling operators, especially those that require user interaction. Here is first attempt at the Add Polygon operator. It's a first pass; it needs some work, but I feel it's not a bad start.

Alright, I made some further improvements to the tree view, which now draws in constant time (in respect to the scene complexity). Here is a test with 16 million transform nodes viewable in the scroll area. Without screen recording, the whole app renders at 8kHz.

I played a bit with the UX of interacting with the tree view. The common operations are selection and re-parent. I want to control both with the same gesture. So, if the drag&drop is mostly vertical -> reparent. If it widens to the side, it becomes marquee selection. Yes, no?

I am not sure why I am doing this, but I optimized further the scene tree view as it was getting a bit slow and clunky to operate when I had many nodes expanded. It's not cheap, it's still the most expensive part of the program to draw.

A long time ago in a galaxy far away (circa 2011) I came up with a distant rect light for my lighting crew. I can't remember how I did it, but I am trying to recreate it. Here is a test for the light sample distribution in the hemispherical domain.

After how many years? I added code for distant area lights. Some call it "directional". The control "scale compensation" is meant to preserve the light power (radiant flux), so as the emissive area increases, the intensity decreases.

I cut down startup time by deferring DLSS initialization. The first second of images rendered are noisy, until DLSS init is complete, at which point I accept a one off 40ms hiccup to allocate buffer resources and begin denoising. I'd say it's decent enough!

DLSS in workbench. The quality of 1spp rendering is way higher compared to the other built-in denoisers, and for half the cost. The comparison changes at higher spps.

I am trying to add DLSS-RR mode to Workbench. In theory I already have most things from the renderer, exception made for the specific pixel jitter and the motion vectors… It shouldn’t be too hard for me to add either of those. I am curios to compare DLSS with the other denoisers

Last weekend I refined the scene tree view in Workbench. I used the drag & drop support in dear imgui to implement DAG reordering and reparenting, plus renaming. Custom behavior and drop region draw to show where the node would be inserted, and display where and why it cannot.

I have just spent 7 hours straight, barely leaving my desk looking at the wrong problem. I thought I was lost in reindexing hell, but the complex data structure I just made works just fine, the problem was in the incomplete input data all along. How is your day?

Finally, I came around at implementing DOF and wiring it to the camera manipulator system. Click and drag to samples the scene to estimate the focus distance, while scroll to modulate the aperture.