This page is created automatically. Click here to view this shader on Shadertoy.

These shaders are my implementation of the raytracer described in the (excellent) book "Ray tracing in one weekend" and "Ray tracing: the next week"[1] by Peter Shirley (@Peter_shirley). I have tried to follow the code from his book as much as possible, but I had to make some changes to get it running in a fragment shader:

  • There are no classes (and methods) in glsl so I use structs and functions instead. Inheritance is implemented by adding a type variable to the struct and adding ugly if/else statements to the (not so overloaded) functions.
  • The scene description is procedurally implemented in the world_hit function to save memory.
  • The color function is implemented using a loop because it is not possible to have a recursive function call in glsl.
  • Only one sample per pixel per frame is calculated. Samples of all frames are added in Buffer A and averaged in the Image tab.

Besides that, I also made some other design choices. Most notably:

  • In my code ray.direction is always a unit vector so I could clean up the rest of the code by removing some implicit normalizations.
  • Cosine weighted hemisphere sampling is used for the Lambertian material.

You can find the raytracer / pathtracer in Buffer A.

= Ray tracing in one week =

= Ray tracing: the next week =

Source code

You can find (the full source of) RIOW 2.07: Instances on Shadertoy.