Rust를 통한 RayTracing 병렬화

10831 단어 Rusttech
Rust로 하는 것RayTracing은 느리기 때문에 병행화하고 싶어요.
우선 병행화그림만 출력하는 프로그램를 시도했다.
배울 점은 라이온과 itertools를 사용할 때 파라다이스심지어 곤두박질도 할 수 있다.
나는 전선을 올려놓았다.
use itertools::iproduct;
use rayon::prelude::*;
use rayon::iter::ParallelBridge;

#[derive(Copy, Clone)]
pub struct Vec3<T: Copy> {
    pub x: T,
    pub y: T,
    pub z: T
}

fn pixel_color(r: f64, g: f64, b: f64) -> Vec3<u32>
{
    const scale: f64 = 255.99;
    return Vec3 {x: (scale * r) as u32, y: (scale * g) as u32, z:(scale * b) as u32}
}

fn main() {
    const w: u32 = 256;
    const h: u32 = 256;

    let mut image: Vec<(u32, u32, Vec3<u32>)> = iproduct!(0..w, 0..h).par_bridge().map(|(i, j)| {
        let r = i as f64/(w - 1) as f64;
        let g = j as f64/(h - 1) as f64;
        let b = 0.25f64;

        (i, h - j, pixel_color(r, g, b))
    }).collect();

    image.sort_by(|a, b| a.0.cmp(&b.0));
    image.sort_by(|a, b| a.1.cmp(&b.1));

    println!("P3\n {} {} \n255", w, h);

    for (i, j, p) in image {
        println!("{} {} {}", p.x, p.y, p.z);
    }
}

좋은 웹페이지 즐겨찾기