My Blogs

Bounding Volume Hierarchies

本章节将会是光线追踪系列博客中目前为止最难且最复杂的部分,我们之所以在当前的进度下引入BVH,一方面是为了让代码运行更快,同时也是因为实现BVH要求我们重构hittable类的部分代码,当我们在场景中添加长方体等其他物体时,我们就不再需要再回过头考虑hittable的重构了。 当前我们的渲染器的主要时间瓶颈在光线-物体的相交测试上,当我们向场景中发射数以百万计的光线时,我们可以首先对场景中...

Motion Blur

在真实世界的相机中,相机会在一个短暂的时间窗口内保持开启,而在这个时间段内,相机和场景中的物体都有可能处于运动状态。为了能够在渲染器中实现这一效果,我们需要计算在快门的时间窗口中,相机对于场景的感知的平均值。 2.1 思路 原博客的这一部分我认为解释的有些繁琐,所以我就不再翻译原文内容了,直接写一写思路与代码。 实现运动模糊的思路很简单,光线追踪器在相机快门打开的时间窗口内随机选择不同...

Positionable Camera

现在,让我们进一步拓展相机的功能,首先我们为相机实现一个可以修改的fov,所谓的fov,就是指渲染图像从一边到另一边的角度。由于设置的相机宽高比不为1:1,所以fov在水平和竖直方向上的角度是不同的,在本系列博客中,我们将采用竖直方向上的fov,并且在构建相机时,我们给出指定的角度,然后在构建函数中转换到弧度。 12.1 Camera Viewing Geometry 想要调整相机的fo...

Dielectrics

像水、玻璃和钻石这样的透明材料是电介质。当光线照射到它们时,会分裂成反射光线和折射(透射)光线。我们将通过随机选择反射或折射来处理这一现象,每次交互只生成一条散射光线。 折射光线在从环境进入材料本身时会发生弯曲(例如玻璃或水)。这就是为什么当铅笔部分插入水中时会看起来弯曲。折射光线弯曲的程度由材料的折射率决定。通常,这是一个描述从真空进入材料时光线弯曲程度的单一值。玻璃的折射率大约在1.5...

Diffuse Materials

现在,我们可以着手实现更为真实的材质了,首先是常见的漫反射材质 9.1 A Simple Diffuse Material 漫反射物体的特点是不发出自己的光,而是反射周围环境中的光。它们会把反射的光调制成自身的固有颜色。比如,如果一个红色的漫反射物体受到白光照射,它会反射出红色的光,因为它的固有颜色是红色。当光线照射到漫反射表面时,反射的方向是随机的,这意味着光线会以各种不同的角度反射出...

Antialiasing

我们当前的渲染结果中有明显的锯齿。当真实的相机拍照时,在物体边缘处通常不会有明显的锯齿,这是因为边缘的像素是与前景与背景在一定程度上混合的结果。而在渲染中,我们可以通过对每个像素的一些采样进行平均来获取相近的效果。 当前,相机构建出的光线会穿过每个像素的中心点,这种做法被称为点采样point sampling。要理解点采样的问题,我们可以想象要渲染一个远处的黑白棋盘,棋盘由8x8的黑白块组...

Moving Camera Code Into Its Own Class

因为相机是渲染器的一个重要组成模块,我们有必要将其抽象到一个单独的类中。camera类主要负责两个任务: 构建并向场景中散布光线 使用光线的计算结果渲染图像 我们把这两个任务分别放在函数private initialize()和public render()中, 同时,在相机的重构中,我们可以将此前在main.cpp中的函数ray_color()包含起来,因为它属于渲染图像的...

Surface Normals and Multiple Objects

6.1 Shading with Surface Normals 我们需要先明确一点:在我们的光线追踪器中,并非所有法线都需要进行归一化,尤其是对于法线的方向来说。 对于一个球体,法线就等于球面上一点减去球心得到的向量,如下图所示: 现在让我们将法线添加到到球体的着色计算中。因为目前我们的场景中还没有任何照明,我们暂时可以让球体的法线作为球体的颜色,具体的做法是,根据光线与球面的交...