Expand description
§rtwlib
This is a simple and raytracing library, designed for simple use and modification, based on the books“Ray Tracing in One Weekend“ and “Ray Tracing: the next week” by Peter Shirley. This isn’t optimized for performance, so I would heavily reccomend only using it in situations where computation time isn’t a concern.
§Get started
To render a scene, you need two things: a Camera and a scene, in the form of a HittableList.
The following code creates a scene and camera, and renders the scene to a Vec
use rtwlib::{camera::Camera, hittable::HittableList};
fn main() {
let mut world = HittableList {
objects: Vec::new(),
};
let mut cam = Camera::new();
let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));
// Do something with the bytes
}aThis is the bare minimum needed to render a scene, and will result in a sky background, as no objects have been added to the scene.
§Adding objects to the scene
Any object that implements the Hittable trait can be added to the scene, the base crate only provides a Sphere object that can be used, but you can create your own objects by implementing the Hittable trait for your own objects.
Objects also need to have an associated material, to inform how light bounces should be calculated which can be any object that implements the Material trait, this can be
fn main() {
let mut world = HittableList::new();
let material = Rc::new(Lambertian::new(Color::new(0.3, 0.86, 0.1))); //create a new material with a vaugely green color
let sphere = Sphere::new(Point3::new(0., 0., -1.), 0.5, material); //create a new sphere at 0, 0, -1 with a radius of 0.5, using the material we just created
world.add(sphere); //add the sphere to the world
...
//Modules§
- camera
- This crate contains the
Camerastruct, and associated functions. The functions are here to provide a simple way to render a scene, but feel free to implement your own methods on theCamerastruct to render to different outputs. - color
- This module contans all functions and structs related to colors and color manipulation.
This includes the
Colorstruct, an alias forVec3, and functions to convert colors to different formats, as well as color manipulation functions such as gamma correction. - hittable
Hittableis a trait that is used to define objects that can be hit by rays, andHittableListrepresents a list ofHittableobjects, or a scene. This module contains the hittable trait, and the hittable list struct, which is a collection of hittable objects. Any hittable object must implement theHittabletrait, which requires thehitfunction to be implemented, which determines if a ray hits the object. TheHittableListstruct is a collection of hittable objects, and implements theHittabletrait itself, allowing for nested collections of objects ( I dont see why you would need that ).- material
materialsis a collection of types that implement theMaterialtrait. materials are associated with objects, and determine how it interacts with light Every material has ascatterfunction, which takes an input ray and a hit record, and returns a boolean indicating if the ray was scattered, and modifies the input variables to reflect the scattered ray, colors, and other properties. The available materials are:- ray
- This module contains the
Raystruct, which represents a ray in 3D space. - utils
- A collection of miscelanious ( unused ) utility functions, might come in handy later.
- vec3
Vec3is a simple 3D vector struct, with x, y, and z components, and a bunch of utility functions. All of the vector math used in the raytracer is implemented here. Vec3 has a few aliases, such asPoint3, which is used to represent a point in 3D space, andColor, which is used to represent a color, and these are exchangable. ( althoug I would reccomend usingColorfor colors, andPoint3for discrete positions )
Macros§
- vec3
- A macro for creating a new Vec3 with the given x, y, and z components.