Ipotrick

Ipotrick

@ipotrick.bsky.social

128 followers28 following63 posts

Specular RTGI! Extended my RTGI to support specular as well as diffuse. Spec and Diff rays are shot from a shared fixed ray pool, the rays are dynamically distributed across the screen based on demand. Perf impact over diffuse-only is around 25%. Am very happy with the result.

Pioneer Pretraced rayguiding! * Shoot low res rays * Spatially spread bright ray hits * Use bright rays to guide real traced rays Drastically improved directional GI quality, low cost, around 0.2-0.3ms extra Inspired by Restir, but this has 0 additional temporal lag!

Bsky tends to remove noise from videos but i think its still visible here. A comparison of the temporal accumulation only (spatial passes disabled here for visualization purpose). Ray Redistribution On vs Off. Same performance, much better resolve with redistribution.

Adaptive ray rate per pixel! A series of compute passes distribute a fixed budget of rays over the pixels on the screen, a fixed trace dispatch goes over the final ray list and traces them. Improves disocclusions drastically. Allows way fewer (i'm using 2x fewer) rays per pixel at BETTER quality.

In these images i move from right to left, showing only the temporal accumulation with spatial passes disabled. Shows how even half the rays resolve a better quality image in disocclusions compared to fixed ray rate per pixel.

NEW: Surface Detail Guiding! Analyzing surface detail (using albedo and normals, showin in the heatmap) to inform the spatial denoise passes. Flat color -> wide softer blur. Detailed surface -> smaller blur allowing sharp lighting.

Ipotrick reposted

New blog post! In "Quantizing tangent frames", we look at various established methods to represent tangent frames in the vertex data, squeeze a few variants into 32 bits per vertex and look at the resulting precision. zeux.io/2026/04/30/q... Share, like and subscribe!

zeux.ioQuantizing tangent framesI’ve been working on tangent space generation recently, and also pondering the tradeoffs between QTangent and normal-angle storage. So when, in a completely unrelated discussion, someone said “you cou...

Ipotrick reposted

Advances in Real-Time Rendering in Games will be returning SIGGRAPH 2026... The course will be on Tuesday of SIGGRAPH, room and other details TBD. Cool talks lined up - stay tuned for more info.

Also, ghosting, streaking, boiling and all the other common artifacts are largely gone, its very rare that such an artifact still presents itself.

Ipotrick@ipotrick.bsky.social

The indirect diffuse denoising now resolves very fast. Evem better since my recent refactor. Here an example of the output in movement before application of albedo (albedo detail can hide potential artifacts). Direct diffuse in the video is a separate system and not denoised, ignore its noise :).

The indirect diffuse denoising now resolves very fast. Evem better since my recent refactor. Here an example of the output in movement before application of albedo (albedo detail can hide potential artifacts). Direct diffuse in the video is a separate system and not denoised, ignore its noise :).

Testing in many different settings is very important for graphics techniques. What works in one setting will fall apart horribly in another. Usually its best to have actual game data to work with. At home i use a lot of dumb test scenes. Very happy to say the GI now works well in all of them 🥳

Mooore denoising tricks 😃!! I tested variance as well as ray-length guided spatial filtering. Variance guided filtering is good at preserving lighting silhouettes, while ray-length guiding adds a lot of contact hardening sharpness! 1. no guiding 2. variance guiding 3. ray-length guiding

More images of the improved denoiser. This showcases how much smarter the prefilter is now. Its able to keep much more lighting energy at better temporal stability. This is a better comparison than in my last post.

I found a few tricks to make the denoiser able to handle a much sparser signal while also increasing temporal stability. With these tricks applied, indirect lighting now looks much better in dark areas. Bright small areas can not illuminate distant pixels much more accurately. Before vs After:

I found a bunch of new tricks for denoising. Using them, i re-architected the whole denoising pipeline. Old: prefilter -> stochastic blur -> upscale -> temporal New: prefilter -> stochastic blur -> temporal -> smooth blur -> upscale. Perf and quality are much better with the new architecture.

I think most raytracing effects and denoisers don't really think about needs of fast games like shooters. For my RTGI denoiser, i put in a lot of care to get an immediately readable and stable image from the first frame after dis-occlusion. its very satisfying.

My RTGI denoiser had temporal stability issues on thin geometry. While tinkering, i found two tricks to improve this significantly: 1. Based on a per pixel "thin-ness" factor, a crude blur is applied. 2. A geometric mean based firefly filter does the rest. Works much better than i expected.

The firefly filter is very aggressive. It makes the image much too dark. But its temporal stability improvements are massive. It is worth the tradeoff for me.

My RTGI denoiser had temporal stability issues on thin geometry. While tinkering, i found two tricks to improve this significantly: 1. Based on a per pixel "thin-ness" factor, a crude blur is applied. 2. A geometric mean based firefly filter does the rest. Works much better than i expected.

Crude blur here is a mip map blur similar to the mip map based "history reconstruction" blur of Nvidia ReBlur. The thin-ness factor is calculated with the firefly filter. It estimates how many valid spatial blur samples each pixel probably gets by doing plane distance tests of surrounding pixels.

I would like to showcase the denoisers improvements in movement but videos really just remove all noise so i cant really show the difference :/

Ipotrick@ipotrick.bsky.social

More denoiser before and after screenshots :)

