Adding a Sphere
现在我们为光线追踪器添加一个球体,作为场景中的第一个物体。之所以选择球体,是因为计算球体与光线的相交相对简单。 5.1 Ray-Sphere Intersection 假设三维空间中一个球体的中心位置位于点(Cx, Cy, Cz)上,半径为r,则该球体的表达公式为 [(C_x-x)^2+(C_y-y)^2+(C_z-z)^2=r^2] 在计算机图形学,我们要尽可能地使用向量,例如我们...
现在我们为光线追踪器添加一个球体,作为场景中的第一个物体。之所以选择球体,是因为计算球体与光线的相交相对简单。 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...
1 An Intro to Lighting in 3D Rendering
1 An Introduction for Artists to BRDFs and Radiometry 1.1 Radiometry: Defining Relations between Light and Matter 辐射度量学是一门研究包含可见光在内的电磁辐射测量的学科,它是计算机图形学中模拟光线与物质交互行为的基础。 1.2 Radiometry Terms: Flux,...
1 Motivation Cozy Space是一个装修模拟类游戏。它具有以下特点: 灵活的房间户型设计:玩家可以构建任意的多边形房间 时间/天气系统:玩家可以修改游戏中的时间段与天气,从而影响房间内的光照与氛围 自由的家具摆放:玩家可以自由地摆放房间中的家具、装饰品 基于以下几点考虑,我最终选择使用实时面光源作为房间中的主要光照来源: 平行光不适合作为封闭室内...
LearnOpenGL - Area Lights 1 Introduction 虽然我们已经实现了三种经典的光源类型:平行光、点光源、聚光灯,但是这些光源存在一个相同的缺点:无法模拟现实世界中具有真实面积/形状的光源。 2 Problem Description 假设场景中放置了一个邻近几何体的矩形面光源,该光源需向周围发射光线。我们需要在着色点处,将面光源对应的球面多边形立...
LTC.pdf - Google Drive 1 Introduction 基于物理的着色的核心在于求解光照方程,即对BRDF与场景光照在半球空间上的乘积进行积分。而本篇博客主要关注多边形光源的着色计算,这意味着需要对球面多边形区域上的BRDF进行积分。这里的球面多边形(spherical polygon)区域表示三维空间的多边形光源投影到着色点法线方向上的半球所形成的区域。 尽管多...
1 实现思路 1.1 Overview 我们不希望依赖于额外的深度图,以及模糊算法。因为这需要额外的内存占用与性能消耗 为了创建出可信的效果,在材质中行进的光线需要: 受到物体厚度的影响 其衰减效果能够受到视角的影响 计算简单 我们从简单的方向向量出发: [L_{Attenuation}(N\cdot L+V\cdot...