Branch
Hash :
1d83d492
Author :
Thomas de Grivel
Date :
2024-05-14T18:06:16
Git HTTP | https://git.kmx.io/thodg/smallpt.git |
---|---|
Git SSH | git@git.kmx.io:thodg/smallpt.git |
Public access ? | public |
Description |
Small path tracer in C++ with OpenMP parallelization. Forked from http://www.kevinbeason.com/smallpt/ |
Users |
|
Tags |
|
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