Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - jamdotjar/rtwlib: An implementation of ray tracing in one weekend in rust · GitHub
Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jamdotjar/rtwlib: An implementation of ray tracing in one weekend in rust · GitHub
Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jamdotjar/rtwlib: An implementation of ray tracing in one weekend in rust · GitHub
Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - jamdotjar/rtwlib: An implementation of ray tracing in one weekend in rust · GitHub
Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - jamdotjar/rtwlib: An implementation of ray tracing in one weekend in rust · GitHub
Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - jamdotjar/rtwlib: An implementation of ray tracing in one weekend in rust · GitHub
Skip to content

Latest commit

History

68 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rtwlib

Crates.ioCrates.ioLicenseCrates.io Sizedocs.rs

This is a simple and raytracing library, designed for simple use and modification, based on the books"raytracting 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.

This is a library, so it can be used in other projects. If you want to just mess around with the raytracer, you can use the main.rs file, which has some basic examples. If you dont want to mess with the source code, my project, rtw.tui lets you create and render scenes with a simple terminal interface.

This is mainly to learn about raytracing and rust Structs, Impl and Traits, my goal is to try and implement as much of the required functionality by hand. Right now, this is mainly just the Vec3 class and associated functions, But I plan to add a homemade random number generator, and a PNG encoder.

Features:

Usage:

To use this library, add the following to your Cargo.toml file:

[dependencies]
rtwlib = "0.1.2"

To render a scene, you need 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<u8> containing the RGB values of the pixels.

use rtwlib::{camera::Camera, hittable::HittableList};fnmain(){letmut world = HittableList{objects:Vec::new(),};letmut cam = Camera::new();let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes}

This 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 provides a Sphere object, but you can create your own objects by implementing the Hittable trait. Objects also need an associated material to inform how light bounces should be calculated, which can be any object that implements the Material trait.

fnmain(){letmut world = HittableList::new();let material = Rc::new(Lambertian::new(Color::new(0.3,0.86,0.1)));// Create a new material with a vaguely green colorlet 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// ...}

Full example

use rtwlib::camera::*;use rtwlib::color::Color;use rtwlib::hittable::*;use rtwlib::material::*;use rtwlib::sphere::*;use rtwlib::vec3::*;use std::rc::Rc;fnmain(){letmut world = HittableList::new();let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.5)));let mat_right = Rc::new(Metal::new(Color::new(0.8,0.6,0.2),0.0));
world.add(Sphere::new(Point3::new(0.0,0.0, -1.0),0.5, mat_center));
world.add(Sphere::new(Point3::new(1.0,0.0, -1.0),0.5, mat_right));letmut cam = Camera::new();
cam.image_width = 400;
cam.image_height = 225;
cam.samples = 100;
cam.bounces = 50;let image_bytes = cam.render_to_bytes(world, |progress| println!("Progress: {}%", progress));// Do something with the bytes, e.g., save to a file}

for further examples, see the examplesdirectory.

Tips and tricks

If you want to save to a file, you easily render to a ppm like so:

let buffer = cam.render_to_bytes(world, |progress| update_progress(progress, lines));println!("\n\rDone!");println!("Writing to {}...", args[1].to_string());letmut file = File::create("output.ppm")?;
file.write(format!("P6\n{} {}\n255\n", cam.image_width, cam.get_height()).as_bytes())?;
file.write_all(&buffer)?;Ok(())

You can kind of fake emmissive materials by setting the color values of a material to be greater than 1.0, or mulyiplying the base color by some large-ish number.

let mat_center = Rc::new(Lambertian::new(Color::new(0.1,0.2,0.8)*2));

Gallery

dof2diffuseimagefinal33rainbow

Future plans:

My general goal is to similtanouisly develop this, and the tui, to "test" the library. Some feature I want to add are:

  • More materials
  • More shapes
  • Multithreading
  • More object types
  • BVH optimization
  • PNG handling export support. You can also probably assume most of the second book will be implemented at some point.

About

An implementation of ray tracing in one weekend in rust

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages