Rust 光线追踪 10: 材质

在前面的文章中,我们渲染出来的图片使用的是漫反射的材质。不同的材质,可以简单理解为对于光线的影响不同,这里的影响包括如何吸收,如何散射等。在这一节,我们将加入另一种材质,金属材质。 最终的渲染图如下 ...

December 4, 2021 · 5 min · fred

Rust 光线追踪 09: 理想散射

上一节生成的图看起来很暗,有一个问题是因为有些物体反射的光线,会在 t = 0 时再次击中自己,而由于浮点数精度的问题,这些值可能是 0.00000001 或 -0.0000001 之类的任意接近0的浮点数,所以我们 hit 函数的 t_min 参数,需要忽略掉 0 附近的一小部分范围,防止物体发出的光线再次与自己相交。这样也就避免了阴影痤疮(Shadow ance)的产生。 修改 main.rs 中 ray_color 函数中的 word.hit(),改为 if let Some(hit_record) = world.hit(r, 0.001, f64::INFINITY),也就是 t_min 参数传值 0.001。 cargo run --release > diffuse_random_in_sphere.ppm 生成图如下 可以看到,已经比上一节生成的图亮了很多。 我们上一节使用的漫反射光线散射的方法,是在球体内部生成一个随机的点。然后,这样生成的向量,有很大的概率会和法线方向相近,并且及小概率会沿着入射方向反射回去。然而,真正的理想散射(Lambertian 反射)后的光线距离法向量比较近的概率会更高,但是分布规律会更加均衡,而实现这个方法,就是在球面上选取一个点,而不是在球内。我们可以通过在球内选取一个点,然后将其标准化,来得到球面上的点,因为我们的球是单位球。 在 vec3.rs 中 Vec3 的实现里,添加一个新的方法 random_unit_vector,代码如下 // src/vec3.rs pub fn random_unit_vector() -> Vec3 { let point = Vec3::random_in_unit_sphere(); return Vec3::unit_vector(point); } 然后修改 main.rs 中的 ray_color 函数,将原来调用 random_in_unit_sphere 的代码改成调用 random_unit_vector。...

December 1, 2021 · 2 min · fred

Rust 光线追踪 08: 漫反射和伽马校正

漫反射的通俗理解是,当一个光线打到某一个物体的某一个点上,这条光线一部分会被吸收,一部分会被随机的反射出去,而反射出去的光线,又可能会打到另一个物体面上的一个点,然后又会被吸收,以及随机的反射出去。现实中的光线可能会无限递归下去,但是我们在程序中实现,不可能无限递归,会设置一个反射次数,达到了那个次数,就停止。 ...

November 30, 2021 · 3 min · fred

Rust 光线追踪 07: 抗锯齿和相机抽象

将上一节生成的图放大来看,可以看到球体的边缘与存在着很明显的锯齿,这一节我们首先将相机的代码进行抽象,写在一个 Camera 结构体里,然后加入抗锯齿的逻辑。 ...

November 24, 2021 · 3 min · fred

Rust 光线追踪 06: 代码抽象

这一节的内容修改的比较多,我们会把前面的逻辑重新整理一下,将可光线可交互的世界物体,抽象成一个 Hittable Object,然后可以在场景中添加多个物体。也使用了 Rust 的 Trait,Vec 等。最终效果图如下 ...

November 23, 2021 · 4 min · fred