Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/raybellis/rrt
Ray's Ray Tracer
https://github.com/raybellis/rrt
Last synced: 3 days ago
JSON representation
Ray's Ray Tracer
- Host: GitHub
- URL: https://github.com/raybellis/rrt
- Owner: raybellis
- License: gpl-3.0
- Created: 2015-02-03T07:41:03.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2017-04-17T13:09:30.000Z (over 7 years ago)
- Last Synced: 2024-12-06T21:42:26.825Z (20 days ago)
- Language: C++
- Homepage: http://raybellis.github.io/RRT
- Size: 1.35 MB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# RRT - Ray's Ray Tracer
RRT is a _stochastic_, _multithreaded_ ray tracer written in C++ that relies on casting a very high number of samples per pixel into the scene and then scatters diffuse rays in every direction.
The method is far from efficient and producing a noise-free image may take thousands of samples per pixel (and hours of CPU time) but it produces effects "for free" that many other ray tracers can only approximate, including:
- diffuse inter-reflection (colour bleeding)
- area lighting and soft shadow
- glossy surfaces
- depth-of-field
- causticsThe current implementation supports a limited number of 3D primitives:
- spheres (of course!)
- cubes
- infinite planes
- triangle
- triangle meshes (via Open Asset Import Library)
- compound (parent node for collections of the above)Arbitrary homogenous transformations are supported to move and deform primitives, but as yet these transformations cannot be nested. That is to say, a compound node cannot yet have a transformation that applies to all child nodes within it.
There is no scene description language - the user has to write a C++ program that makes call to the RRT APIs that create nodes, attach shaders to nodes, etc. See the example programs in `scenes/` for more details.
The most powerful shader is `Shader::stochastic` that can take a `surface` object that is similar to those used in other ray tracers and will automatically cast a single diffuse ray, a specular reflected ray and a tranmitted ray, depending on the surface's properties.
For a surface that has purely diffuse lighting properties the `Shader::diffuse` shader can be used instead and is slightly more efficient than `Shader::stochastic` because it doesn't have to consider the surface properties to decide whether to cast any non-diffuse rays.
There are no "lights" in RRT. Any object can have a `Shader::constant` shader attached to it that makes that object a fixed colour and indirectly causes it to "illuminate" any object that casts a ray in its direction.
## Compiling
RRT requires a C++11 compatible compiler, Boost, Open Asset Import Library, GD, libpng, libjpeg and libz. The supplied Makefile is for Mac OS X with macports.
## Running
Two samples scenes are included so far, "snooker" and "cornell".
The demo programs will either start a new render, or if passed a `.rrt` file as parameter will use that as the starting render buffer state. Every eight samples the current render buffer is rewritten to the `.rrt` file, as well as a 48-bpp PPM file. The `netpbm` package can be used to convert PPM files into PNG or JPEG, or many other formats.
## TODO
- More primitives
- Bounding volume / Spatial acceleration techniques
- Compound transformations
- Time-based transformations (motion blur!)
- ~~Ensure partial frames can't end up in the `.rrt` files~~