I believe this is not done by others because it requires quite a high probe resolution to work properly without loosing too much quality. Luckily, last year i developed a self adapting sparse raytraced probe volume that can reach densities high enough to capture the world in enough detail :).

Ipotrick@ipotrick.bsky.social

With my rtgi i am also doing something, that i believe, is a novel technique that i have not seen done before. While probes are often used in rtgi for indirect diffuse on hit shading, i use them to replace all rtgi hit shading. On each hit i project the closest probes radiance into the hits.

With my rtgi i am also doing something, that i believe, is a novel technique that i have not seen done before. While probes are often used in rtgi for indirect diffuse on hit shading, i use them to replace all rtgi hit shading. On each hit i project the closest probes radiance into the hits.

Unfortunately the image gets denoised by the image compression quite a lot already. It is much worse noise in reality :)

Ipotrick@ipotrick.bsky.social

I have been working on a denoiser for raytraced diffuse global illumination in my hobby engine. I am now quite happy with it. It can create a high quality output with only 0.25 rays per pixel. I am particularly proud of how stable it is in movement and on disocclusions.

I have been working on a denoiser for raytraced diffuse global illumination in my hobby engine. I am now quite happy with it. It can create a high quality output with only 0.25 rays per pixel. I am particularly proud of how stable it is in movement and on disocclusions.

The radiance cache works by storing another layer of texels on the probe. The new texels store the direct radiance coming into their direction, no cos convolve. When shading rtgi ray hits, i sample the radiance of the 8 closest probes by projecting the radiance back onto the hit ws position.

Ipotrick@ipotrick.bsky.social

Experimenting more with hybrid probe and per pixel traced gi. I now use a radiance cache to shade per pixel ray trace hits. It saves a lot of performance and the quality is very close to proper hit shading. Roughly saving ~30-70% of performance for rtgi (local lights make this verrry worthwhile).

It's surprisingly detailed considering the low probe density. It's also practically completely free as its trivial to calculate the radiance in the same shader as the irradiance per texel.

Experimenting more with hybrid probe and per pixel traced gi. I now use a radiance cache to shade per pixel ray trace hits. It saves a lot of performance and the quality is very close to proper hit shading. Roughly saving ~30-70% of performance for rtgi (local lights make this verrry worthwhile).

Started to experiment with raytraced diffuse gi. My probe GI works well but it just can not represent fine details with good performance/memory usage. AO helps it a lot i want even more. Most of the work on RTGI is denoising, very interesting work. Here the current state: Probes only vs RTGI:

Goal is to shoot short traces from pixels (up to maybe 15 meters). On miss the ray would read the probe volume radiance in the rays direction. The shorter raylength improves performance immensly. This hybrid RTGI/probe GI is something that i believe could be very performant and pretty.

Yoo, timberdoodle is in there. Great projects all around :)

Jake S. Del Mastro@jakedelmastro.com

It's finally here! I'm pleased to share GP-Direct 2025, the latest edition of the graphics programming discord showcase! No engine? No problem. We wrote our own! Thank you to all the talented people who participated! youtu.be/e9qK6EtqB-Q?... #indiegamedev #graphicsprogramming

Ipotrick reposted

The tech and graphical advancements in Assassin's Creed Shadows are mighty impressive: Micropolygon geometry, fluid wind simulations, ray traced global illumination and so much more. How do they all work and compare to AC games of the past? Find out in my video below! youtu.be/nhFkw5CqMN0

Ipotrick reposted

While watching all the trailers from the Sony State of Play I could not help but notice that 90% of the games shown are Unreal Engine games... with each new scene/effect/character shown it is hard not to think "that will probably stutter on PC".

Ipotrick reposted

One of the biggest changes and optimizations i made to my DDGI impl is how probe texels are updated. Instead of all texels looping over all rays per probe, each texel only checks out relevant rays. This is a big performance gain with high ray counts (>256) and good depth resolutions of 16x16.

View full thread

this is a color coded debug view showing the debugged depth texel (red) and the weight it assigns to all the trace results (green). As you can see, the weights become 0 nearly immediately. Sampling a texel area of 6x6 for this resolution is more than enough to get all valid traces.

the warping of the octahedral mapping means that this is not an ideal way to sample in all cases as sometimes the texel distances are much shorter than in other areas of the probe. But generally, this does not seem to cause issues.

One of the biggest changes and optimizations i made to my DDGI impl is how probe texels are updated. Instead of all texels looping over all rays per probe, each texel only checks out relevant rays. This is a big performance gain with high ray counts (>256) and good depth resolutions of 16x16.

The trick is to trace rays into a octahedral trace result texture per probe. The texel update threads can then narrow the area of the trace result texture to consider. For visibility updates, a texel area of only 6x6 contains all relevant samples. 6x6 is 7 times less loop iterations compared to 256.

An update rate of 12.5% of probes a frame as well as detecting and only updating probes that are close to a surface gives a gigantic performance uplift >40x. Allows me to easily have DDGI run at under 0.3ms even tho i didnt spend more than 30 minutes optimizing. Next step is virtual probe memory.

The current limitation is that i still allocate space for all probes. Making the memory virtual similar to how VSMs do it might allow me to push the probe count even more.

First experiments, using DDGI probes for specular. Made all of bistro super metallic to show the effect. I think this will work really great for rough indirect specular. It would be great if DDGI probes could replace dedicated reflection probes to some extent.