ScalaRay - Ray tracer based on pbrt (see written in Scala 2.8
Scala Shell
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



This is ScalaRay, a ray tracer written in Scala 2.8. It is based on pbrt, the ray tracer described in the book Physically Based Rendering - From Theory to Implementation by Matt Pharr and Greg Humphreys, publisher: Morgan Kaufmann, ISBN: 0-12-553180-X; second edition ISBN: 978-0-12-375079-2

Note: The second edition of this book came out in July 2010. I initially based ScalaRay on the first edition, but I now also have the second edition and parts of ScalaRay are based on pbrt version 2.

pbrt is also available on github; see mmp/pbrt-v1 for pbrt version 1 (first edition of the book) and mmp/pbrt-v2 for pbrt version 2 (second edition of the book).


I wrote ScalaRay because I wanted to learn the Scala programming language by doing a larger project. Note that ScalaRay is not intended to be production-quality software; it is an educational hobby project, it is not complete and not optimized for speed.

I've been interested in 3D computer graphics for a long time. I wrote my first ray tracing program in C on the Commodore Amiga, inspired by a German book (Amiga 3D-Grafik und Animation, by Axel Plenge, ISBN 3-89090-526-9). That was in 1988. I remember writing a ray tracer in Turbo Pascal a few years later on my first MS-DOS PC.


To compile and run ScalaRay, you need:

After installing the JDK and Maven and adding their bin directories to your PATH, you can compile it with: mvn package

If you have compiled ScalaRay successfully, run it with: scala -cp target\classes org.jesperdj.scalaray.Main


ScalaRay is not as complete as the original pbrt. Here is a list of things that need to be fixed, enhanced or implemented, in no particular order.

  • make it possible to sample area light sources with stratified sampling; not only with Latin hypercube sampling
  • is it worth it to have a mutable variant of class Spectrum? (call it SpectrumBuffer, for example; add implicit conversion SpectrumBuffer -> Spectrum)
  • implement accelerators (bounding volume hierarchy, kd-tree, grid)
  • implement triangle mesh, loop subdivision surface, height field
  • implement Sphere.sampleSurface
  • implement reflection models, materials, texture (see book chapters 9, 10, 11)
  • complete DirectLightingSurfaceIntegrator (reflection and refraction)
  • implement other samplers (see book chapter 7)
  • implement other light sources: texture projection light (13.2.2) goniometric diagram light (13.2.3), infinite area light (13.5)
  • implement output to EXR format (high dynamic range)
  • tone mapping (see book chapter 8, only in first edition)
  • implement other surface integrators
  • implement volume integrators
  • implement other cameras (see book chapter 6)
  • create unit tests (with ScalaTest)
  • profile, optimize speed (at the moment I haven't found a profiler which works well with Scala)
  • better concurrency
  • statistics
  • DSL for scene definition (use Scala's parser stuff)
  • add features that are not in pbrt (iso-surfaces ("blobs"), for example)
  • pbrt has no shadow ray caching; investigate if this is worth implementing
  • subsurface scattering