blob: 519263724b183d3e27840f216a1a0ef47c83666b [file] [log] [blame]
TITLE
smallpt: Global Illumination in 99 lines of C++
CREDITS
Author: Kevin Beason (kevin.beason [at] gmail.com)
Date: 10/11/2008
SUMMARY
smallpt is a small Monte Carlo path tracer, and generates a single image of a
modified Cornell box rendered with full global illumination (GI). It does this
by solving the rendering equation, including ideal Lambertian, specular, and
dielectric reflection, area lights, anti-aliasing, importance sampling, and
multi-threading. It is only 99 lines of C++, but illustrates photo realistic
rendering in a correct, and concise manner.
DESCRIPTION
The source code for a small program that path traces a simple Cornell box and
produces accurate results in a terse implementation is given, which provides an
educational example to new graphics students (and seasoned alike), and yields a
ground truth image, all in an easy to read package. Never before has a correct,
complete, and functioning path tracer been presented so succinctly. Readers
will see ray-sphere intersection, Monte Carlo path tracing, Russian roulette,
importance sampling, anti-aliasing, and OpenMP multi-threading in a concrete
working example, which may be read from beginning to end in a single
sitting. The program compiles with GCC 4.2 down to a 16k executable and
produces a 1024x768 resolution image using 5000 paths in 2 hours on an Intel
Core 2 Quad machine. With slight modifications (smallpt4k.cpp) the code compiles to
under 4KB.
FEATURES
* Global illumination
* Unbiased Monte Carlo path tracing
* Cornell box scene description
* Ray-sphere intersection
* Soft shadows from diffuse luminaire
* Specular, Diffuse, and Glass BRDFs
* Cosine importance sampling of the hemisphere for diffuse reflection
* Russian roulette for path termination
* Russian roulette for selecting reflection or refraction for glass BRDF
* Antialiasing via super-sampling with importance-sampled tent distribution,
and 2x2 subpixels
* Automatic multi-threading using OpenMP
* Less than 100 lines of 72-column code
* With provided code changes, can compile to 4K binary
BUILDING
There are two versions of smallpt. The basic version is called "smallpt"
(smallpt.cpp), and is 99 lines. A second version, "smallpt4k" (smallpt4k.cpp),
is 102 lines but compiles to 4K instead of 16KB. It is just a
proof-of-concept. They compute slightly different images due to compiler optimization differences.
The 4 KB version takes 30% longer.
1) Modify top of Makefile to select the correct compiler.
2) "make smallpt" (This builds both the regular version)
3) "make smallpt4k" (This builds the 4K version. Requires sstrip, see Makefile.)
USAGE
The program takes one argument, the number of samples per pixel. This value
must be greater than 4 to accommodate the 2x2 subpixel grid. For example,
the included reference image was generated with:
time ./smallpt 5000
This took 124 minutes (2 hours) on a Intel Core 2 Quad Q6600 2.4GHz machine
running Kubuntu Linux (32-bit Gutsy).
The tiny version takes no arguments (5000 samples/pixel is hard coded):
time ./smallpt4k
Compilation requires gzip and ELFkicker's sstrip command. See the Makefile for
details. It executes in slightly longer time, and yields a slightly different
image due to compiler optimizations differences.
The time command tells you how long the render takes and is optional. You can
view the image with most any image viewer. For example, if you have ImageMagick
installed:
display image.ppm
MORE INFO
MINILIGHT - a minimal global illumination renderer, by Harrison Ainsworth
A similar, earlier project. More general but also larger (100x). The site has
some good information on Monte Carlo path tracing. Instead of repeating it
here, the reader is referred to that site:
http://www.hxa7241.org/minilight/minilight.html
Realistic Ray Tracing by Peter Shirley
Almost 100% of smallpt is derived from this book.
http://www.amazon.com/Realistic-Ray-Tracing-Peter-Shirley/dp/1568811101
Henrik Wann Jensen's Cornell box images
The inpiration of the output generated by smallpt.
http://graphics.ucsd.edu/~henrik/images/cbox.html
100 lines C++ sphereflake raytracer, by Thierry Berger-Perrin
Ray sphere intersection code stolen from here. (No full GI.)
http://ompf.org/ray/sphereflake/
sf4k, also by Thierry Berger-Perrin
Idea for 4K-ness. (No full GI.)
http://ompf.org/stuff/sf4k/
C++ vs OCaml: Ray tracer comparison, by Jon D. Harrop
105 line C++ ray tracer. (No full GI.)
http://www.ffconsultancy.com/languages/ray_tracer/comparison.html
Introduction to Linux as 4 KB Platform
Some information regarding shrinking binaries to 4KB on Linux .
http://in4k.untergrund.net/index.php?title=Linux