Lecture14_光线追踪2(Ray Tracing 2)_GAMES101 课堂笔记

Lecture 13 内容:


Lecture 14 内容概览:

  • 使用 AABBs 加速光线追踪
    • 均分的格子
    • 空间划分(Spatial partitions)
  • 辐射度量学(Basic Radiometry)

第一部分:光线追踪加速

一、均匀的空间划分(Grids)
(一) 预处理 - 构建加速网格

划分格子主要有图中所示的三个步骤(图中有一个格子也应涂上)。对于第3步:最大的圆中有一个空白格,是因为只考虑表面(即圆周所在的单元格)。

(二)光线与场景交叉:

一束光线摄入,首先按照摄入顺序建立射线遍历的网格;然后依次便利每一个单元格是否与物体交叉。

另外,关于格子划分的个数和大小也有讲究。如果格子数划分较少(例如:1个),这样并不能实现加速;如果格子划分太多,反而会因为便利许多格子使效率低下。因此发明了一种启发式算法尽量选取适中的格子数。计算方法如下图:

(三)Uniform优缺点分析:

优点:适合对于分布均匀的规则的图像进行加速,例如下图:

缺点:对于大规模空白图像,分布不均匀,很难找到某个小的物体;因此,不适合用格子解决。例如下图:


二、空间划分(Spatial Partitions)

主要有以下三种方法:

  1. Oct-Tree(八叉树):切8份,在 2D 场景中为 4 叉;在 3D 场景中为 8 叉。但是在更高维的场景中将面临问题。
  2. KD-Tree : 沿着某一个维度不断二分(类似二叉树思想)。
  3. BSP-Tree : 斜二分方法,但是由于不是方方正正,计算比较复杂,尤其是对于高维度场景,相当麻烦。

建立树应在光线追踪前完成。下面以 KD-Tree 举例,概述划分过程。例如下图,仅展示一部分划分过程:

KD-Tree 数据结构

KD-Tree 如何加速光线追踪?

利用结构划分格子 ==> 光线与划分顺序的格子(先大后小)依次判定是否相交 ==> (找交点)若相交,判定是否与物体相交;否则不相交,开始判定下一个格子是否与光线相交。

KD-Tree缺点:
  1. 一个物体可能存在多个格子中。
  2. 需要判断三角形与格子求交。

上面两个问题比较难解决,于是逐渐发明了另外一种方法:物体划分。

由于很难判断三角形与格子相交,


三、物体划分(Object Partitions)

该方法目前被广泛应用。这种方法形成的加速结构叫做:BVH(Bounding Volume Hierarchy)。

BVH是将物体完整划分到两个部分中,然后不断向下进行划分,重新求Bounding box。例如下图:

(一)建立 BVHs 过程:
  1. 查找边框(bounding box)
  2. 递归地划分在两个子集对象集
  3. 重新计算子集的边界框(Bounding box)
  4. 必要时停止划分
  5. 存储在每个叶子节点中的对象
(二)怎样划分结点
  1. 选择一个维度分裂
  2. 启发法#1:总是选择节点的最长轴
  3. 启发法#2:中位数物体进行分割,即物体个数平均划分(使得划分的数量相当,便于查找。例如:快速选择算法,可以实现 \(O(n)\) 效率。)
(三)划分的终止条件

通常是当划分区域内的物体个数小到某一个数时,停止划分。(例如 \(\leq 5\) )。

(四)BVHs 的数据结构

四、空间划分 vs 物体划分


第二部分:辐射度量学(Basic radiometry)

一、辐射度量学作用

在光线追踪时,Whitted style 并没有展示很真实、正确的效果。因此引入辐射度量学,是为了从物理上,更精准的描述物体。

二、定义
  1. 测量系统和单位照明
  2. 精确地测量光的空间特性
    • 新的术语:Radiant flux, intensity, irradiance, radiance
  3. 在物理上,以精准的方式进行照明时计算
三、计算流程
(一)Radiant Energy and Flux(Power)

定义:辐射能是电磁辐射的能量。它以焦耳为单位测量,并用符号表示为:

\[Q[J=Joule] \]

定义:辐射通量(功率)发射的能量,反射,发射或接收,每单位时间

\[\Phi = \frac{dQ}{dt}[W=Watt][lm=lumen]^* \]
一些重要的光线定义:

(二) Radiant Intensity
1. 定义:

  1. 关于立体角

1) 立体角定义:

2D 内为 角(Angle:\(\theta = \frac{l}{r}\)),3D 内为立体角(solid angle,\(\omega=\frac{A}{r^2}\))。

2)立体角微积分

3. 各方向的点光源

对所有方向上的求积分:

4. 实例:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值