blockの巣

Rustでコンパイル時レイトレーシング4

2022/02/05 01:12 公開
2022/02/05 12:52

背景色が間違っていたのを修正

2022/02/16 01:38

背景のグラデーションの向きの修正とリポジトリへのリンクを修正

Compile Time Ray Tracing in Rust Ray Tracing Rust

前回記事
リポジトリ記事の内容はコミットID5a83e208d92fdecd8ffa71ce33d02ef561d1057fのものです。

今回はレイを飛ばして球にヒットした箇所を赤色でレンダリングするところまでです。
今回は新しいfeatureの追加はありません。

レンダリング結果
レンダリング結果

レイと球の交差判定の実装の意味については参考元を確認してください。

今回の変更点

hit_sphere

hit_sphereの内容は以下の通りです。const fnにするだけで通常の関数と変わりなく書けています。

const fn hit_sphere(center: &Point3, radius: f64, r: &Ray) -> bool {
let oc = r.origin() - center.clone();
let a = dot(&r.direction(), &r.direction());
let b = 2.0 * dot(&oc, &r.direction());
let c = dot(&oc, &oc) - radius * radius;
let discriminant = b * b - 4.0 * a * c;
discriminant > 0.0
}

ray_color

座標(0.0, 0.0, 1.0)の半径0.5の球にレイがヒットするかを確認し、ヒットしていた場合は赤色を返しそれ以外の場合は背景色を返します。
前回からの変更点はhit_sphere呼び出しとreturnの箇所が増えたくらいです。

const fn ray_color(ray: &Ray) -> Color {
if hit_sphere(&Point3::new(0.0, 0.0, 1.0), 0.5, &ray) {
return Color::new(1.0, 0.0, 0.0);
}
let unit_direction = unit_vector(&ray.direction());
let t = 0.5 * unit_direction.y + 1.0;
(1.0 - t) * Color::new(1.0, 1.0, 1.0) + t * Color::new(0.5, 0.7, 1.0)
}

まとめ

ようやくレイトレーシングっぽさが出てきました。
今回追加されたhit_sphereconst fnになっただけで通常の関数と変わるところはないです。
今はconst fnの中でifを使うのはstableの中でもできるのでfeatureを追加する必要がないのは嬉しいです。


次回はヒットした球を単色ではなく球の法線を描画します。