动手写光线追踪器

本文内容参考教程 Ray Tracing in One Weekend:教你在两天时间用 C++ 从 0 开始实现一个光线追踪器。因为我对图形学很感兴趣,而又一直没有时间去系统学习,恰巧最近入门 Rust,需要项目练手,所以决定动手用 Rust 实现这个项目,一举两得。

1. 输出图片

简单起见,我们使用 PPM 格式来输出和保存图片,它的格式如下:

可以随便写个程序输出一张这样的图片:

fn main() {
    let image_width = 256;
    let image_height = 256;

    // Render
    println!("P3\n{} {}\n255", image_width, image_height);

    for j in (0..image_height).rev() {
        for i in 0..image_width {
            let r = (i as f64) / ((image_width - 1) as f64);
            let g = (j as f64) / ((image_height - 1) as f64);
            let b = 0.25;

            let ir = (255.999 * r) as i32;
            let ig = (255.999 * g) as i32;
            let ib = (255.999 * b) as i32;

            println!("{} {} {}", ir, ig, ib);
        }
    }
}

这个程序生成图片的像素 R 值和 G 值从左往右,从上往下依次增大,将其输出保存到 image.ppm 中,然后用网站 WebPPM — PPM viewer 查看,效果如图: