Metal
10.1 An Abstract Class for Materials 现在我们想要实现镜面反射的材质,但我们要如何处理不同物体所使用的不同材质呢?我们可以创建一个材质的抽象类,并且在我们的渲染器中,material类还需要负责两个功能: 创建散布光线,或者入射光线被材质吸收掉 如果存在光线散布,则需要给出光线的衰减程度 #ifndef MATERIAL_H #defin...
10.1 An Abstract Class for Materials 现在我们想要实现镜面反射的材质,但我们要如何处理不同物体所使用的不同材质呢?我们可以创建一个材质的抽象类,并且在我们的渲染器中,material类还需要负责两个功能: 创建散布光线,或者入射光线被材质吸收掉 如果存在光线散布,则需要给出光线的衰减程度 #ifndef MATERIAL_H #defin...
现在,我们可以着手实现更为真实的材质了,首先是常见的漫反射材质 9.1 A Simple Diffuse Material 漫反射物体的特点是不发出自己的光,而是反射周围环境中的光。它们会把反射的光调制成自身的固有颜色。比如,如果一个红色的漫反射物体受到白光照射,它会反射出红色的光,因为它的固有颜色是红色。当光线照射到漫反射表面时,反射的方向是随机的,这意味着光线会以各种不同的角度反射出...
我们当前的渲染结果中有明显的锯齿。当真实的相机拍照时,在物体边缘处通常不会有明显的锯齿,这是因为边缘的像素是与前景与背景在一定程度上混合的结果。而在渲染中,我们可以通过对每个像素的一些采样进行平均来获取相近的效果。 当前,相机构建出的光线会穿过每个像素的中心点,这种做法被称为点采样point sampling。要理解点采样的问题,我们可以想象要渲染一个远处的黑白棋盘,棋盘由8x8的黑白块组...
因为相机是渲染器的一个重要组成模块,我们有必要将其抽象到一个单独的类中。camera类主要负责两个任务: 构建并向场景中散布光线 使用光线的计算结果渲染图像 我们把这两个任务分别放在函数private initialize()和public render()中, 同时,在相机的重构中,我们可以将此前在main.cpp中的函数ray_color()包含起来,因为它属于渲染图像的...
6.1 Shading with Surface Normals 我们需要先明确一点:在我们的光线追踪器中,并非所有法线都需要进行归一化,尤其是对于法线的方向来说。 对于一个球体,法线就等于球面上一点减去球心得到的向量,如下图所示: 现在让我们将法线添加到到球体的着色计算中。因为目前我们的场景中还没有任何照明,我们暂时可以让球体的法线作为球体的颜色,具体的做法是,根据光线与球面的交...
现在我们为光线追踪器添加一个球体,作为场景中的第一个物体。之所以选择球体,是因为计算球体与光线的相交相对简单。 5.1 Ray-Sphere Intersection 假设三维空间中一个球体的中心位置位于点(Cx, Cy, Cz)上,半径为r,则该球体的表达公式为 [(C_x-x)^2+(C_y-y)^2+(C_z-z)^2=r^2] 在计算机图形学,我们要尽可能地使用向量,例如我们...
4.1 The ray Class 所有的光线追踪器都有一个ray类,并且会计算沿着光线会看到的颜色。我们可以把光线理解为一个函数P(t) = A + tb,其中P是三维空间中线上的一点,A是光线原点,b是光线方向,t是一个实数参数,在程序中对应的数值类型是double。通过改变t的值,我们可以得到直线上任意位置。如果我们限定t是正数,则函数表示的概念就是我们所说的half-line或ra...
几乎所有的图形程序都有一些类用于存储向量与颜色。在很多系统中,这些向量是4维的,对于位置向量来说,这包括三维空间中的位置以及一个齐次坐标,对于颜色向量来说,包括RGB颜色以及alpha透明值。对于我们的渲染器来说,三维向量就足够了。我们将会使用同一个Vec3类用于表示颜色、位置、方向、偏移量等。同时,我们还会声明两个别名:Point3和Color。 我们将这个类的定义放在math.hpp头...
2.1 The PPM Image Format 在本系列博客中,我们使用PPM图像格式作为渲染结果的存储形式。下图给出了PPM格式的简要描述: 下面这段C++代码可以输出一个PPM格式的图片: #include <iostream> int main() { // Image int imageWidth = 256; int imageHe...
Motivation Cozy Space是一个装修模拟类游戏。它具有以下特点: 灵活的房间户型设计:玩家可以构建任意的多边形房间 时间/天气系统:玩家可以修改游戏中的时间段与天气,从而影响房间内的光照与氛围 自由的家具摆放:玩家可以自由地摆放房间中的家具、装饰品 基于以下几点考虑,我最终选择使用实时面光源作为房间中的主要光照来源: 平行光不适合作为封闭室内的照...