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

This Week In Moeif 23

这个周主要在做夜莺号的记忆这个项目,30号要交付一个版本,到今天为止,所有的逻辑已经搞完了,明天修一下问题基本上就可以了。这个周继续输出了三篇关于Rust及光线追踪的博客以及公众号和知乎,关注和阅读的人也在增加,下个周继续。 ...

November 28, 2021 · 1 min · fred

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

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

November 24, 2021 · 3 min · fred

Rust 光线追踪 06: 代码抽象

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

November 23, 2021 · 4 min · fred

Rust 光线追踪 05: 简化 hit_sphere 函数

这一节比较简单,就是将上一节的 hit_sphere 函数进行一定的简化,直接看代码。代码中简化之前的已经注释,可以直接对比一下,不同的计算方式,最终算出来的值都是一样的。 ...

November 22, 2021 · 1 min · fred

This Week In Moeif 22

11月马上快要结束了,时间过的真快,有一点点的焦虑,但是也还好。这周开始了不断输出博客内容,可能是因为和Rust有关,阅读数量和关注数量增长了很多,后面可以考虑在每一篇文章最后加上游戏的宣传链接。看起来写博客这件事情可以长期写下去,可能前期没什么,后期积累到一定程度,不确定会发生什么。 这周上海的温度还可以,但是今天下雨了,未来两天温度下降的很多。 项目进度 游戏码农:那些打工的日子 这周主要做的事情还是各个模块的数据配置,以及界面元素的考虑,具体的UI还没有仔细考虑。专业技能相关配置、厨艺配置、外卖配置、找工作和面试相关配置、通勤配置、行为配置。 夜莺号的记忆 这个项目这周做了很多事情,工程的搭建,游戏循环的逻辑,具体的关卡的逻辑等。 本周电影 欲望号快车 Crash (1996) 毒液 本周书籍 《KK三部曲》(阅读中) 下周初步计划 继续数据配置工作 夜莺号关卡逻辑 有时间的话考虑游戏码农的UI构建

November 21, 2021 · 1 min · fred

Rust 光线追踪 04: 显示球体的法线

法线的定义是垂直于面的向量。对于一个球体来说,法线的向量,就是球上某个点,减去球心坐标,所得到的向量。 ...

November 21, 2021 · 2 min · fred

Rust 光线追踪 03: 渲染一个圆

下面的公式有点多,只是把原教程中的公式详细展开了,一步一步来,很简单,相信我。 给定一个点,判断一个点是否在一个半径为 $R$ 的圆或者圆外、圆内,我们可以使用下面的公式来判断。这里假设圆心在 $(0,0,0)$ 点,半径为 $R$ 如果一个点 $(x, y, z)$ 在圆上,则 $x^2 + y^2 + z^2 = R^2$ 如果一个点 $(x, y, z)$ 在圆内,则 $x^2 + y^2 + z^2 < R^2$ 如果一个点 $(x, y, z)$ 在圆外,则 $x^2 + y^2 + z^2 > R^2$ 假设圆心在点 $C = (C_x, C_y, C_z)$,半径为 r,则根据上面的第一个公式,可以得到 $(x - C_x)^2 + (y - C_y)^2 + (z - C_z)^2 = r^2$ 我们可以将点 $(x, y, z)$ 使用之前的 Vec3 向量表示,例如设 $点P = (x, y, z)$,则可以将上面的公式,换一种表达形式,也就是...

November 20, 2021 · 3 min · fred

Rust 光线追踪 02: 使用光线生成渐变图

这个小节的目标是添加光线相光内容,根据光线打在屏幕上不同的位置,生成一张蓝白渐变图。 ...

November 20, 2021 · 5 min · fred