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 Setup 1.1 Base Code General Structure 当我们配置好Vulkan项目后,就可以创建应用程序的基本框架了: #include <vulkan/vulkan.h> #include <iostream> #include <stdexcept> #include <cstdlib> class H...
1 Origin of Vulkan 与早期图形API类似,Vulkan旨在为GPU提供跨平台抽象。但传统API设计时受限于当时以固定功能管线为主的图形硬件环境,开发者只能以标准格式提供顶点数据,在光照与着色功能上受制于GPU厂商。 随着显卡架构发展,可编程功能逐渐增强。这些新特性只能通过补丁式整合到现有API中,导致驱动层抽象不理想,需要大量猜测性代码将开发者意图映射到现代架构。这正是...
1 Area Lights: Math Foundations 1.1 Why Are Area Lights Ideal? Punctual Light因其简单性和较低的计算成本,至今仍广泛应用。然而,这类光源存在固有的概念缺陷,使其无法精确还原真实世界的光照效果。相较于面光源,其主要缺陷可以概括为两点: Punctual Light的反射不具备物理真实性 ...
1 An Intro to Lighting in 3D Rendering [TODO] 2 Point and Spot Lights [TODO] 3 Distant Lights [TODO]
1 An Introduction for Artists to BRDFs and Radiometry 1.1 Radiometry: Defining Relations between Light and Matter 辐射度量学是一门研究包含可见光在内的电磁辐射测量的学科,它是计算机图形学中模拟光线与物质交互行为的基础。 1.2 Radiometry Terms: Flux,...
1 Ambient Occlusion 1.1 Introduction to AO 环境光遮蔽用于模拟物体表面因周围几何结构而接受到的环境光被遮挡的效果。 采样当前像素深度 → 重建视图空间坐标 → 随机方向生成 → 步进采样周围像素 → 计算遮挡贡献 → 积分AO值 → 后处理输出 1.2 AO Frameworks 本篇博客将会专注于在URP14中实现SSAO、HBAO、G...