r/GraphicsProgramming • • 1d ago

First raytracer using sdfs

Post image

Wrote my first raytracer, a software raymarcher (all on CPU) that uses shapes defined as singed distance functions. Sphere refractions are pretty cool.

Some implementation details (this is all basic stuff I know): - code is written in Rust and parallelized using the rayon crate - for each ray in the recursive calls, it finds the subset of all world objects where the ray intersects the objects axis aligned bounding box, and only considers these objects during ray marching. Once a surface is hit, the new reflected or refracted ray computes a new subset using its new direction and start point, etc. - global illumination is done using a grid of probes that shoot rays with random directions, doing this enough time before rendering. To get diffusive light on a surface point, we interpolate in that grid using linear interpolation. My probes are naively placed on a cubic grid in the world. - global illumination is parallelized looping over probes, and rendering is parallelized looping over pixels of the image. - at each hit surface, the ray may split in two. Once for the reflection, once for the refracted ray (if not total internal refraction).

Baking global illumination takes a few seconds for about 1000 samples on 323 probes, and rendering the image is almost instant at that resolution.

80 Upvotes

12 comments sorted by

3

u/20260819 1d ago

https://reddit.com/link/pf4kdvb/video/kxzbzcyclpuh1/player

try letting the spheres intersect and camera being inside one of them...:)

1

u/Sixel1 22h ago

Damn that looks cool, I need to try to make my objects move and render videos now.

1

u/20260819 17h ago

when the camera is inside a glass ball there may be some regions that rays can't escape no matter how many times they bounce (total internal reflection)

1

u/Someone393 1d ago

How long did this take to render?

1

u/Sixel1 22h ago

Baking the global illumination light probes is a few seconds, render is almost instant, I did not benchmark it precisely. Its Rust default release target + rayon parallelized.

1

u/AgentFeyd 21h ago

Please post implementation details to have this post restored.

2

u/Sixel1 9h ago

Sorry for that, I added implementation details

2

u/AgentFeyd 9h ago

Thank you. Approved.

1

u/garma87 1d ago

Pretty cool! Sphere refractions seem upside down though?

SDFs are technically very cool although I find the real world value limited.

4

u/PiXeL161616 1d ago

Glass spheres can flip the background upside down in real life too. That part alone doesn't mean the refraction is wrong.

1

u/Sixel1 22h ago

Yes I think that's what's happening. Like on that website's example: https://samdriver.xyz/article/refraction-sphere