【CG】计算机图形学(Computer Graphics)基础(其贰)

news2024/11/25 16:42:02

0 学习视频

B站GAMES101-现代计算机图形学入门-闫令琪

※ 接上文【CG】计算机图形学(Computer Graphics)基础(其壹)

7 光线追踪

7.1 为什么需要光线追踪?

  • 光栅化无法妥善处理全局效果

    • (软)阴影

    • 尤其是当光线反射不止一次时

      在这里插入图片描述

      在这里插入图片描述

  • 光栅化很快(近似效果),但质量相对低

    在这里插入图片描述

  • 光线追踪很精准,但很慢

    • 光栅化:实时,光线追踪:离线(电影)

    • 一帧需要~10K处理器核心(CPU)小时渲染

      在这里插入图片描述

7.2 基础光线追踪算法

7.2.1 光线Light Rays

三个关于光线的想法

  1. 光线延直线传播(虽然这是错的,波动性)
  2. 如果它们交叉,它们不会彼此“碰撞”(虽然这仍是错的,波动性)
  3. 光线从光源发出,不断反射到眼睛(但是物理学中是路径反转的——光路的可逆性)

“如果你凝视着深渊时,深渊也会凝视着你。”——Friedrich Wilhelm Nietzsche(尼采)

7.3 光线投射Ray Casting

Appel 1968

  1. 通过每个像素投射一个光线来生成图像

  2. 通过向光源发送光线检查阴影

    在这里插入图片描述

7.3.1 光线投射——生成眼睛光线Eye Rays

针孔Pinhole相机模型

在这里插入图片描述

在这里插入图片描述

7.3.2 递归(Whitted-Style)光线追踪

“一个升级的用于着色显示照明模型” T.Whitted,CACM 1980

渲染时间:

  • VAX 11/780(1979)74m
  • PC(2006) 6s
  • GPU(2012) 1/30s

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

左边球折射,右边球反射

7.4 射线表面交点

7.4.1 射线方程Ray Equation

射线由其起点和方向矢量定义

例子:

在这里插入图片描述

射线方程: r ( t ) = o + t d \textbf{r}(t)=\textbf{o}+t\textbf{d} r(t)=o+td      0 ≤ t < ∞ 0≤t<∞ 0t

r \textbf{r} r:ray

t t t:time

o \textbf{o} o:origin

d \textbf{d} d:(normalized)direction

7.4.2 光线与球体的交点

射线: r ( t ) = o + t d \textbf{r}(t)=\textbf{o}+t\textbf{d} r(t)=o+td 0 ≤ t < ∞ 0≤t<∞ 0t

球: p : ( p − c ) 2 − R 2 = 0 \textbf{p}:(\textbf{p}-\textbf{c})^2-R^2=0 p:(pc)2R2=0

什么是一个交点?

交点 P P P必须同时满足射线和球的方程

解方程:

( o + t d − c ) 2 − R 2 = 0 (\textbf{o}+t\textbf{d}-\textbf{c})^2-R^2=0 (o+tdc)2R2=0

a t 2 + b t + c = 0 at^2+bt+c=0 at2+bt+c=0

a = d ⋅ d a=\textbf{d}\cdot \textbf{d} a=dd, b = 2 ( o − c ) ⋅ d b=2(\textbf{o}-\textbf{c})\cdot\textbf{d} b=2(oc)d, c = ( o − c ) ⋅ ( o − c ) − R 2 c=(\textbf{o}-\textbf{c})\cdot(\textbf{o}-\textbf{c})-R^2 c=(oc)(oc)R2

t = − b ± b 2 − 4 a c 2 a t=\frac{-b±\sqrt{b^2-4ac}}{2a} t=2ab±b24ac

在这里插入图片描述

7.4.3 光线与隐式表面求交

射线: r ( t ) = o + t d \textbf{r}(t)=\textbf{o}+t\textbf{d} r(t)=o+td 0 ≤ t < ∞ 0≤t<∞ 0t

一般隐式表面: p : f ( p ) = 0 \textbf{p}:f(\textbf{p})=0 p:f(p)=0

替代射线方程: f ( o + t d ) = 0 f(\textbf{o}+t\textbf{d})=0 f(o+td)=0

解得正实数根

在这里插入图片描述

7.4.4 光线与三角形面(显式表面)求交

为什么?

  • 渲染:可视化,阴影,光照…
  • 几何:内/外部测试
    • 任意一点与光源相连(射线)
      • 奇数个交点:该点在内部
      • 偶数个交点:该点在外部

怎么计算?

解决以下问题:

  • 简单的想法:对每个三角形判断是否和光线有交点
  • 简单,但是慢(如何加速?)
  • 注意:具有0或1个交点(忽略多个交点)

在这里插入图片描述

7.4.5 光线和三角形的交点

三角形肯定处于一个平面内

  • 射线与平面的交点
  • 判断交点是否在三角形内部
    在这里插入图片描述

7.4.6 平面方程Plane Equation

平面由法向量和平面上的一个点定义

例子:

在这里插入图片描述

平面方程(如果 p p p满足该方程,那么 p p p在该平面上)

p : ( p − p ′ ) ⋅ N = 0 \textbf{p}:(\textbf{p}-\textbf{p}^\prime)\cdot\textbf{N}=0 p:(pp)N=0       a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0

7.4.7 光线与平面的交点

光线方程:

r ( t ) = o + t d \textbf{r}(t)=\textbf{o}+t\textbf{d} r(t)=o+td 0 ≤ t < ∞ 0≤t<∞ 0t

平面方程:

p : ( p − p ′ ) ⋅ N = 0 \textbf{p}:(\textbf{p}-\textbf{p}^\prime)\cdot\textbf{N}=0 p:(pp)N=0

在这里插入图片描述

求得交点

p = r ( t ) \textbf{p}=\textbf{r}(t) p=r(t)并解得 t t t

( p − p ′ ) ⋅ N = ( o + t d − p ′ ) ⋅ N = 0 (\textbf{p}-\textbf{p}^\prime)\cdot\textbf{N}=(\textbf{o}+t\textbf{d}-\textbf{p}^\prime)\cdot\textbf{N}=0 (pp)N=(o+tdp)N=0

t = ( p ′ − o ) ⋅ N d ⋅ N ( 0 ≤ t < ∞ ) t=\frac{(\textbf{p}^\prime-\textbf{o})\cdot\textbf{N}}{\textbf{d}\cdot\textbf{N}}(0≤t<∞) t=dN(po)N(0t)

7.4.8 MÖller Trumbore算法

一种更快速的直接给出重心坐标的方法

讨论其中的部分推导!

在这里插入图片描述

7.5 加速光线与表面求交

7.5.1 光线追踪——性能挑战

7.5.1.1 简单的光线与场景的交点
  • 用每个物体彻底测试与射线的交点
  • 找到最近的交点(最小的t值)
7.5.1.2 问题
  • 天真算法 = # p i x e l s × # o j e c t s ( × # b o u n c e s ) =\#pixels \times \#ojects(\times \#bounces) =#pixels×#ojects(×#bounces)
  • 非常慢!

在这里插入图片描述

在这里插入图片描述

7.6 包围体积(盒)Bounding Volumes

7.6.1 包围盒Bounding Volumes

避免交点的快速方法:使用一个简单的盒子包围一个复杂的物体

  • 物体被盒子完全地包含
  • 如果它没有命中盒子,它就不会命中物体
  • 所以先测试BVol,然后测试是否命中物体

在这里插入图片描述

7.6.2 用盒子Box的光线交点(3D)

理解:盒子Box是三个不同的对面的形成的交集

在这里插入图片描述

在这里插入图片描述

具体地:

通常使用一个轴对齐包围盒Axis-Aligned Bounding Box(AABB)

即任意包围盒的边都是沿着x,y或z轴的

7.6.3 光线与轴对齐盒子求交

2D的例子,3D中是一样的!计算光线与面的交点并取得 t m i n / t m a x t_{min}/t_{max} tmin/tmax间隔的交点

在这里插入图片描述

对x平面和y平面的线段求交集得到最终结果

  • 回顾:一个盒子(3D)=三对无限大的平面

  • 关键想法

    • 只有当光线进入所有对面时光线才进入了盒子
    • 只要光线离开任何一个对面,光线就离开的盒子
  • 对于每一对对面,都计算计算tmin和tmax(负数也没关系)

  • 对于3D盒子, t e n t e r = m a x { t m i n } , t e x i t = m i n { t m a x } t_{enter}=max\{t_{min}\},t_{exit}=min\{t_{max}\} tenter=max{tmin}texit=min{tmax}

  • 如果 t e n t e r < t e x i t t_{enter}<t_{exit} tenter<texit,那么说光线在盒子中停留了一会儿(所以它们必然相交!)

  • 然而,光线不是一条直线(是一条射线)

    • 应该检查时间 t t t 是否是负数以满足物理上的正确性!
  • 如果 t e x i t < 0 t_{exit}<0 texit<0呢?

    • 盒子一定在光线的”背后“——不可能有交点!
  • 如果 t e x i t ≥ 0 t_{exit}≥0 texit0 t e n t e r < 0 t_{enter}<0 tenter<0呢?

    • 光线的起点在盒子中——一定有交点!
  • 总结,光线与AABB有交点当且仅当(iff)

    • t e n t e r < t e x i t & & t e x i t ≥ 0 t_{enter}<t_{exit}\&\&t_{exit}≥0 tenter<texit&&texit0

7.6.4 为什么使用轴对齐Axis-Aligned?

计算更简洁
在这里插入图片描述

7.7 使用AABBs加速光线追踪

7.7.1 均匀的格子Uniform grids

7.7.1.1 预处理-构建加速网格
  1. 找到包围盒

  2. 划分格子

  3. 判定哪些格子中可能有物体,存储起来

    在这里插入图片描述

7.7.1.2 光线与场景求交(光线追踪)

逐步顺序地遍历光线经过的格子

对于每个格子

​ 判断之前存储起来的格子(有物体)中的物体是否与光线相交

在这里插入图片描述

7.7.1.3 格子的分辨率?

一个格子

  • 没有加速

    在这里插入图片描述

很多格子

  • 多次遍历,效率低下

    在这里插入图片描述

启发式(技巧):

  • # c e l l s = C ∗ # o b j s \#cells=C*\#objs #cells=C#objs

  • C ≈ 27   i n   3 D C≈27\ in\ 3D C27 in 3D

    在这里插入图片描述

7.7.1.4 均匀的格子——什么时候效果好?

在这里插入图片描述

大量物体在尺寸和空间上均匀分布时均匀的格子效果好

7.7.1.5 均匀的格子——什么时候效果不好?

在这里插入图片描述

“体育场中的茶壶”问题(空的地方多,不均匀)

7.7.2 空间划分Spatial partitions

7.7.2.1 空间划分的例子

在这里插入图片描述

7.7.2.2 KD树预处理

在这里插入图片描述

7.7.2.3 KD树的数据结构

内部结点存储

  • 划分轴:x-,y-,或z-轴
  • 划分位置:沿轴划分开的平面坐标
  • 孩子:指向孩子结点
  • 没有物体存储在内部结点中

叶子结点

  • 物体列表
7.7.2.4 遍历一颗KD树

在这里插入图片描述

在这里插入图片描述

假设左边的蓝色区域是叶子结点:对所有物体求交

在这里插入图片描述
在这里插入图片描述

假设右上边的绿色区域是叶子结点:对所有物体求交
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

KD树的问题:

  • 一个物体可能存在多个不同的格子里
  • KD树的建立并不简单,需要考虑三角形与盒子求交

7.7.3 物体划分Object Partitions与包围盒层级Bounding Volume Hierarchy(BVH)

7.7.3.1 包围盒层级Bounding Volume Hierarchy(BVH)
  1. 找到一个包围盒
  2. 递归地把任何一个包围盒拆成两个部分
  3. 对拆成的两个部分都重新计算包围盒
  4. 必要时停下
  5. 把物体存储于各个叶子结点中

在这里插入图片描述

BVH解决了KD树的问题:

  • 一个物体只可能出现在一个格子里

  • 省去了包围盒与三角形求交的问题

BVH存在的问题:

BVH对空间的划分不是严格的划分开

怎么划分,很有讲究

7.7.3.2 构建BVHs

如何划分一个结点?

  • 选择一个维度去划分
  • 技巧1:总是选择沿着节点中最长的轴划分
  • 技巧2:在中间物体的位置划分结点(涉及排序问题)

终止标准?

  • 技巧:当结点中包含几个元素时停止(例如5个)
7.7.3.2.1 任意一个无序序列,如何在O(n)时间快速找到其中位数(或第i大的树)?

快速选择算法,受快速排序算法启发

7.7.3.3 BVHs的数据结构

内部结点存储

  • 包围盒
  • 孩子:指向孩子结点

叶子结点存储

  • 包围盒
  • 物体列表

结点代表场景中基元的子集

  • 子树中的所有物体
7.7.3.4 BVH遍历算法

在这里插入图片描述

7.7.3.5 空间划分vs物体划分

空间划分(如KD树)

在这里插入图片描述

  • 把空间划分为两个不重叠的区域
  • 一个物体可能处于多个区域中

物体划分(如BVH)

在这里插入图片描述

  • 把物体划分到不相交的子集中
  • 每个子集的包围盒在空间中可能相交

7.8 辐射度量学Basic radiometry

7.8.1 度量学Radiometry

  • 是一个测量系统,也是一个光照单位
  • 准确测量光的空间特性
    • 辐射通量Radiant flux,强度intensity,辐照度irradiance,辐亮度radiance
  • 准确定义计算光照的物理表达方法

学习的方式

WHY,WHAT,then HOW

7.8.2 辐射能量和通量Radiant Energy and Flux(Power)

定义:辐射能量(Radiant energy)是电磁能量辐射。以焦耳为能量测量,并表示为符号 Q Q Q.

Q   [ J = J o u l e ] Q\ [J=Joule] Q [J=Joule]

定义:辐射通量(Radiant Flux(Power))是单位时间发出、反射、传输或接收的能量。

Φ = d Q d t   [ W = W a t t ]   [ l m = l u m e n ] ∗ \Phi=\frac{dQ}{dt}\ [W=Watt]\ [lm=lumen]^* Φ=dtdQ [W=Watt] [lm=lumen]

7.8.2.1 Flux-单位时间内流过传感器的#photons

在这里插入图片描述

7.8.2.2 感兴趣的重要光线度量

在这里插入图片描述

辐射强度Radiant Intensity

在这里插入图片描述

辐照度Irradiance

在这里插入图片描述

辐亮度Radiance

7.8.3 辐射强度Radiant Intensity

定义:辐射(发光)强度Radiant(luminous) Intensity是单位能量从一个点光源发出的立体角solid angle

在这里插入图片描述

坎德拉(candela)是七个SI基本单位之一

7.8.3.1 角度和立体角

角:圆上一个角所对弧长与半径之比

  • θ = l r \theta=\frac{l}{r} θ=rl

  • 圆有 2 π 2\pi 2π的弧度radians

    在这里插入图片描述

立体角:球上一个角所对面积与球径平方之比

  • Ω = A r 2 \Omega=\frac{A}{r^2} Ω=r2A
  • 球有 4 π 4\pi 4π的立体角steradians
    在这里插入图片描述
7.8.3.2 微分立体角Differential Solid Angles

在这里插入图片描述
d A = ( r   d θ ) ( r   sin ⁡ θ   d ϕ ) = r 2   sin ⁡ θ   d θ   d ϕ dA=(r\ d\theta)(r\ \sin\theta\ d\phi)=r^2\ \sin\theta\ d\theta\ d\phi dA=(r dθ)(r sinθ dϕ)=r2 sinθ dθ dϕ

d ω = d A r 2 = s i n θ   d θ   d ϕ d\omega=\frac{dA}{r^2}=sin\theta\ d\theta\ d\phi dω=r2dA=sinθ dθ dϕ

Sphere:    S 2 \textbf{Sphere:}\ \ S^2 Sphere:  S2

Ω = ∫ S 2 d ω = ∫ 0 2 π ∫ 0 π sin ⁡ θ   d θ   d ϕ \Omega=\int_{S^{2}}d\omega=\int_0^{2\pi}\int_0^{\pi}\sin\theta\ d\theta\ d\phi Ω=S2dω=02π0πsinθ dθ dϕ

7.8.3.3 ω \omega ω 作为一个方向向量

在这里插入图片描述

将使用 ω \omega ω 表示一个方向向量(单位长度)

7.8.3.4 各向同性点源Isotropic Point Source

Φ = ∫ S 2 I   d ω = 4 π I \Phi=\int_{S^2}I\ d\omega=4\pi I Φ=S2I dω=4πI

I = Φ 4 π I=\frac{\Phi}{4\pi} I=4πΦ

7.8.3.5 现代的LED灯

在这里插入图片描述

输出:815 lumens(11W的LED相当于60W的白炽灯)

Radiant intensity?

假设各向同性(每个方向均匀):

I n t e n s i t y = 815   l u m e n s / 4 p i   s r = 65   c a n d e l a s Intensity=815\ lumens / 4pi\ sr=65\ candelas Intensity=815 lumens/4pi sr=65 candelas

7.8.4 辐照度Irradiance

在这里插入图片描述
定义:入射到表面点上的每(垂直/投影)单位面积的能量。

E ( x ) ≡ d Φ ( x ) d A E(\textbf{x})\equiv\frac{d\Phi(\textbf{x})}{dA} E(x)dAdΦ(x)

[ W m 2 ] = [ l m m 2 = l u x ] [\frac{W}{m^2}]=[\frac{lm}{m^2}=lux] [m2W]=[m2lm=lux]

7.8.4.1 为什么地球有四季之分?

在这里插入图片描述

地球自转轴:~23.5°偏轴

7.8.5 辐亮度Radiance

在这里插入图片描述

辐射亮度是描述环境中光线分布的基本场量。

  • 辐亮度是与光线有关的量。
  • 渲染就是计算辐亮度。

在这里插入图片描述

定义:辐亮度(亮度)是每单位立体角和每单位投影面积上,由表面反射、发射或接收的能量。

回顾:

  • 辐照度Irradiance:每单位投影面积的能量
  • 辐射强度Intensity:每立体角的能量

结论:

  • 辐亮度Radiance:每立体角的辐照度Irradiance
  • 辐亮度Radiance:每单位投影面积的辐射强度Intensity
7.8.5.1 入射辐亮度Incident Radiance

入射辐亮度(Incident Radiance)是到达表面的每单位立体角的辐照度(Irradiance)。例如,光沿着给定的光线到达表面(表面和入射方向)。
在这里插入图片描述

7.8.5.2 出射辐亮度Exiting Radiance

出射辐亮度(Incident Radiance)是离开表面的单位投影面积的辐射强度(Intensity)。
在这里插入图片描述

例如,对于一个面光(area light),它是沿着给定光线(表面和出射方向上的点)发出的光。

7.8.6 辐照度Irradiance vs. 辐亮度Radiance

辐照度Irradiance:面积 d A dA dA 接收到的总能量。

辐亮度Radiance:面积 d A dA dA 从“方向” d ω d\omega dω 接收到的能量。

在这里插入图片描述

7.8.7 双向反射分布函数Bidirectional Reflectance Distribution Function(BRDF)

7.8.7.1 一个点上的反射

来自方向 ω i \omega_i ωi 的光线(Radiance),转换为 d A dA dA 接收的能量 E E E。而能量 E E E 将转换为对任何其他方向 ω \omega ω 的光线(Radiance)。
在这里插入图片描述
差分入射辐照度 Differential irradiance incoming:

d E ( ω i ) = L ( ω i ) cos ⁡ θ i d ω i dE(\omega_i)=L(\omega_i)\cos\theta_id\omega_i dE(ωi)=L(ωi)cosθidωi

差分出射辐亮度 Differential radiance exiting(由 d E ( ω i ) dE(\omega_i) dE(ωi)产生):

d L r ( ω r ) dL_r(\omega_r) dLr(ωr)

7.8.7.2 BRDF

双向反射率分布函数(BRDF)表示有多少光从每个入射方向反射到每个出射方向 ω r \omega_r ωr

在这里插入图片描述
f r ( ω i → ω r ) = d L r ( ω r ) d E i ( ω r ) = d L r ( ω r ) L ( ω i ) cos ⁡ θ i d ω i [ 1 s r ] f_r(\omega_i→\omega_r)=\frac{dL_r(\omega_r)}{dE_i(\omega_r)}=\frac{dL_r(\omega_r)}{L(\omega_i)\cos\theta_id\omega_i}[\frac{1}{sr}] fr(ωiωr)=dEi(ωr)dLr(ωr)=L(ωi)cosθidωidLr(ωr)[sr1]

7.8.7.3 反射方程The Reflection Equation

在这里插入图片描述

L r ( p , ω r ) = ∫ H 2 f r ( p , ω i → ω r ) L i ( p , ω i ) cos ⁡ θ i d ω i L_r(p,\omega_r)=\int_{H^2}f_r(p,\omega_i→\omega_r)L_i(p,\omega_i)\cos\theta_id\omega_i Lr(p,ωr)=H2fr(p,ωiωr)Li(p,ωi)cosθidωi

7.8.7.4 困难:递归的表达Recursive Equation

反射方程中,反射光取决于入射光:
在这里插入图片描述
但是,入射光也取决于反射光(在场景中的另一点)(光线不断弹射)

7.8.7.5 渲染方程The Renaering Equation

重写反射方程:

L r ( p , ω r ) = ∫ H 2 f r ( p , ω i → ω r ) L i ( p , ω i ) cos ⁡ θ i d ω i L_r(p,\omega_r)=\int_{H^2}f_r(p,\omega_i→\omega_r)L_i(p,\omega_i)\cos\theta_id\omega_i Lr(p,ωr)=H2fr(p,ωiωr)Li(p,ωi)cosθidωi

通过添加一个Emission term(自发光项)使其通用!(考虑到自发光的物体或是接受到其它光线的入射光)

L o ( p , ω o ) = L e ( p , ω o ) + ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i L_o(p,\omega_o)=L_e(p,\omega_o)+\int_{\Omega+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)d\omega_i Lo(p,ωo)=Le(p,ωo)+Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωi

注,假设所有方向都是朝外的!

7.8.7.6 理解渲染方程
  1. 反射方程
  • 一个点光源

在这里插入图片描述

  • L r ( x , ω r ) = L e ( x , ω r ) + L i ( x , ω i ) f ( x , ω i , ω r ) ( ω i , n ) L_r(x,\omega_r)=L_e(x,\omega_r)+L_i(x,\omega_i)f(x,\omega_i,\omega_r)(\omega_i,n) Lr(x,ωr)=Le(x,ωr)+Li(x,ωi)f(x,ωi,ωr)(ωi,n)

    • L r ( x , ω r ) L_r(x,\omega_r) Lr(x,ωr):反射光(输出图像)
    • L e ( x , ω r ) L_e(x,\omega_r) Le(x,ωr):自发光的物体或是接受到其它光线的入射光
    • L i ( x , ω i ) L_i(x,\omega_i) Li(x,ωi):入射光(来自光源)
    • f ( x , ω i , ω r ) f(x,\omega_i,\omega_r) f(x,ωi,ωr):BRDF
    • ( ω i , n ) (\omega_i,n) (ωi,n):入射角余弦值
  • 多个点光源

在这里插入图片描述
L r ( x , ω r ) = L e ( x , ω r ) + Σ L i ( x , ω i ) f ( x , ω i , ω r ) ( ω i , n ) L_r(x,\omega_r)=L_e(x,\omega_r)+\Sigma L_i(x,\omega_i)f(x,\omega_i,\omega_r)(\omega_i,n) Lr(x,ωr)=Le(x,ωr)+ΣLi(x,ωi)f(x,ωi,ωr)(ωi,n)

  • 多个点光源和一个面光源

在这里插入图片描述
L r ( x , ω r ) = L e ( x , ω r ) + ∫ Ω L i ( x , ω i ) f ( x , ω i , ω r ) cos ⁡ θ i d ω i L_r(x,\omega_r)=L_e(x,\omega_r)+\int_{\Omega}L_i(x,\omega_i)f(x,\omega_i,\omega_r)\cos\theta_id\omega_i Lr(x,ωr)=Le(x,ωr)+ΩLi(x,ωi)f(x,ωi,ωr)cosθidωi

  • 存在其它互反射的表面

在这里插入图片描述

  • L r ( X , ω r ) = L e ( X , ω r ) + ∫ Ω L r ( X ′ , − ω i ) f ( X , ω i , ω r ) cos ⁡ θ i d ω i L_r(X,\omega_r)=L_e(X,\omega_r)+\int_{\Omega}L_r(X^\prime,-\omega_i)f(X,\omega_i,\omega_r)\cos\theta_id\omega_i Lr(X,ωr)=Le(X,ωr)+ΩLr(X,ωi)f(X,ωi,ωr)cosθidωi

    • L r ( X , ω r ) L_r(X,\omega_r) Lr(X,ωr):未知
    • L e ( X , ω r ) L_e(X,\omega_r) Le(X,ωr):已知
    • ∫ Ω L r ( X ′ , − ω i ) \int_{\Omega}L_r(X^\prime,-\omega_i) ΩLr(X,ωi):未知
    • f ( X , ω i , ω r ) f(X,\omega_i,\omega_r) f(X,ωi,ωr):已知
    • cos ⁡ θ i d ω i \cos\theta_id\omega_i cosθidωi:已知

简化上式:

  • I ( u ) = e ( u ) + ∫ I ( v ) K ( u , v ) d v I(u)=e(u)+\int I(v)K(u,v)dv I(u)=e(u)+I(v)K(u,v)dv
    • K ( u , v ) d v K(u,v)dv K(u,v)dv:等式核心,光传输操作符
      再简化:
      L = E + K L L=E+KL L=E+KL
      可以离散化为简单的矩阵方程(或联立线性方程组)(L、E为向量,K为光传输矩阵)
7.8.7.7 光线追踪和扩展
  • 广义类数值蒙特卡罗方法
  • 场景中所有光路近似集

L = E + K L L=E+KL L=E+KL

L = E + K L I L − K L = E ( I − K ) L = E L = ( I − K ) − 1 E 二项式定理 L = ( I + K + K 2 + K 3 + … ) E L = E + K E + K 2 E + K 3 E + … \begin{aligned} L & =E+KL \\ IL-KL & = E \\ (I-K)L&=E\\ L&=(I-K)^{-1}E\\ &二项式定理\\ L&=(I+K+K^2+K^3+…)E\\ L&=E+KE+K^2E+K^3E+… \end{aligned} LILKL(IK)LLLL=E+KL=E=E=(IK)1E二项式定理=(I+K+K2+K3+)E=E+KE+K2E+K3E+
其中 I I I为单位矩阵 。

将上式各项分开理解(光的多次弹射):

在这里插入图片描述
另一种理解方式(光栅化的着色):

在这里插入图片描述

7.9 概率论

7.9.1 随机变量

随机变量 X X X 表示随机实验结果的可能数值。

概率分布函数 X ∼ p ( x ) X\sim p(x) Xp(x) 表示随机过程选择值 x x x 的相对概率。

例如,等概率分布函数,在取值范围内的所有值都具有相同的概率。

一个六面的骰子🎲, X X X的取值可能是1,2,3,4,5,6。

p ( 1 ) = p ( 2 ) = p ( 3 ) = p ( 4 ) = p ( 5 ) = p ( 6 ) = 1 6 p(1)=p(2)=p(3)=p(4)=p(5)=p(6)=\frac{1}{6} p(1)=p(2)=p(3)=p(4)=p(5)=p(6)=61

7.9.2 概率

x i x_i xi表示 n n n个离散值

p i p_i pi表示 x i x_i xi 出现的概率

在这里插入图片描述
概率分布的特点:

p i ≥ 0 p_i≥0 pi0

Σ i = 1 n p i = 1 \Sigma_{i=1}^np_i=1 Σi=1npi=1

对于等概率的六面骰子🎲,其每个面出现的概率是 p = 1 6 p=\frac{1}{6} p=61

7.9.3 随机变量的期望值

随机变量的期望值即从随机分布中反复抽取样本所得到的平均值。

x i x_i xi表示 n n n个离散值

p i p_i pi表示 x i x_i xi 出现的概率

在这里插入图片描述

随机变量 X X X的期望值:

E [ X ] = Σ i = 1 n x i p i E[X]=\Sigma_{i=1}^nx_ip_i E[X]=Σi=1nxipi

对于等概率的六面骰子🎲,其期望值是:

E [ X ] = Σ i = 1 n i 6 = ( 1 + 2 + 3 + 4 + 5 + 6 ) / 6 = 3.5 E[X]=\Sigma_{i=1}^n\frac{i}{6}=(1+2+3+4+5+6)/6=3.5 E[X]=Σi=1n6i=(1+2+3+4+5+6)/6=3.5

7.9.4 连续情况下的概率密度函数

X ∼ p ( x ) X\sim p(x) Xp(x)
在这里插入图片描述
对于一个随机变量 X X X,可以取一组连续值中的任意一个,其中一个特定值的相对概率由连续概率分布函数 p ( x ) p(x) p(x) 给出。

p ( x ) p(x) p(x)的条件: p ( x ) > 0 p(x)>0 p(x)>0 ∫ p ( x ) d x = 1 \int p(x)dx=1 p(x)dx=1

X X X 的期望值: E [ X ] = ∫ x p ( x ) d x E[X]=\int xp(x)dx E[X]=xp(x)dx

7.9.5 随机变量函数

随机变量 X X X 的函数 Y Y Y 也是随机变量

X ∼ p ( x ) X\sim p(x) Xp(x)

Y = f ( X ) Y=f(X) Y=f(X)

Y Y Y的期望值:

E [ Y ] = E [ f ( X ) ] = ∫ f ( x ) p ( x ) d x E[Y]=E[f(X)]=\int f(x)p(x)dx E[Y]=E[f(X)]=f(x)p(x)dx

7.10 蒙特卡洛积分Monte Carlo Integration

7.10.1 蒙特卡洛积分Monte Carlo Integration

在这里插入图片描述
W h y ? Why? Why我们想解一个积分,但是用分析的方法解它可能太难了

W h a t & H o w ? What\&How? What&How通过对函数值的随机样本取平均值来估计函数的积分

接下来定义给定函数 f ( x ) f(x) f(x) 的定积分的蒙特卡洛估计量:

定积分: ∫ a b f ( x ) d x \int_a^bf(x)dx abf(x)dx

随机变量: X i ∼ p ( x ) X_i\sim p(x) Xip(x)

蒙特卡洛估计量: F N = 1 N Σ i = 1 N f ( X i ) p ( X i ) F_N=\frac{1}{N}\Sigma_{i=1}^N\frac{f(X_i)}{p(X_i)} FN=N1Σi=1Np(Xi)f(Xi)

一些注意事项:

  • 样本越多,变化就越小。
  • 在x上采样,在x上积分。

7.10.2 例子:等值蒙特卡洛估计量

在这里插入图片描述

等值随机变量: X i ∼ p ( x ) = C ( c o n s t a n t ) X_i\sim p(x)=C(constant) Xip(x)=C(constant)

∫ a b p ( x ) d x = 1 \int_a^bp(x)dx=1 abp(x)dx=1

⇒ ∫ a b C d x = 1 ⇒\int_a^bCdx=1 abCdx=1

⇒ C = 1 b − a ⇒C=\frac{1}{b-a} C=ba1

接下来定义给定函数 f ( x ) f(x) f(x) 的定积分的蒙特卡洛估计量:

定积分: ∫ a b f ( x ) d x \int_a^bf(x)dx abf(x)dx

等值随机变量: X i ∼ p ( x ) = 1 b − a X_i\sim p(x)=\frac{1}{b-a} Xip(x)=ba1

基础蒙特卡洛估计量: F N = b − a N Σ i = 1 N f ( X i ) F_N=\frac{b-a}{N}\Sigma_{i=1}^Nf(X_i) FN=NbaΣi=1Nf(Xi)

7.11 路径追踪Path Tracing

用来改进Whitted-Style 光线追踪

7.11.1 Whitted-Style 光线追踪的问题1

对于有光泽的材料,光线应该反射到哪里?

在这里插入图片描述

7.11.2 Whitted-Style 光线追踪的问题2

漫反射材质之间没有反射?

在这里插入图片描述

7.11.3 Whitted-Style 光线追踪是错的

渲染方程才是正确的

L o ( p , ω o ) = L e ( p , ω o ) + ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i L_o(p,\omega_o)=L_e(p,\omega_o)+\int_{\Omega+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)d\omega_i Lo(p,ωo)=Le(p,ωo)+Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωi

但这牵涉到

  • 求解半球上的积分
  • 递归的式子

如何用数值方法解一个积分?

7.11.4 一个简单的蒙特卡洛解法

假设我们想在下面的场景中渲染一个像素(点),只需要求解该点的直接光照:

在这里插入图片描述
这里忽略物体的发光,即使用反射方程:

L o ( p , ω o ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i L_o(p,\omega_o)=\int_{\Omega+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)d\omega_i Lo(p,ωo)=Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωi

可以用蒙特卡洛积分来解决!

我们要计算 p p p点反射到相机的辐亮度(Radiance)

L o ( p , ω o ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i L_o(p,\omega_o)=\int_{\Omega+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)d\omega_i Lo(p,ωo)=Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωi

蒙特卡洛估计量: ∫ a b f ( x ) d x ≈ 1 N Σ k = 1 N f ( X k ) p ( X k )      X k ∼ p ( x ) \int_a^bf(x)dx≈\frac{1}{N}\Sigma_{k=1}^N\frac{f(X_k)}{p(X_k)}\ \ \ \ X_k\sim p(x) abf(x)dxN1Σk=1Np(Xk)f(Xk)    Xkp(x)

f ( x ) : L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) f(x):L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i) f(x):Li(p,ωi)fr(p,ωi,ωo)(nωi)

概率密度函数 ( P D F ) : p ( ω i ) = 1 / 2 π 概率密度函数(PDF):p(\omega_i)=1/2\pi 概率密度函数(PDF):p(ωi)=1/2π (假设均匀采样半球)

因此,可以得到:

$$

L o ( p , ω o ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i ≈ 1 N Σ i = 1 N L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) p ( ω i ) \begin{aligned} L_o(p,\omega_o)&=\int_{\Omega+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)d\omega_i\\ &≈\frac{1}{N}\Sigma_{i=1}^N\frac{L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n\cdot\omega_i)}{p(\omega_i)} \end{aligned} Lo(p,ωo)=Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωiN1Σi=1Np(ωi)Li(p,ωi)fr(p,ωi,ωo)(nωi)

这意味着,可以得到一个正确的直接光照着色算法!

在这里插入图片描述

7.11.5 全局光照Global lllumination

如果光线击中物体怎么办?
在这里插入图片描述
Q点 也反射光线到 P点!是多少?即 Q点 的直接光照!

得到支持全局光照的路径追踪算法:

在这里插入图片描述

7.11.6 路径追踪存在的问题1

在这里插入图片描述

随着 # b o u n c e \#bounce #bounce(反弹)次数的增加, # r a y \#ray #ray(光线)数量会爆炸:

# r a y s = N # b o u n c e \#rays=N^{\#bounce} #rays=N#bounce

关键点:当且仅当 N = ? ? ? N=??? N=???时, # r a y \#ray #ray(光线)数量不会爆炸

因此,从现在开始,我们总是假设在每个着色点只有1条光线被跟踪:

在这里插入图片描述
以上算法, N = 1 N=1 N=1,即路径追踪。

而,当 N ! = 1 N!=1 N!=1时,即分布式光线追踪。

7.11.7 光线生成

N = 1 N=1 N=1会造成噪声很大的问题!

但这没问题,只是通过每个像素追踪更多的路径(path),并平均他们的辐照度(Radiance)!

在这里插入图片描述

光线生成非常类似于光线跟踪中的光线投射:

在这里插入图片描述

7.11.8 路径追踪存在的问题2

这是一个递归的算法,没有终止条件,则会一直进行下去:

在这里插入图片描述

真实世界中,光线确实就是不停得弹射的!

限制光线弹射次数,则会造成能量损失:

Cutting # b o u n c e s \#bounces #bounces == cutting energy!

7.11.9 解决方法:俄罗斯轮盘赌ussian Roulette(RR)

俄罗斯轮盘赌的输赢全靠概率:

  • 如果概率为 0 < P < 1 0<P<1 0<P<1,你就没事
  • 否则概率为 1 − P 1-P 1P

左轮手枪里能装6枚子弹,如果在其中装入2枚子弹,那么你的存活概率就为 P = 4 / 6 P=4/6 P=4/6

以前,我们总是在一个着色点发射光线,并得到着色结果 L o \textbf{L}_\textbf{o} Lo

假设我们手动设置一个概率 P ( 0 < P < 1 ) P(0<P<1) P(0<P<1)

  • 在概率为 P P P 的情况下,发射一条光线,返回着色结果除以 P P P L o / P \textbf{L}_\textbf{o}/P Lo/P
  • 在概率为 1 − P 1-P 1P 的情况下,不发射光线,你会得到 0 0 0

这样做,你仍然能够期望得到 L o \textbf{L}_\textbf{o} Lo

E = P ∗ ( L o / P ) + ( 1 − P ) ∗ 0 = L o E=P*(\textbf{L}_\textbf{o}/P)+(1-P)*0=\textbf{L}_\textbf{o} E=P(Lo/P)+(1P)0=Lo

最终得到的路径追踪算法:

在这里插入图片描述

7.11.10 正确的路径追踪

现在,我们终于得到了一个正确的路径追踪!

但实际上,它的效率并不高。

在这里插入图片描述

7.11.11 光线采样

理解路径追踪效率不高的原因

在这里插入图片描述
总会有1束光线打在灯光上。因此,如果我们在着色点均匀地对半球进行采样就会浪费大量的光线。

7.11.12 光线采样(纯数学)

蒙特卡洛方法允许任意采样方式,因此我们可以对光线进行采样(因此没有光线被"浪费")。

在这里插入图片描述
假设在光线上均匀采样:

p d f = 1 / A pdf=1/A pdf=1/A(因为 ∫ p f d A = 1 \int pfdA=1 pfdA=1

但是渲染方程是在立体角上的积分:

L o = ∫ L i f r cos ⁡ d ω Lo=\int L_ifr \cos d\omega Lo=Lifrcosdω

回顾蒙特卡罗积分:

在x上采样,并在x上积分

因此,需要改写渲染方程成对 d A dA dA 的积分,而不是对 d ω d\omega dω的积分

需要 d ω d\omega dω d A dA dA 之间的关系

回顾:

立体角定义:单位球面上的投影面积

d ω = d A cos ⁡ θ ′ ∥ x ′ − x ∥ 2 d\omega=\frac{dA \cos\theta'}{\|x'-x\|^2} dω=xx2dAcosθ

接着,对渲染方程重写:

L o ( x , ω o ) = ∫ Ω + L i ( x , ω i ) f r ( x , ω i , ω o ) cos ⁡ θ d ω i = ∫ A L i ( x , ω i ) f r ( x , ω i , ω o ) cos ⁡ θ cos ⁡ θ ′ ∥ x ′ − x ∥ 2 d A \begin{aligned} L_o(x,\omega_o)& =\int_{\Omega^+}L_i(x,\omega_i)f_r(x,\omega_i,\omega_o)\cos\theta \mathrm{d}\omega_i \\ &=\int_{A}L_{i}(x,\omega_{i})f_{r}(x,\omega_{i},\omega_{o})\frac{\cos\theta\cos\theta^{\prime}}{\|x^{\prime}-x\|^{2}} \mathrm{d}A \end{aligned} Lo(x,ωo)=Ω+Li(x,ωi)fr(x,ωi,ωo)cosθdωi=ALi(x,ωi)fr(x,ωi,ωo)xx2cosθcosθdA

之前,我们假设光是通过均匀半球取样“意外”发射的。

现在我们考虑来自两个部分的radiance:

  1. 光源(直接贡献,不需要有RR)
  2. 其他非光源物体的反射(间接反射,RR)
    在这里插入图片描述
    最终算法如下:

在这里插入图片描述
最后一个问题:我们如何知道光上的采样点是否被遮挡?

在这里插入图片描述
在这里插入图片描述
路径追踪(Path tracing)是100%正确的,它可以做到照片级的真实感!

在这里插入图片描述

7.11.13 光线追踪:早期概念 vs. 现代概念
  • 从前
    光线跟踪(Ray tracing) == Whitted-style ray tracing
  • 现代
    • 所有光线传播的大集合,包括
      • (单向/双向)路径跟踪(Unidirectional & bidirectiona)path tracing
      • 光子映射(Photon mapping)
      • Metropolis光线传输( light transport)
      • VCM/UPBP
7.11.14 未提及的问题
  • 半球均匀采样
    • 怎么做?一般情况下,如何对任何函数进行采样?(采样理论)
  • 蒙特卡罗积分能够用在任意的 pdfs 上
    • 怎么样是最好的选择?(重要性采样理论)
  • 随机数是否有好坏之分?
    • 是的(低差异化序列)
  • 我可以采样半球和光线
    • 我能把它们结合起来吗?YES!(multiple imp. sampling)
  • 一个像素的radiance是通过它的所有路径上的radiance的平均值
    • 为什么(像素重建滤波器 pixel reconstruction filter)
  • 像素的radiance是像素的颜色吗?
    • 不是(需要经过伽马校正、曲线、颜色空间)

8 材质与外观

8.1 材质

8.1.1 自然界不同材质的外观

不同的材质在不同的光照下就会呈现出不同的外观。

在这里插入图片描述

8.1.2 什么是计算机图形学中的材质?

在这里插入图片描述

8.1.3 材质==BRDF

8.1.3.1 漫反射(Diffuse/Lambertian)材质(BRDF)

在这里插入图片描述

在这里插入图片描述
漫反射:光在每个出射方向上被均匀地反射

在这里插入图片描述

假设入射光也是均匀的(能量守恒):

L o ( ω o ) = ∫ H 2 f r L i ( ω i ) cos ⁡ θ i d ω i = f r L i ∫ H 2 ( ω i ) cos ⁡ θ i d ω i = π f r L i f r = ρ π \begin{aligned} &L_o(\omega_o)&& =\int_{H^2}f_rL_i(\omega_i)\cos\theta_i \mathrm{d}\omega_i \\ &&&=f_rL_i\int_{H^2}\sout{(\omega_i)}\cos\theta_i \mathrm{d}\omega_i \\ &&&=\pi f_rL_i \\ &f_r=\frac\rho\pi \end{aligned} Lo(ωo)fr=πρ=H2frLi(ωi)cosθidωi=frLiH2(ωi)cosθidωi=πfrLi

这就是完全不吸收能量的BRDF。

其中 ρ \rho ρ为反射率(albedo)color

8.1.3.2 抛光的金属(Glossy)材质(BRDF)

在这里插入图片描述
在这里插入图片描述

8.1.3.3 理想反射/折射(ldeal reflective / refractive)材质(BSDF*)

在这里插入图片描述
在这里插入图片描述

8.1.3.4 完美镜面反射(Perfect Specular Reflection)

在这里插入图片描述

在这里插入图片描述

ω o + ω i = 2 cos ⁡ θ n ⃗ = 2 ( ω i ⋅ n ⃗ ) n ⃗ ω o = − ω i + 2 ( ω i ⋅ n ⃗ ) n ⃗ \begin{aligned}&\omega_{o}+\omega_{i}=2\cos\theta \vec{\mathrm{n}}=2(\omega_{i}\cdot\vec{\mathrm{n}})\vec{\mathrm{n}}\\&\omega_{o}=-\omega_{i}+2(\omega_{i}\cdot\vec{\mathrm{n}})\vec{\mathrm{n}}\end{aligned} ωo+ωi=2cosθn =2(ωin )n ωo=ωi+2(ωin )n

8.1.3.5 完美镜面反射BRDF

在这里插入图片描述

8.1.3.6 完美折射Specular Refraction

除了从表面反射之外,光还可以透过表面。

光进入新的介质时会发生折射。

在这里插入图片描述
在这里插入图片描述

8.1.3.7 斯奈尔定律Snell’s Law

透射角取决于
  • 入射光线的折射率(IOR)
  • 出射光线的折射率(IOR)

在这里插入图片描述
η i sin ⁡ θ i = η t sin ⁡ θ t \eta_i\sin\theta_i=\eta_t\sin\theta_t ηisinθi=ηtsinθt

折射率 η ∗ \eta^* η
在这里插入图片描述

8.1.3.8 折射定律Law of Refraction

在这里插入图片描述
η i sin ⁡ θ i = η t sin ⁡ θ t cos ⁡ θ t = 1 − sin ⁡ 2 θ t = 1 − ( η i η t ) 2 sin ⁡ 2 θ i = 1 − ( η i η t ) 2 ( 1 − cos ⁡ 2 θ i ) \begin{aligned} \eta_i\sin\theta_i& =\eta_t\sin\theta_t \\ \cos\theta_t& =\sqrt{1-\sin^2\theta_t} \\ &=\sqrt{1-\left(\frac{\eta_i}{\eta_t}\right)^2\sin^2\theta_i} \\ &=\sqrt{1-\left(\frac{\eta_i}{\eta_t}\right)^2(1-\cos^2\theta_i)} \end{aligned} ηisinθicosθt=ηtsinθt=1sin2θt =1(ηtηi)2sin2θi =1(ηtηi)2(1cos2θi)

存在 1 − ( η i η t ) 2 ( 1 − cos ⁡ 2 θ i ) < 0 1-\left(\frac{\eta_i}{\eta_t}\right)^2(1-\cos^2\theta_i)<0 1(ηtηi)2(1cos2θi)<0的情况

全反射Total internal reflection:

当光从光学密度较高的介质向光学密度较低的介质移动时:

η i η t > 1 \frac{\eta_i}{\eta_t}>1 ηtηi>1

从足够大的角度入射到边界上的光线不会离开介质(没有折射的情况)

8.1.3.9 斯奈尔之窗Snell’s Window /Circle

在这里插入图片描述

8.1.3.10 菲涅尔项Fresnel Reflection /Term

反射率取决于入射角(和光的偏振)

在这里插入图片描述
本例:反射率随掠射角(grazing angle)的增加而增加

(掠射角(grazing angle):光线几乎是平着打到表面上)

菲涅耳项(电介质, η \eta η = 1.5)

在这里插入图片描述
菲涅尔项(导体)
在这里插入图片描述
菲涅尔项——公式

精确计算,需要考虑光的极化

R s = ∣ n 1 cos ⁡ θ 1 − n 2 cos ⁡ θ t n 1 cos ⁡ θ 1 + n 2 cos ⁡ θ t ∣ 2 = ∣ n 1 cos ⁡ θ i − n 2 1 − ( n 1 n 2 sin ⁡ θ i ) 2 n 1 cos ⁡ θ i + n 2 1 − ( n 1 n 2 sin ⁡ θ i ) 2 ∣ 2 , R p = ∣ n 1 cos ⁡ θ t − n 2 cos ⁡ θ i n 1 cos ⁡ θ t + n 2 cos ⁡ θ i ∣ 2 = ∣ n 1 1 − ( n 1 n 2 sin ⁡ θ i ) 2 − n 2 cos ⁡ θ i n 1 1 − ( n 1 n 2 sin ⁡ θ i ) 2 + n 2 cos ⁡ θ i ∣ 2 . R_{\mathrm{s}}=\left|\frac{n_1\cos\theta_1-n_2\cos\theta_\mathrm{t}}{n_1\cos\theta_1+n_2\cos\theta_\mathrm{t}}\right|^2=\left|\frac{n_1\cos\theta_\mathrm{i}-n_2\sqrt{1-\left(\frac{n_1}{n_2}\sin\theta_\mathrm{i}\right)^2}}{n_1\cos\theta_\mathrm{i}+n_2\sqrt{1-\left(\frac{n_1}{n_2}\sin\theta_\mathrm{i}\right)^2}}\right|^2,\\R_{\mathrm{p}}=\left|\frac{n_1\cos\theta_\mathrm{t}-n_2\cos\theta_\mathrm{i}}{n_1\cos\theta_\mathrm{t}+n_2\cos\theta_\mathrm{i}}\right|^2=\left|\frac{n_1\sqrt{1-\left(\frac{n_1}{n_2}\sin\theta_\mathrm{i}\right)^2}-n_2\cos\theta_\mathrm{i}}{n_1\sqrt{1-\left(\frac{n_1}{n_2}\sin\theta_\mathrm{i}\right)^2}+n_2\cos\theta_\mathrm{i}}\right|^2. Rs= n1cosθ1+n2cosθtn1cosθ1n2cosθt 2= n1cosθi+n21(n2n1sinθi)2 n1cosθin21(n2n1sinθi)2 2,Rp= n1cosθt+n2cosθin1cosθtn2cosθi 2= n11(n2n1sinθi)2 +n2cosθin11(n2n1sinθi)2 n2cosθi 2.

R e f f = 1 2 ( R s + R p ) R_{\mathrm{eff}}=\frac12\left(R_{\mathrm{s}}+R_{\mathrm{p}}\right) Reff=21(Rs+Rp)

近似计算:史利克近似Schlick’s approximation

R ( θ ) = R 0 + ( 1 − R 0 ) ( 1 − cos ⁡ θ ) 5 R 0 = ( n 1 − n 2 n 1 + n 2 ) 2 \begin{aligned}R(\theta)&=R_0+(1-R_0)(1-\cos\theta)^5\\R_0&=\left(\frac{n_1-n_2}{n_1+n_2}\right)^2\end{aligned} R(θ)R0=R0+(1R0)(1cosθ)5=(n1+n2n1n2)2

8.1.4 微表面材质Microfacet Material

在这里插入图片描述

8.1.4.1 微表面理论Microfacet Theory

在这里插入图片描述

  • 观察一个粗糙的表面

    • 宏观尺度:表面平坦 & 材质粗糙(材质&外观)
    • 微观尺度:表面凹凸 & 材质镜像(几何)
  • 表面的单个元素就像镜子一样

    • 被称为微表面
    • 每个微表面都有自己的朝向(法线)
8.1.4.2 微表面(Microfacet)材质(BRDF)
  • 关键:微表面的法线分布
    • 表面光滑,所有微平面的朝向都可看为是朝上的,可转换为抛光的金属(glossy)材质
      在这里插入图片描述
      在这里插入图片描述
    • 表面粗糙,所有微平面的朝向四散而开,可转换为漫反射(diffuse)材质
      在这里插入图片描述
      在这里插入图片描述

因此,通过微表面模型,可以把表面的粗糙程度用微表面的法线分布来表示。

  • 什么样的微表面将 w i w_i wi 反射到 w o w_o wo?(提示:所有微表面都是镜子)
    在这里插入图片描述
8.1.4.3 微表面材质例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
PBR中一定会使用到微表面模型

8.1.5 各向同性/各向异性(Isotropic/Anisotropic)材质(BRDFs)

在这里插入图片描述

  • 关键:微表面的方向性
    • 各项同性:微表面不存在一定的方向/方向性很弱
      在这里插入图片描述

    • 各向异性:微表面存在明确的方向性在这里插入图片描述

8.1.5.1 各向异性BRDFs

反射取决于方位角 ϕ \phi ϕ

f r ( θ i , ϕ i ; θ r , ϕ r ) ≠ f r ( θ i , θ r , ϕ r − ϕ i ) f_r(\theta_i,\phi_i;\theta_r,\phi_r)\neq f_r(\theta_i,\theta_r,\phi_r-\phi_i) fr(θi,ϕi;θr,ϕr)=fr(θi,θr,ϕrϕi)

微表面定向的结果,例如,刷亮的金属(brushed metal)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.1.5.2 各向异性材质:刷亮的金属

在这里插入图片描述

8.1.5.3 各向异性材质:尼龙

在这里插入图片描述

8.1.5.4 各向异性材质:天鹅绒

在这里插入图片描述

8.1.6 材质(BRDF)的性质

  • 非负
    f r ( ω i → ω r ) ≥ 0 f_r(\omega_i\to\omega_r)\geq0 fr(ωiωr)0
  • 线性
    L r ( p , ω r ) = ∫ H 2 f r ( p , ω i → ω r ) L i ( p , ω i ) cos ⁡ θ i d ω i L_r(\mathrm{p},\omega_r)=\int_{H^2}f_r(\mathrm{p},\omega_i\to\omega_r) L_i(\mathrm{p},\omega_i) \cos\theta_i \mathrm{d}\omega_i Lr(p,ωr)=H2fr(p,ωiωr)Li(p,ωi)cosθidωi
    在这里插入图片描述
  • 可逆
    f r ( ω r → ω i ) = f r ( ω i → ω r ) f_r(\omega_r\to\omega_i)=f_r(\omega_i\to\omega_r) fr(ωrωi)=fr(ωiωr)
    在这里插入图片描述
  • 能量守恒
    ∀ ω r ∫ H 2 f r ( ω i → ω r ) cos ⁡ θ i d ω i ≤ 1 \forall\omega_r\int_{H^2}f_r(\omega_i\to\omega_r) \cos\theta_i \mathrm{d}\omega_i\leq1 ωrH2fr(ωiωr)cosθidωi1
  • 各向同性 vs. 各向异性
    • 如果是各项同性,则 f r ( θ i , ϕ i ; θ r , ϕ r ) = f r ( θ i , θ r , ϕ r − ϕ i ) f_r(\theta_i,\phi_i;\theta_r,\phi_r)=f_r(\theta_i,\theta_r,\phi_r-\phi_i) fr(θi,ϕi;θr,ϕr)=fr(θi,θr,ϕrϕi)
    • 接着根据可逆性, f r ( θ i , θ r , ϕ r − ϕ i ) = f r ( θ r , θ i , ϕ i − ϕ r ) = f r ( θ i , θ r , ∣ ϕ r − ϕ i ∣ ) f_r(\theta_i,\theta_r,\phi_r-\phi_i)=f_r(\theta_r,\theta_i,\phi_i-\phi_r)=f_r(\theta_i,\theta_r,|\phi_r-\phi_i|) fr(θi,θr,ϕrϕi)=fr(θr,θi,ϕiϕr)=fr(θi,θr,ϕrϕi)
      在这里插入图片描述

8.2 测量BRDFs

8.2.1 动机

  • 避免需要开发/派生模型
    • 自动包含所有呈现的散射效果
  • 可以精确渲染真实世界的材质
    • 对产品设计、特效很有用

在这里插入图片描述

8.2.2 基于图像的BRDF测量

在这里插入图片描述

8.2.3 使用gonioreflectometer测量BRDFs

在这里插入图片描述
通用的方法:

在这里插入图片描述
提高效率:

  • 各向同性表面将维度从四维降低到三维
  • 可逆性使测量次数减少了一半
  • 巧妙的光学系统……

8.2.4 BRDFs测量的挑战

  • 在掠射角的精确测量,对于菲涅尔项很重要
  • 用足够密集的采样来测量,以捕获高频镜面反射
  • 逆反射
  • 空间变化的反射率……

8.2.5 测量后BRDFs的表示

存储要求:

  • 紧凑的表现形式
  • 测量数据的精确表示
  • 任意出射入射方向的有效评估
  • 适用于重要性抽样的良好分布

8.2.6 表格表示法

将有规则间隔的样本存储在 ( θ i , θ o , ∣ ϕ i − ϕ o ∣ ) (\theta_i,\theta_o,|\phi_i-\phi_o|) (θi,θo,ϕiϕo)

重新参数化角度以更好地匹配镜面反射

通常需要将测量值重新采样到表格中

非常高的存储要求

在这里插入图片描述

8.3 高级的光线传播

  • 无偏的光线传播方式 Unbiased light transport methods

    • 双向路径追踪 Bidirectional path tracing (BDPT)
    • Metropolis light transport (MLT)
  • 有偏的光线传播方式 Biased light transport methods

    • Photon mapping
    • Vertex connection and merging (VCM)
  • 实时辐射度算法(Instant radiosity) (VPL/ many light methods)

8.3.1 有偏的 vs. 无偏的蒙特卡洛估计

  • 无偏的蒙特卡罗估计没有任何系统误差

    • 无偏估计量的期望值将永远是正确的值,无论使用多少样本
  • 否则,都是有偏的

    • 在一种特殊情况下,由于使用了无限个样本,期望值收敛到正确值——一致的

8.3.2 双向路径追踪 Bidirectional path tracing (BDPT)

  • 回顾:一条连接相机和光线的路径
  • BDPT
    • 跟踪来自摄像机和光源的子路径
    • 连接两个子路径的端点
      在这里插入图片描述
  • 如果光传输在光一侧很复杂,则适合
  • 难以实现且相当缓慢
    在这里插入图片描述

8.3.3 Metropolis光线传输 Metropolis light transport (MLT)

  • 马尔可夫链的蒙特卡罗方法(MCMC)应用
    • 通过PDF根据当前样本生成下一个样本
    • 非常擅长在局部难以探索的光路
    • 关键点
      • 对现有路径进行局部扰动以获得新路径
        在这里插入图片描述
  • 优势
    • 适用于复杂的光路传播
    • 也是无偏的
      在这里插入图片描述
  • 劣势
    • 收敛速度难以估计
    • 不能保证每个像素的收敛速度相等
    • 所以,通常会产生“脏”的结果
    • 因此,通常不用于渲染动画
      在这里插入图片描述

8.3.4 光子映射 Photon Mapping

  • 有偏的方法 & 两阶段方法

  • 非常擅长处理镜面-漫反射-镜面(SDS)路径和生成caustics
    在这里插入图片描述
    其中一种实现方法:

  • 第一阶段——光子追踪

    • 从光源发射光子,使其弹来弹去,接着在漫射表面记录光子
      在这里插入图片描述
  • 第二阶段——光子收集(最终收集)

    • 从相机发射子路径,使它们来回跳动,直到它们碰到漫反射表面
  • 计算——局部密度估计(local density estimation)

    • 想法:有更多光子的区域应该更亮
    • 对于每个着色点,找其最近的 N N N个光子,接着找到它们覆盖的面积
      在这里插入图片描述
  • 为什么光子映射是一个有偏的方法?

  • 局部密度估计(local density estimation)
    d N / d A   ! =   Δ N / Δ A dN/dA\ ! =\ \Delta N/\Delta A dN/dA != ΔNA

  • 但在有限的意义上

    • 发射更多的光子→
    • 相同数量的 N N N 个光子覆盖一个较小的 Δ A \Delta A ΔA
    • Δ A \Delta A ΔA更接近 d A dA dA
  • 因此,有偏但一致!
    在这里插入图片描述

  • 在渲染中更容易理解的有偏

    • 有偏 == 模糊
    • 一致 == 样本足够多就能达到不模糊的效果
  • 为什么不做一个“固定范围”的密度估计?

    • 因为随着光子发射的越多,同一个范围内的光子会越来越多, Δ A \Delta A ΔA永远不会更接近 d A dA dA

8.3.5 Vertex connection and merging (VCM)

  • BDPT与光子映射的结合
  • 关键思想
    • 如果BDPT中的子路径不能连接,但可以合并,那么就不要浪费它们
    • 利用光子映射处理附近"光子"的合并
      在这里插入图片描述

8.3.6 实时辐射度算法 Instant Radiosity(IR)

  • 有时也被称为多光源方法(many-light approaches)
  • 关键思想
    • 已被照亮的表面可被当作是光源,再来照亮其它物体
  • 方法
    • 从光源发射许多光的子路径,并假设每个子路径的端点(停在的地方)是虚拟点光源(Virtual Point Light,VPL)
    • 像往常一样使用这些 VPL 渲染场景
      在这里插入图片描述
  • 优势:速度快,在漫反射场景中通常能得到很好的效果
  • 劣势
    • 当 VPL 接近着色点时会出现奇怪的亮点
    • 不能处理有光泽的材质(glossy materials)
      在这里插入图片描述

8.4 高级的外观建模

  • 非表面模型
    • 散射介质
    • 毛发/毛皮/纤维(BCSDF)
    • 粒状材质
  • 表面模型
    • 半透明材质(BSSRDF)
    • 布料
    • 有细节的材质(non-statistical BRDF)
  • 程序化生成的模型

8.4.1 非表面模型 Non-Surface Models

8.4.1.1 散射介质 Participating Media

雾 Fog
在这里插入图片描述
云 Cloud
在这里插入图片描述

  • 在光通过散射介质的任何一点上,它都可能(部分)被吸收和散射。
    在这里插入图片描述
  • 使用相位函数(Phase Function)来描述散射介质中的任意点x的光散射角分布。
    在这里插入图片描述
    渲染:
  • 随机选择一个弹射的方向
  • 随机选择一段直线距离
  • 在每个着色点上,连接到光源
    在这里插入图片描述
    应用:
    在这里插入图片描述
    在这里插入图片描述
8.4.1.2 毛发表现

在这里插入图片描述

8.4.1.2.1 Kajiya-Kay模型

在这里插入图片描述
在这里插入图片描述

8.4.1.2.2 Marschner模型

在这里插入图片描述

  • 将头发看作是类玻璃状圆柱体
    在这里插入图片描述
  • 3种类型的光相互作用:R, TT, TRT(R:反射,T:透射)
    在这里插入图片描述
    在这里插入图片描述
8.4.1.3 动物毛皮表现
8.4.1.3.1 视作人的头发

不能代表扩散和饱和的外观
在这里插入图片描述

8.4.1.3.2 人类头发 vs. 动物毛发

在这里插入图片描述

在这里插入图片描述

8.4.1.3.3 髓质的重要性

随着髓质大小的增加:
在这里插入图片描述
在这里插入图片描述

8.4.1.3.3 双层圆柱模型 Double Cylinder Model

Marschner模型:
在这里插入图片描述
Double Cylinder Model:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.4.1.4 粒状材质 Granular Material
  • 什么是粒状材质?
    在这里插入图片描述
  • 我们能避免所有颗粒的显式建模吗?
    • 是的,有程序定义
      在这里插入图片描述

8.4.2 表面模型 Surface Models

8.4.2.1 半透明材质 Translucent Material

玉石
yu'sh
水母
在这里插入图片描述

8.4.2.1.1 次表面散射 Subsurface Scattering

由于光在不同的点出射而引起的许多表面的视觉特性

  • 违反了BRDF的一个基本假设
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • BSSRDF:BRDF的延伸,由于在另一点上的入射差分辐亮度而在一点上产生的附加辐亮度:
    S ( x i , ω i , x o , ω o ) S(x_i,\omega_i,x_o,\omega_o) S(xi,ωi,xo,ωo)
  • 渲染方程的延伸:对曲面上的所有点和所有方向进行积分(!)
    L ( x o , ω o ) = ∫ A ∫ H 2 S ( x i , ω i , x o , ω o ) L i ( x i , ω i ) cos ⁡ θ i d ω i d A L(x_o,\omega_o)=\int_A\int_{H^2}S(x_i,\omega_i,x_o,\omega_o) L_i(x_i,\omega_i)\cos\theta_i \mathrm{d}\omega_i \mathrm{d}A L(xo,ωo)=AH2S(xi,ωi,xo,ωo)Li(xi,ωi)cosθidωidA

在这里插入图片描述

8.4.2.1.2 两极近似 Dipole Approximation
  • 通过引入两个点光源来近似光的漫反射

在这里插入图片描述

8.4.2.1.3 BRDF vs. BSSRDF

在这里插入图片描述

8.4.2.1.4 BSSRDF的应用

在这里插入图片描述

8.4.2.2 布料 Cloth
  • 一系列缠绕的纤维!

  • 两级的缠绕
    在这里插入图片描述

  • 机织或针织
    在这里插入图片描述

8.4.2.2.1 布料:渲染成表面
  • 给定编织模式,计算整体行为
  • 使用BRDF渲染
    在这里插入图片描述
    在这里插入图片描述
8.4.2.2.2 布料:渲染成表面——局限性

在这里插入图片描述

8.4.2.2.3 布料:渲染成散射介质

在这里插入图片描述

  • 单根纤维的特性及其分布 → 散射参数
  • 呈现为散射介质
8.4.2.2.4 布料:渲染成实际纤维
  • 显式渲染每一根纤维!
    在这里插入图片描述
8.4.2.3 有细节的材质 Detaiied Appearance
  • 看起来并不真实,为什么?
    • 过于完美
      在这里插入图片描述
  • 真实世界更加复杂多变
    在这里插入图片描述
  • 细节感带来真实感
8.4.2.3.1 综述:微表面材质 Microfacet BRDF

在这里插入图片描述
S u r f a c e = S p e c u l a r   m i c r o f a c e t s + s t a t i s t i c a l   n o r m a l s Surface=Specular\ microfacets + statistical\ normals Surface=Specular microfacets+statistical normals
在这里插入图片描述

8.4.2.3.2 统计NDF vs. 实际NDF

在这里插入图片描述

8.4.2.3.3 细节定义

在这里插入图片描述

8.4.2.3.3 不同的细节

在这里插入图片描述

8.4.2.3.4 渲染?太难了!

在这里插入图片描述

8.4.2.3.5 路径采样困难问题

在这里插入图片描述

8.4.2.3.6 解决方案:像素上的BRDF

在这里插入图片描述

8.4.2.3.7 p-NDFs具有明显的特征

在这里插入图片描述

8.4.2.3.8 p-NDFs的形状

在这里插入图片描述

8.4.2.3.9 应用

在这里插入图片描述

8.4.2.3.10 近期趋势:波动光学

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.4.2.3.11 波动光学下的细节材质

在这里插入图片描述

8.4.2.4 程序化生成的模型 Procedural Appearance
  • 我们可以定义没有纹理的细节吗?
    • 是的!动态计算噪声函数
      在这里插入图片描述
      在这里插入图片描述
    • 3D噪音→内部结构(如果被切割或损坏)
      在这里插入图片描述
    • 阈值化(噪声→二进制噪声)
      在这里插入图片描述

在这里插入图片描述

  • 复杂的噪声函数可以非常强大
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

9 相机、镜头和光场

在这里插入图片描述
成像=合成+捕获

9.1 相机

9.1.1 相机里发生了什么?

在这里插入图片描述

9.1.1.1 针孔和透镜在传感器上形成图像

在这里插入图片描述

9.1.1.2 快门曝光传感器,实现精确的耐用度

在这里插入图片描述

9.1.1.3 传感器在曝光期间累积辐照度

在这里插入图片描述

9.1.1.4 为什么不是没有透镜的传感器?

每个传感器点将集成来自物体上所有点的光,因此所有像素值将是相似的,即传感器记录辐照度。

在这里插入图片描述
但有计算成像的研究正在进行…

9.2 针孔相机成像原理

9.2.1 针孔相机

在这里插入图片描述

9.2.2 最大针孔照片

在这里插入图片描述

在这里插入图片描述

9.3 视场 Field of View (FOV)

9.3.1 焦距(Focal Length)对视场(FOV)的影响

在这里插入图片描述
对于一个固定的传感器尺寸,减少焦距而增大视场。

F O V = 2 arctan ⁡ ( h 2 f ) \mathrm{FOV}=2\arctan\left(\frac{h}{2f}\right) FOV=2arctan(2fh)

9.3.2 焦距(Focal Length) vs. 视场(FOV)

在这里插入图片描述

  • 由于历史原因,通常用 35mm格式的胶片(36x24mm)上使用的镜头的焦距来表示视场角。
  • 35mm格式的焦距示例:
    • 17mm是广角镜头104°
    • 50mm是"正常"镜头47°
    • 200mm是长焦镜头12°
  • 注意!当我们说当前的手机大约有28毫米“等效”焦距时,这是使用了上述惯例
    在这里插入图片描述

9.3.3 传感器尺寸对视场的影响

在这里插入图片描述
在这里插入图片描述

9.3.4 传感器尺寸

在这里插入图片描述

9.3.5 在较小的传感器上保持视场

为保持视场,应按传感器的宽度/高度比例减小镜头焦距
在这里插入图片描述

9.4 曝光 Exposure

9.4.1 曝光是什么

  • H = T × E H =T\times E H=T×E
  • 曝光 = 时间 × 辐照度 曝光=时间\times 辐照度 曝光=时间×辐照度
  • 曝光时间(T)
    • 由快门控制
  • 辐照度(E)
    • 落在传感器单位面积上的光能量
    • 由镜头光圈和焦距控制

9.4.2 摄影中的曝光控制

  • 光圈大小
    • 通过打开/关闭光圈来更改光圈(如果相机有光圈控制)
  • 快门速度
    • 更改传感器像素集成光的持续时间
  • ISO增益(感光度)
    • 更改传感器值和数字图像信号之间的放大(模拟 and/or 数字)

9.4.3 曝光:光圈,快门,增益(ISO)

在这里插入图片描述

9.4.3.1 ISO(增益)

曝光的第三个变量

胶片:以纹理灵敏度换取
数码:以噪声灵敏度换取

  • 模数转换前的乘法信号
  • 线性效果(ISO 200需要的光是ISO 100的一半)
9.4.3.2 佳能T2i中的ISO增益 vs 噪声

在这里插入图片描述

9.4.3.3 F-数(F-Stop):曝光水平

写作 F N FN FN F / N F/N F/N N N N f f f-数。

非正式的理解:光圈圆形孔径的直径分之一

N N N越大,直径越小。

在这里插入图片描述

9.4.3.4 物理快门(1/25秒曝光)

在这里插入图片描述

9.4.3.5 快门速度的副作用

运动模糊:握手、主体移动

双倍快门时间加倍运动模糊
在这里插入图片描述
注意:动态模糊不总是不好的!
提示:考虑抗锯齿
在这里插入图片描述
滚动快门:在不同时间拍摄的照片的不同部分,会造成扭曲(螺旋桨)
在这里插入图片描述

9.4.3.6 恒定曝光:F-stop vs. 快门速度

例如:这些光圈和快门速度的组合提供相等的曝光。

在这里插入图片描述
如果曝光太亮/太暗,可能需要调整光圈 and/or 快门向上/向下。

  • 摄影师必须在景深和动态模糊之间进行权衡,以适应移动的拍摄对象

9.4.4 高速与低速摄影

9.4.4.1 高速摄影

正常曝光 = 极快快门速度×(大光圈 and/or 高ISO)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.4.4.2 长曝光摄影

又称“延时摄影”,拉丝。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.5 薄透镜近似

9.5.1 真实镜头设计高度复杂

在这里插入图片描述

9.5.2 真正的透镜元件并不理想-像差

在这里插入图片描述
真正的平凸透镜(球面形状)。透镜不会把光线汇聚到任何地方。

9.5.3 理想薄透镜-焦点

在这里插入图片描述

  1. 所有进入透镜的平行光线都要经过它的焦点。
  2. 通过焦点的所有射线在经过透镜后将平行。
  3. 焦距可以任意改变(在现实中,是的!)。

9.5.4 薄透镜方程

在这里插入图片描述
1 f = 1 z i + 1 z o \frac1f=\frac1{z_i}+\frac1{z_o} f1=zi1+zo1

  • z o z_o zo:物距
  • z i z_i zi:像距
  • f f f:焦距

从任一方向穿过透镜中心的光线,其方向都不会发生改变。

9.5.5 高斯射线图

在这里插入图片描述

9.5.6 高斯射线追踪结构

在这里插入图片描述

共轭深度 z o z_o zo z i z_i zi之间的关系是什么?

在这里插入图片描述
在这里插入图片描述

9.6 景深模糊 Defocus Blur

9.6.1 计算混沌环(CoC)尺寸

在这里插入图片描述

C A = d ′ z i = ∣ z s − z i ∣ z i \frac CA=\frac{d^{\prime}}{z_i}=\frac{|z_s-z_i|}{z_i} AC=zid=zizszi

CoC与透镜光圈大小成正比

9.6.2 CoC vs. 透镜光圈大小

在这里插入图片描述
左侧:大光圈,模糊效果
右侧:小光圈,清晰效果

9.6.3 再看F-数(又称F-Stop)

形式定义:镜头f-数的定义为焦距除以光圈的直径。

真实镜头上常见的f-数:1.4,2,2.8,4.0,5.6,8,11,16,22,32。

2的f-stop有时写成f/2,反映了绝对孔径(A)可以通过将焦距(f)除以相对孔径(N)来计算。

9.6.4 F-Stop计算示例

在这里插入图片描述

9.6.5 CoC的大小与F-Stop成反比

在这里插入图片描述
C = A ∣ z s − z i ∣ z i = f N ∣ z s − z i ∣ z i C=A\frac{|z_s-z_i|}{z_i}=\frac fN\frac{|z_s-z_i|}{z_i} C=Azizszi=Nfzizszi

9.7 薄透镜光线追踪

9.7.1 用镜头聚焦的静物片示例

在这里插入图片描述

9.7.2 景深模糊的光线跟踪(薄透镜)

在这里插入图片描述
(一个可能的)步骤:

  • 选择传感器尺寸、镜头焦距和光圈尺寸
  • 选择感兴趣物体的深度 z o z_o zo
  • 根据薄透镜方程(聚焦)计算相应的传感器深度 z i z_i zi

渲染:

  • 对于传感器上的每个像素 x ′ x^\prime x(实际上是胶片)
  • 取透镜平面上的随机点 x ′ ′ x^{\prime\prime} x′′
  • 你知道穿过透镜的光线会照射到 x ′ ′ ′ x^{\prime\prime\prime} x′′′(使用薄透镜公式)
  • 估计从 x ′ ′ x^{\prime\prime} x′′ x ′ ′ ′ x^{\prime\prime\prime} x′′′的辐亮度(radiance)

9.8 景深 Depth of Field

在这里插入图片描述
将CoC设置为图像平面上允许的最大模糊点,该点在最终观看条件下会显得很尖锐

9.8.1 Depth of Field的CoC

在这里插入图片描述
例如,在场景中,相应的CoC被认为足够小的深度范围

9.8.2 Depth of Field

在这里插入图片描述
d N − d S d N = C A d S − d F d F = C A N = f A 1 D F + 1 d F = 1 f 1 D S + 1 d S = 1 f 1 D N + 1 d N = 1 f \begin{aligned}\frac{d_N-d_S}{d_N}&=\frac CA\\\frac{d_S-d_F}{d_F}&=\frac CA\\N&=\frac fA\\\frac1{D_{F}}+\frac1{d_{F}} &=\frac{1}{f} \\\frac1{D_{S}}+\frac1{d_{S}} &=\frac{1}{f}\\\frac1{D_N}+\frac1{d_N} &=\frac{1}{f} \end{aligned} dNdNdSdFdSdFNDF1+dF1DS1+dS1DN1+dN1=AC=AC=Af=f1=f1=f1
D O F = D F − D N \mathrm{DOF}=D_F-D_N DOF=DFDN
D F = D S f 2 f 2 − N C ( D S − f ) D N = D S f 2 f 2 + N C ( D S − f ) D_F=\frac{D_Sf^2}{f^2-NC(D_S-f)}\quad D_N=\frac{D_Sf^2}{f^2+NC(D_S-f)} DF=f2NC(DSf)DSf2DN=f2+NC(DSf)DSf2

9.9 光场/Lumigraph

9.9.1 我们看到了什么

在这里插入图片描述
在这里插入图片描述

9.9.2 全光函数 The Plenoptic Function

在这里插入图片描述
Q:我们所能看到的所有事物的集合是什么?

A:全光函数(Adelson & Bergen)

让我们从一个静止的人开始,试着把他能看到的一切都叙述出来……

9.9.3 灰度快照

在这里插入图片描述 P ( θ , ϕ ) P(\theta,\phi) P(θ,ϕ)

  • 是光的强度
    • 从单一角度看
    • 在同一时间
    • 在可见光谱波长上的平均值
      也作 P ( x , y ) P(x,y) P(x,y),但球坐标更好

9.9.4 彩色快照

在这里插入图片描述
P ( θ , ϕ , λ ) {P}(\theta,\phi,\lambda) P(θ,ϕ,λ)

  • 是光的强度
    • 从单一角度看
    • 在同一时间
    • 作为波长的函数

9.9.5 一部电影

在这里插入图片描述
P ( θ , ϕ , λ , t ) P(\theta,\phi,\lambda,t) P(θ,ϕ,λ,t)

  • 是光的强度
    • 从单一角度看
    • 随着时间的推移
    • 作为波长的函数

9.9.6 全息电影

在这里插入图片描述
P ( θ , ϕ , λ , t , V x , V y , V z ) P(\theta,\phi,\lambda,t,V_x,V_y,V_z) P(θ,ϕ,λ,t,Vx,Vy,Vz)

  • 是光的强度
    • 从任何角度看
    • 随着时间的推移
    • 作为波长的函数

9.9.7 全光函数

在这里插入图片描述
P ( θ , ϕ , λ , t , V x , V y , V z ) P(\theta,\phi,\lambda,t,V_x,V_y,V_z) P(θ,ϕ,λ,t,Vx,Vy,Vz)

  • 可以重建每一个可能的视图,在每一刻,从每一个位置,在每一个波长
  • 包含了每张照片,每部电影,任何人看过的一切!它完全捕捉到了我们的视觉现实!对一个函数来说还不错……

9.9.8 采样全光函数(俯视图)

在这里插入图片描述
只需查找即可—— Quicktime VR

9.9.9 光线

不要担心时间和颜色:

在这里插入图片描述

9.9.10 光线重定义

无限线
假设光是恒定的(真空)
在这里插入图片描述

9.9.11 只需要全光表面

在这里插入图片描述

9.9.12 综合新颖的视角

在这里插入图片描述

光场是一个四维的函数,能向我们提供任意观测方向所能看到的结果。

9.9.13 光场

外凸空间
在这里插入图片描述

9.9.14 光场——组织

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.9.15 斯坦福摄像机矩阵

在这里插入图片描述

9.9.16 全景图像(“苍蝇眼”镜头)

在这里插入图片描述
使用透镜的空间多路复用光场捕获:

  • 在空间分辨率和角度分辨率之间进行固定的权衡

9.10 光场照相机

9.10.1 Lytro光场照相机

Lytro:由伦(Ren Ng)教授(加州大学伯克利分校)创立的微透镜设计

最重要的功能

  • 计算重聚焦(实际改变焦距和光圈大小等,在拍完照片后)
    在这里插入图片描述

9.10.2 光场照相机

理解

  • 每个像素(辐照度irradiance)现在存储为一个像素块(辐亮度radiance)
  • 拍摄照片的特写镜头
    -
    在这里插入图片描述
    如何从光场照片中获得一张“普通”照片?
  • 一个简单的情况——始终选择每个块底部的像素
  • 然后是中央和顶部的
  • 本质上就是“移动摄像头的位置’

计算/数字重定向

  • 同样的想法:在视觉上改变焦距,相应地选择重新聚焦的光线方向
    在这里插入图片描述
    总而言之,所有这些功能都是可用的,因为
  • 光场包含了一切

光场摄像机有问题吗?

  • 空间分辨率不足(空间和方向信息均使用相同的胶片)
  • 高成本(微透镜的复杂设计)
  • 计算机图形学讲究权衡取舍

10 颜色感知

10.1 色彩的物理基础

10.1.1 光的基本组成

在这里插入图片描述

  • 牛顿证明用棱镜可以把阳光细分成彩虹
  • 产生的光不能用第二个棱镜进一步细分

10.1.2 光的可见光谱

电磁辐射

  • 不同频率(波长)的振荡

在这里插入图片描述

10.1.3 谱功率密度 Spectral Power Distribution (SPD)

测量光的显著性

  • 每种波长的光量
  • 单位:
    • 辐射计量单位/纳米(如瓦特/纳米)
    • 也可以是无单位的
  • 当绝对单位并不重要时,经常使用缩放到最大波长的“相对单位”来进行不同波长的比较

10.1.4 日光的谱功率密度各不相同

在这里插入图片描述

10.1.5 光源的谱功率密度

描述能量按波长分布

在这里插入图片描述

10.1.6 谱功率密度的线性性质

在这里插入图片描述

10.1.7 什么是颜色?

  • 颜色是人类感知的一种现象,它不是光的普遍属性
  • 不同波长的光不是“颜色

10.2 颜色的生物学基础

10.2.1 人眼的解剖学

在这里插入图片描述

10.2.2 视网膜感光细胞:视杆细胞和视锥细胞

在这里插入图片描述
视杆细胞是在非常暗的光线(“暗视”条件下)的主要受体,例如昏暗的月光。

  • 大约有1.2亿视杆细胞存在眼中
  • 只感知到灰色的阴影,没有颜色

视锥细胞是典型光照水平下的主要受体(“明视”)

  • 大约有600万至700万个视锥细胞
  • 三种锥体,每种锥体的光谱灵敏度不同
  • 提供色彩感觉

10.2.3 人类视锥细胞的光谱响应

三种类型的视锥细胞:S、M和L(对应于短、中、长波长的峰值响应)
在这里插入图片描述

10.2.4 三种视锥细胞类型的比例差异很大

在这里插入图片描述

12例正常色觉者黄斑中心凹边缘视锥细胞的分布。注意不同视锥细胞类型的百分比变化很大。(伪彩色图像)

10.3 色彩的三刺激理论

10.3.1 人类视锥细胞的光谱响应

现在我们有三个探测器(S、M、L视锥细胞),每一个都有不同的光谱响应曲线。

在这里插入图片描述
S = ∫ r S ( λ ) s ( λ ) d λ M = ∫ r M ( λ ) s ( λ ) d λ L = ∫ r L ( λ ) s ( λ ) d λ \begin{gathered} \text{S}=\int r_{S}(\lambda)s(\lambda) d\lambda \\ \text{M} =\int r_M(\lambda)s(\lambda) d\lambda \\ \text{L} =\int r_{L}(\lambda)s(\lambda) d\lambda \end{gathered} S=rS(λ)s(λ)dλM=rM(λ)s(λ)dλL=rL(λ)s(λ)dλ

10.3.2 人类的视觉系统

  • 人的眼睛不能测量,大脑不能接收每种波长的光的信息
  • 相反,眼睛"看到"只有三个响应值(S,M,L),这是唯一提供给大脑的信息
    在这里插入图片描述

10.4 同色异谱

10.4.1 不同光谱能量分布的同色光 Metamers

Metamers是投射到相同(S,M,L)(3-dim)响应的两种不同的光谱(∞-dim)

  • 对人类来说它们的颜色是一样的

Metamers的存在对色彩再现至关重要

  • 不需要重现真实世界场景的全貌
  • 例如:Metamers可以在只有三种颜色像素的显示器上再现现实世界场景的感知颜色

10.4.2 同色异谱是一种效应

在这里插入图片描述

10.4.3 同色异谱

色彩搭配背后的理论
在这里插入图片描述

10.5 色彩再现/匹配

10.5.1 加色

在这里插入图片描述

给定一组主光,每个主光具有自己的光谱分布(例如R、G、B显示像素):
s R ( λ ) , s G ( λ ) , s B ( λ ) s_R(\lambda), s_G(\lambda), s_B(\lambda) sR(λ),sG(λ),sB(λ)

调整这些灯光的亮度,并将它们添加到一起:
R s R ( λ ) + G s G ( λ ) + B s B ( λ ) R s_R(\lambda)+G s_G(\lambda)+B s_B(\lambda) RsR(λ)+GsG(λ)+BsB(λ)
颜色现在由标量值描述:
R , G , B R,G,B R,G,B

10.5.2 加色配色实验

在这里插入图片描述

10.5.3 示例实验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.5.4 实验2

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.5.5 CIE RGB颜色匹配实验

与之前的加色匹配相同的设置,但三原色是单色光(单波长)

在这里插入图片描述
测试光也是单色光
在这里插入图片描述

10.5.6 CIE RGB颜色匹配函数

图标示了每种CIE RGB主光的组合量,以匹配x轴上给出的波长的单色光。
在这里插入图片描述

10.5.7 使用匹配函数再现色彩

对于任何光谱,感知到的颜色通过以下公式匹配,用于缩放CIE RGB三原色
在这里插入图片描述
R C I E   R G B = ∫ λ s ( λ ) r ˉ ( λ ) d λ G C I E   R G B = ∫ λ s ( λ ) g ˉ ( λ ) d λ B C I E   R G B = ∫ λ s ( λ ) b ˉ ( λ ) d λ \begin{gathered} R_{\mathrm{CIE\ RGB}} =\int_{\lambda}s(\lambda)\bar{r}(\lambda) d\lambda \\ G_{\mathrm{CIE\ RGB}} =\int_{\lambda}s(\lambda)\bar{g}(\lambda) d\lambda \\ B_{\mathrm{CIE\ RGB}} =\int_{\lambda}s(\lambda)\bar{b}(\lambda) d\lambda \end{gathered} RCIE RGB=λs(λ)rˉ(λ)dλGCIE RGB=λs(λ)gˉ(λ)dλBCIE RGB=λs(λ)bˉ(λ)dλ

10.5.8 标准色彩空间

标准化RGB(sRGB)

  • 使特定的显示器RGB标准化
  • 其他彩色设备通过校准模拟显示器
  • 至今广泛采用的
  • 色域(?)是有限的

10.5.9 一个通用的色彩空间:CIE XYZ

在这里插入图片描述
标准色原色X、Y、Z的虚设集

  • 不存在具有这些匹配函数的原色
  • Y是亮度(不分颜色的亮度)

这样设计

  • 匹配函数是严格正的
  • 覆盖所有可观察到的颜色

10.5.10 分离亮度、色度

在这里插入图片描述

亮度:Y
色度:x,y,z,定义为

x = X X + Y + Z y = Y X + Y + Z z = Z X + Y + Z \begin{gathered} x=\frac{X}{X+Y+Z} \\ y=\frac{Y}{X+Y+Z} \\ z=\frac{Z}{X+Y+Z} \end{gathered} x=X+Y+ZXy=X+Y+ZYz=X+Y+ZZ

  • 由于x+y+z=1,我们只需要记录三个中的两个
  • 通常选择x和y,得出特定亮度Y的(x,y)坐标

10.5.11 CIE彩度图

在这里插入图片描述
弯曲边界

  • 称为谱轨迹
  • 对应于单色光(每一点代表单一波长的纯色)

其中的任何颜色都不那么纯净

  • 即混合的

10.5.12 色域

色域是由一组基色产生的一组色度。

不同的色彩空间代表不同的颜色范围。

所以它们有不同的色域,即,它们覆盖了色度图上的不同区域。

在这里插入图片描述

10.6 感知组织的颜色空间

10.6.1 HSV色彩空间(Hue-Saturation-Value)

轴线对应色彩的艺术特征

广泛应用于“取色器”中
在这里插入图片描述

10.6.2 色彩的感知维度

  • Hue(色调)
    • 颜色的“种类”,不考虑属性
    • 比色相关:主导波长
    • 艺术家的相关性:所选颜料颜色
  • Saturation(饱和度)
    • “色彩斑斓’
    • 比色相关:纯度
    • 艺术家的相关性:彩色管中的颜料分数
  • Lightness (or value)(亮度)
    • 总光量
    • 色度相关:亮度
    • 艺术家的相关性:色调较浅,色调较深

10.6.3 CIE LAB空间(又名L*a*b*)

一个常用的色彩空间,力求在感知上的一致性

  • L*是亮度
  • a*和b*是色对
    • a*为红绿色
    • b*为蓝黄色
      在这里插入图片描述

10.6.4 互补色理论

CIE LAB的颜色空间维度有很好的神经学基础

  • 大脑似乎在早期使用三个轴来编码颜色:
    • 白色-黑色,红色-绿色,黄色-蓝色
  • 白色-黑色轴是亮度,其他轴决定色调和饱和度
    在这里插入图片描述
    在这里插入图片描述

10.6.5 一切都是相对的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.6.6 CMYK:一种减色的色彩空间

在这里插入图片描述

减色模型

  • 混合得越多,颜色就越深
    青色、洋红色、黄色和黑色广泛应用于印刷

问题:
如果混合C、M和Y得到K,为什么需要K?
在这里插入图片描述

11 动画与模拟

11.1 动画

“将事物带入生活”

  • 交流的工具
  • 审美问题往往主导技术问题

建模的一种扩展

  • 将场景模型表示为时间的函数

输出:连续观看时提供动作感觉的图像序列

  • 电影:24 fps(帧每秒)
  • 视频(一般):30 fps
  • 虚拟现实:90 fps

11.2 动画中的历史节点

11.2.1 最早的动画

在这里插入图片描述
在这里插入图片描述

11.2.2 动画的历史

在这里插入图片描述

11.2.3 最早的电影

最初用作科学工具而非娱乐

加速动画发展的关键技术

在这里插入图片描述

11.2.4 第一部手绘完整长度(>40分钟)动画

在这里插入图片描述

11.2.5 第一部数字计算机生成的动画

在这里插入图片描述

11.2.6 早期的计算机动画

在这里插入图片描述

11.2.7 数字恐龙!

在这里插入图片描述

11.2.8 第一部CG长片

在这里插入图片描述

11.2.9 计算机动画——十年前

在这里插入图片描述

11.2.9 计算机动画——五年前

在这里插入图片描述

11.3 关键帧动画

11.3.1 关键帧动画

在这里插入图片描述
动画师(如首席动画师)创建关键帧

助手(人或计算机)在帧之间创建帧增强

11.3.2 关键帧插值

将每个帧看作参数值的向量

在这里插入图片描述

11.3.3 各参数的关键帧插值

线性插值通常不够好
在这里插入图片描述
用于平滑/可控插值的召回曲线

在这里插入图片描述

11.4 物理模拟

11.4.1 牛顿定律

在这里插入图片描述

11.4.2 基于物理的动画

使用数值模拟生成物体的运动

在这里插入图片描述

11.4.3 例子:布料模拟

在这里插入图片描述

11.4.4 例子:流体

在这里插入图片描述

11.5 质点弹簧系统:动态系统建模示例

11.5.1 例子:质点弹簧绳

在这里插入图片描述

11.5.2 例子:毛发

在这里插入图片描述

11.5.3 例子:质点弹簧网格

在这里插入图片描述
在这里插入图片描述

11.5.4 一个简单的弹簧

理想的弹簧
在这里插入图片描述
f a → b = k S ( b − a ) f b → a = − f a → b \begin{aligned}&f_{a\to b}=k_S(\boldsymbol{b}-\boldsymbol{a})\\&f_{b\to a}=-\boldsymbol{f}_{a\to b}\end{aligned} fab=kS(ba)fba=fab

力将各点拉在一起

强度与位移成正比(胡克定律)

k s k_s ks是一个弹性系数:硬度

问题:这个弹簧希望长度为零

11.5.5 非零长度弹簧

非零长度(rest length)的弹簧

在这里插入图片描述
在这里插入图片描述

11.5.6 导数的点表示法

如果 x x x 是感兴趣点位置的矢量,我们将使用点符号表示速度和加速度:

x x ˙ = v x ¨ = a \begin{aligned}&\boldsymbol{x}\\&\boldsymbol{\dot{x}}=\boldsymbol{v}\\&\boldsymbol{\ddot{x}}=\boldsymbol{a}\end{aligned} xx˙=vx¨=a

11.5.7 引入能量损失

简单运动阻尼
在这里插入图片描述
f = − k d b ˙ f=-k_d\dot{\boldsymbol{b}} f=kdb˙

  • 在运动中表现得像粘性拖曳物
  • 减慢速度方向上的运动速度
  • k d k_d kd是一个阻尼系数

问题:减慢所有运动

  • 想要一个生锈的弹簧的振动减慢,但它是否也应该更慢地落到地上呢?

11.5.8 弹簧的内部阻尼

仅阻尼内部弹簧驱动的运动

在这里插入图片描述

  • 粘滞阻力只影响弹簧长度的变化
  • 不会减缓弹簧系统的群组运动(例如群组的全局平移或旋转)
  • 注:这只是一种特定类型的阻尼

11.5.9 弹簧结构

在这里插入图片描述

行为是由结构联系决定的

在这里插入图片描述
这种结构不能抵抗切变

这种结构无法抵抗平面外弯曲

在这里插入图片描述
这种结构能抵抗切变,但具有各向异性的偏差

这种结构同样不能抵抗面外弯曲

在这里插入图片描述
这种结构能抗切变,方向性偏差小

这种结构同样不能抵抗面外弯曲

在这里插入图片描述
这种结构能抵抗切变,方向偏差较小

这种结构能抵御平面外弯曲

红弹簧应该弱得多

11.5.10 其它模拟方式:FEM(有限元法)代替弹簧

在这里插入图片描述

11.6 粒子系统 Particle Systems

11.6.1 粒子系统 Particle Systems

在这里插入图片描述
将动力系统模型化为大量粒子的集合体

每个粒子的运动由一组物理力(或非物理力)来定义

图形和游戏中的流行技术

  • 易于理解、实现
  • 可扩展性:粒子越少,速度越快,粒子越多,复杂性越高

挑战

  • 可能需要许多颗粒(如流体)
  • 可能需要加速度结构(例如为相互作用寻找最近的粒子)

11.6.2 粒子系统动画

对于动画中的每个帧

  • 必要时创造新的粒子
  • 计算每个粒子的受力
  • 更新每个粒子的位置和速度
  • 必要时去除死粒子
  • 渲染粒子

11.6.3 粒子系统作用力

  • 吸引力和排斥力
    • 重力、电磁力……
    • 弹簧、推进力……
  • 阻尼力
    • 摩擦力、空气阻力、粘滞力……
  • 碰撞
    • 墙壁、容器、固定的物体……
    • 动态对象、角色身体部位……

11.6.4 引力

牛顿万有引力定律

  • 粒子间的引力
    F g = G m 1 m 2 d 2 G = 6.67428 × 1 0 − 11 N m 2 k g − 2 \begin{aligned}&F_{g}=G\frac{m_{1}m_{2}}{d^{2}}\\&G=6.67428\times10^{-11} \mathrm{Nm}^{2}\mathrm{kg}^{-2}\end{aligned} Fg=Gd2m1m2G=6.67428×1011Nm2kg2

在这里插入图片描述

11.6.5 例子:银河模拟

在这里插入图片描述

11.6.6 例子:基于粒子的流体

在这里插入图片描述

11.6.7 作为ODE的模拟群集

把每只鸟模型化为粒子

在这里插入图片描述
受制于非常简单的力:

  • 对邻居中心的吸引力
  • 对个别邻居的排斥
  • 朝邻近区域平均轨迹方向的排列

在这里插入图片描述

用数值模拟大粒子系统的演化突发复杂行为(也见于鱼类、蜜蜂、…)

11.6.8 例子:分子动力学

在这里插入图片描述

11.6.9 例子:人群+“岩石”动力学

在这里插入图片描述

11.7 正向运动学 Forward Kinematics

11.7.1 正向运动学

在这里插入图片描述

  • 关节骨架
    • 拓扑结构(什么连接到什么)
    • 节点的几何关系
    • 树结构(在没有循环的情况下)
  • 节类型 Joint types
    • 销 Pin (一维旋转)

    • 球 Ball (二维旋转)
      在这里插入图片描述

    • 棱柱接头 Prismatic joint (移动)
      在这里插入图片描述

例子:二维简易双节臂

动画机提供角度,计算机确定最终效果器的位置p

在这里插入图片描述
在这里插入图片描述

11.7.2 例子:步行循环

在这里插入图片描述

11.7.3 运动学的利弊

  • 优势
    • 直接控制方便
    • 实现起来很简单
  • 劣势
    • 动画可能与物理不一致
    • 对艺术家来说很耗时

11.8 逆运动学 Inverse Kinematics

11.8.1 逆运动学

在这里插入图片描述
直接逆运动学:对于两段臂,可分析求解参数

在这里插入图片描述
为什么这个问题很难?

  • 在空间中存在多种解决方案

在这里插入图片描述
在这里插入图片描述

  • 可能不存在所谓的解决方案
    在这里插入图片描述

一般N链IK问题的数值解

  • 选择初始配置
  • 定义误差度量(例如,目标与当前位置之间距离的平方)
  • 计算误差梯度作为配置的函数
  • 应用梯度下降法(或牛顿法或其他优化程序)

11.8.2 基于风格的IK

在这里插入图片描述

11.9 绑定 Rigging

11.9.1 绑定

绑定是角色上一套更高级别的控制,允许更快速直观地修改姿势、变形、表情等。
在这里插入图片描述

重点

  • 就像木偶上的线
  • 捕获所有有意义的人物变化
  • 因人物而异

创造成本高

  • 手工劳动
  • 需要艺术和技术培训

11.9.2 绑定的例子

在这里插入图片描述

11.9.3 融合形状 Blend Shapes

直接在曲面之间插值,而不是骨架

例如,建模一组面部表情:

最简单的方案:采取顶点位置的线性组合

样条用于随着时间的推移控制权重选择

在这里插入图片描述

11.10 动作捕捉 Motion Capture

11.10.1 动作捕捉

数据驱动的动画序列创建方法

  • 记录真实世界的表现(例如,执行某项活动的人)
  • 从收集到的数据中提取姿势作为时间的函数

在这里插入图片描述

11.10.2 动作捕捉的利弊

  • 优势
    • 可以快速捕获大量真实数据
    • 真实性很高
  • 弱点
  • 复杂而昂贵的设置
  • 捕捉到的动画可能不符合艺术需要,需要修改

11.10.3 动作捕捉的装备

在这里插入图片描述

11.10.4 光学运动捕捉

在这里插入图片描述

  • 物体标记
  • 通过多个摄像头的三角测量定位
  • 8+摄像机,240 Hz,遮挡时很困难

在这里插入图片描述

11.10.5 捕捉到的数据

在这里插入图片描述

11.10.6 面部动画的挑战

恐怖谷效应

  • 机器人和图形学
  • 随着人造人物外表接近人类的现实主义,我们的情绪反应变得消极,直到它在表达上达到足够令人信服的现实主义水平。
    在这里插入图片描述

11.10.7 面捕动作捕捉

在这里插入图片描述

11.10.8 生产流水线

在这里插入图片描述

11.11 简单粒子模拟

在这里插入图片描述
首次研究单个粒子的运动

  • 接着,概括为多种粒子

首先,假设粒子的运动是由速度矢量场决定的,速度矢量场是一个位置和时间的函数:
v ( x , t ) v(x,t) v(x,t)
在这里插入图片描述

11.11.1 常微分方程 Ordinary Differential Equation(ODE)

在这里插入图片描述

计算质点随时间的位置需要解一阶常微分方程:

d x d t = x ˙ = v ( x , t ) \frac{dx}{dt}=\boldsymbol{\dot{x}}=v(x,t) dtdx=x˙=v(x,t)

“一阶”(First-order),是指所取的第一个导数。

“常”(Ordinary)意味着没有“部分”导数,即 x x x 只是 t t t 的一个函数。

11.11.2 求解粒子的位置

对于给定的粒子初始位置 x 0 x_0 x0,我们可以用正向数值积分法求解ODE。
在这里插入图片描述

11.11.3 欧拉方法

欧拉方法(又称前向欧拉、显式欧拉)

  • 简单迭代法
  • 常用的
  • 非常不准确
  • 通常情况不稳定

x t + Δ t = x t + Δ t x ˙ t x ˙ t + Δ t = x ˙ t + Δ t x ¨ t \begin{aligned}\boldsymbol{x}^{t+\Delta t}&=\boldsymbol{x}^{t}+\Delta t\boldsymbol{\dot{x}}^{t}\\\boldsymbol{\dot{x}}^{t+\Delta t}&=\boldsymbol{\dot{x}}^{t}+\Delta t\boldsymbol{\ddot{x}}^{t}\end{aligned} xt+Δtx˙t+Δt=xt+Δtx˙t=x˙t+Δtx¨t

11.11.4 欧拉方法-误差

在数值积分中,误差会累积

欧拉积分尤为糟糕

可通过减小 Δ t \Delta t Δt减小误差

在这里插入图片描述

11.11.5 欧拉方法的不稳定性

欧拉方法(显式/前向)

x t + Δ t = x t + Δ t v ( x , t ) x^{t+\Delta t}=x^t+\Delta t \boldsymbol{v}(\boldsymbol{x},t) xt+Δt=xt+Δtv(x,t)

两个关键问题:

不准确度随着时间的推移而增加,随着时间 Δ t \Delta t Δt增加
在这里插入图片描述

不稳定性是一个常见的严重问题,它会导致模拟偏差(diverge)

在这里插入图片描述

11.11.6 误差和不稳定性

通过有限差分数值积分来解决会导致两个问题

  • 误差
    • 每次步骤的误差都会累积,随着模拟的进行,精度会降低
    • 在图形应用中,精度可能不是关键
  • 不稳定性
    • 误差会加剧,即使底层系统不存在,模拟也会发生偏差
    • 稳定性不足是模拟中的一个根本问题,不容忽视

11.12 对抗不稳定性

11.12.1 对抗不稳定性的几种方法

  • 中点法/修正欧拉
    • 平均起点和终点的速度
  • 自适应步长
    • 将一个步长和两个半步长进行递归比较,直到误差可以接受为止
  • 隐式方法
    • 在下一个步长中使用速度(硬性)
  • 基于位置/Verlet合成
    • 约束时间步后粒子的位置和速度

11.12.2 中点法 Midpoint Method

在这里插入图片描述

  • 中点法
    • 计算欧拉步长(a)
    • 计算欧拉步中点的导数(b)
    • 使用中点导数更新位置(c)
      x m i d = x ( t ) + Δ t / 2 ⋅ v ( x ( t ) , t ) x ( t + Δ t ) = x ( t ) + Δ t ⋅ v ( x mid , t ) \begin{aligned} x_{\mathrm{mid}}& =x(t)+\Delta t/2\cdot v(x(t),t) \\ x(t+\Delta t)& =x(t)+\Delta t\cdot v(x_\text{mid},t) \end{aligned} xmidx(t+Δt)=x(t)+Δt/2v(x(t),t)=x(t)+Δtv(xmid,t)

11.12.3 修正欧拉 Modified Euler

  • 修正欧拉
    • 平均起点和终点的速度
    • 更好的效果
      x t + Δ t = x t + Δ t 2 ( x ˙ t + x ˙ t + Δ t ) x ˙ t + Δ t = x ˙ t + Δ t x ¨ t x t + Δ t = x t + Δ t x ˙ t + ( Δ t ) 2 2 x ¨ t \begin{gathered} \boldsymbol{x}^{t+\Delta t}=\boldsymbol{x}^t+\frac{\Delta t}2 (\dot{\boldsymbol{x}}^t+\dot{\boldsymbol{x}}^{t+\Delta t}) \\ \dot{\boldsymbol{x}}^{t+\Delta t}=\dot{\boldsymbol{x}}^t+\Delta t \ddot{\boldsymbol{x}}^t \\ \boldsymbol{x}^{t+\Delta t}=\boldsymbol{x}^t+\Delta t \dot{\boldsymbol{x}}^t+\frac{(\Delta t)^2}2 \ddot{\boldsymbol{x}}^t \end{gathered} xt+Δt=xt+2Δt(x˙t+x˙t+Δt)x˙t+Δt=x˙t+Δtx¨txt+Δt=xt+Δtx˙t+2(Δt)2x¨t

11.12.4 自适应步长 Adaptive Step Size

在这里插入图片描述

  • 自适应步长
    • 基于误差估计选择步长的技术
    • 非常实用的技术
    • 但可能需要很小的步骤!
  • 重复,直到误差低于阈值:
  • 计算 X T X_T XT 欧拉步长,size T T T
  • 计算 X T / 2 X_{T/2} XT/2 两个欧拉步长,size T / 2 T/2 T/2
  • 计算误差 ∣ ∣ X T − X T / 2 ∣ ∣ ||X_T-X_{T/2}|| ∣∣XTXT/2∣∣
  • 如果(误差>阈值),减小步长大小,然后重试

11.12.5 隐式欧拉方法 Implicit Euler Method

  • 隐式方法
    • 非正式地称为后向方法
    • 使用下一步的速度和加速度,用于当前步
      x t + Δ t = x t + Δ t x ˙ t + Δ t x ˙ t + Δ t = x ˙ t + Δ t x ¨ t + Δ t \begin{aligned}\boldsymbol{x}^{t+\Delta t}&=\boldsymbol{x}^{t}+\Delta t\boldsymbol{\dot{x}}^{t+\Delta t}\\\boldsymbol{\dot{x}}^{t+\Delta t}&=\boldsymbol{\dot{x}}^{t}+\Delta t\boldsymbol{\ddot{x}}^{t+\Delta t}\end{aligned} xt+Δtx˙t+Δt=xt+Δtx˙t+Δt=x˙t+Δtx¨t+Δt
    • 求解 x t + Δ t \boldsymbol{x}^{t+\Delta t} xt+Δt x ˙ t + Δ t \boldsymbol{\dot{x}}^{t+\Delta t} x˙t+Δt 的非线性问题
    • 使用找根算法,例如牛顿法
    • 提供了更好的稳定性
      如何确定/量化“稳定性”?
  • 我们使用局部截断误差(每步)/总累积误差(综合)
  • 绝对值无关紧要,但顺序是重要的
  • 隐式欧拉是1阶的,这意味着
    • 局部截断误差: O ( h 2 ) O(h^2) O(h2)
    • 全局截断误差: O ( h ) O(h) O(h) h h h 是步数,即 Δ t \Delta t Δt
  • O ( h ) O(h) O(h) 的理解
    如果我们把 h h h 减半,我们可以预期误差也减半

11.12.6 龙格-库塔法 Runge-kutta Families

一组解决ODE(常微分方程)的高级方法

  • 特别擅长处理非线性问题
  • 它的四阶版本是最广泛使用的,即 RK4

初始条件:
d y d t = f ( t , y ) , y ( t 0 ) = y 0 . \frac{dy}{dt}=f(t,y),\quad y(t_0)=y_0. dtdy=f(t,y),y(t0)=y0.

RK4 方法:
y n + 1 = y n + 1 6 h ( k 1 + 2 k 2 + 2 k 3 + k 4 ) , t n + 1 = t n + h \begin{aligned}&y_{n+1}=y_n+\frac16h\left(k_1+2k_2+2k_3+k_4\right),\\&t_{n+1}=t_n+h\end{aligned} yn+1=yn+61h(k1+2k2+2k3+k4),tn+1=tn+h

  • k 1 = f ( t n , y n ) k_1= f(t_n,y_n) k1=f(tn,yn)
  • k 2 = f ( t n + h 2 , y n + h k 1 2 ) k_2 = f\left(t_n + \frac{h}{2},y_n +h\frac{k_1}{2}\right) k2=f(tn+2h,yn+h2k1)
  • k 3 = f ( t n + h 2 , y n + h k 2 2 ) k_3= f\left(t_n+\frac{h}{2},y_n+h\frac{k_2}{2}\right) k3=f(tn+2h,yn+h2k2)
  • k 4 = f ( t n + h , y n + h k 3 ) k_4= f\left(t_n+h,y_n+hk_3\right) k4=f(tn+h,yn+hk3)

11.12.7 基于位置/Verlet集成

想法:

  • 在修正欧拉前向步后,约束粒子的位置以防止发散和不稳定行为
  • 使用受限位置来计算速度
  • 这两种想法都会消耗能量,稳定

优缺点:

  • 快速且简单
  • 不以物理为基础,消耗能量(误差)

11.12.8 刚体模拟

简单的案例

  • 类似于模拟粒子
  • 考虑一下更多属性吧

d d t ( X θ X ˙ ω ) = ( X ˙ ω F / M Γ / I ) \left.\frac d{dt}\left(\begin{array}{c}\mathrm{X}\\\theta\\\mathrm{\dot{X}}\\\omega\end{array}\right.\right)=\left(\begin{array}{c}\mathrm{\dot{X}}\\\omega\\\mathrm{F}/M\\\Gamma/I\end{array}\right) dtd XθX˙ω = X˙ωF/MΓ/I

  • X \mathrm{X} X:位置
  • θ \theta θ:旋转角
  • ω \omega ω:角速度
  • F \mathrm{F} F:力
  • Γ \Gamma Γ:转矩
  • I I I:惯性动量

11.13 流体模拟

11.13.1 一种简单的基于位置的方法

在这里插入图片描述

关键思想

  • 假设水是由小刚体球组成的
  • 假设水不能被压缩(即恒定密度)
  • 所以,只要密度在某个地方发生变化,就应该通过改变粒子的位置来“修正”
  • 你需要知道与每个粒子位置相关的任何地方的密度梯度
  • 更新?就是梯度下降!

11.13.2 欧拉方法 vs. 拉格朗日方法

模拟大量物质集合的两种不同观点

  • (“质点法””)拉格朗日方法

    • 摄影师全程跟踪同一只鸟。
      在这里插入图片描述
  • (“网格法”)欧拉方法

    • 摄影师是静止不动的,只能拍摄所有经过一帧的鸟(比如说时间)。
      在这里插入图片描述

11.13.3 物点法 Material Point Method(MPM)

混合型,结合了欧拉和拉格朗日的观点

  • 拉格朗日:考虑带有材料特性的粒子
  • 欧拉:用网格做数值积分
  • 交互作用:粒子向网格传递属性,网格进行更新,最后间接返回粒子

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sizeof和strlen区别

如图&#xff0c;sizeof来计算的时候&#xff0c;得出的是计算机用多少个字节来表示一个地址 而strlen来计算的时候&#xff0c;只是计算出他的有效字符长度 打印出的不同地址就是其不同的区别

数据中心同步指南 : 数据中心架构师和其他网络专家需要了解有关 5G 同步的知识

随着 5G 的推出&#xff0c;电信基础设施的设计方式正在发生巨大变化。由于网络运营商希望创建更开放的网络基础设施生态系统&#xff0c;部分基础设施&#xff08;如基带处理&#xff09;被虚拟化并移至电信数据中心。影响数据中心架构的另一个与 5G 相关的趋势是移动边缘计算…

20240727 每日AI必读资讯

&#x1f310;OpenAI向Google宣战&#xff0c;重磅推出AI搜索引擎SearchGPT &#xff01; - 将 AI 与实时网络信息结合 提供生成式UI结果 - SearchGPT 结合网络最新信息可以直接回答问题&#xff0c;同时注明相关来源链接。 - 还可以像与人对话一样提出后续问题&#xff0c;…

YOLOv8 改进 | 注意力机制 | 处理原始SE通道信息丢失问题的ESE【含分割,检测,OBByaml文件】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

开放式耳机哪个品牌值得入手?五大年度黑马产品推荐

近几年开放式耳机获得了越来越多消费者的青睐&#xff0c;其中十分重要的原因就是&#xff0c;它能在不降低佩戴体验感的同时&#xff0c;让我们在不同的环境中尽情享受音乐。对于刚刚接触开放式耳机的朋友们来说&#xff0c;挑选一款在自己不踩雷的开放式耳机并非易事&#xf…

关于同一型号单片机使用不同版本的Keil5.pack包导致编译找不到对应.h问题

1.单片机型号:STM32G070CBTX 2.过程分析 拿到一个完整的工程&#xff0c;打开后编译报错&#xff0c;一些.h文件找不到&#xff0c;导致一些宏定义报错&#xff0c;如下图所示: 刚开始怀疑是安装的pack问题&#xff0c;又去ARM官网上下载最新的STM32G0xx_DFP.1.5.0版本的pack包…

吴恩达的TranslationAgent学习

TranslationAgent构成 整个[TranslationAgent (github.com)]在流程上分为短文本的一次性翻译和长文本的分chunk翻译&#xff08;按照Token进行划分&#xff09;。 但是不论长文本翻译还是短文本翻译&#xff0c;总体流程遵循执行、纠正再执行的逻辑循环实现。 这种按照自省思路…

Android ContentResolver.loadThumbnail转Kotlin

Android ContentResolver.loadThumbnail转Kotlin loadThumbnail原先是Java实现的&#xff0c;现在抠出来转Kotlin实现。 private fun loadThumbnail(uri: Uri, size: Size, signal: CancellationSignal): Bitmap {return myLoadThumbnail(mContext?.contentResolver!!, uri, s…

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…

Qemu和宿主机不使用外网进行文件传输

简介 目前Qemu虚拟机和宿主机交互&#xff0c;最方便的方式是进行网络传输&#xff0c;但也有不能使用外网的情况&#xff0c;这时候使用挂载是比较好的方式。 Linux使用 宿主机&#xff1a;Linux Qemu&#xff1a;Linux 传输方式&#xff1a;挂载 参考&#xff1a;在QEMU虚拟…

深圳市索迪迈科技有限公司:车载视频监控领域的精英

位于科技创新前沿的深圳市&#xff0c;索迪迈科技有限公司是一家专业从事车载视频监控设备研发、生产、销售的高新技术企业。公司自成立起&#xff0c;一直专注于车载设备领域的研发、生产、经营、服务一体化&#xff0c;为市场提供卓越的车载监控产品。 自主专业&#xff0c;专…

MySQL练习(4)

作业要求&#xff1a; 实现过程&#xff1a; 1.新建数据库 2.新建表 3.处理表 &#xff08;1&#xff09;修改student 表中年龄 (sage) 字段属性&#xff0c;数据类型由 int 改变为 smallint 。 &#xff08;2&#xff09;为 Course 表中 Cno 课程号字段设置索引,并查看索引。…

C语言边界互通传送迷宫

目录 注意事项开头程序程序的流程图程序输入与输出的效果结尾 注意事项 程序里有关字符’\033’的输出都关于Sunshine-Linux的其中一篇博客——《printf函数高级用法设置打印字体颜色和背景色等》 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语…

dpdk编译安装以及接收udp报文(基于ubuntu)

目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载&#xff1a; DPDK 下载版本&#xff1a;DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…

[杂项] 判断一个C++程序是多少位数属于那种编译版本

C/C程序 使用Process Explore。找到运行的程序后双击。 在image可以看到程序的位数。 view→lower Pane View → DLLs。通过查看vc运行库的dll是否带d后缀可以判断该程序是debug版本还是release版本 dependcyWalker 使用 dependcyWalker 来查看程序的位数及编译版本。注意…

每日一练,java06

这里写目录标题 题目1.局部变量能否和成员变量重名&#xff1f;2.下面哪个不属于HttpServletResponse接口完成的功能&#xff1f;3.以下代码结果是什么&#xff1f;4.实现或继承了Collection接口的是&#xff08;&#xff09;知识点局部变量与成员变量重名equals与HttpServletR…

微服务实战系列之玩转Docker(七)

前言 在上一篇中&#xff0c;博主对通过docker registry完成私仓搭建的过程&#xff0c;进行了完整演示和说明。一个docker 环境&#xff08;比如desktop&#xff09;&#xff0c;一个registry镜像&#xff0c;准备好这样的“2件套”&#xff0c;就能换来一个私有仓库了。 简…

PLC 远程下载网关

一、 产品概述 SSF-BOX-100 是三石峰科技有限公司推出的工业级 PLC 远程下载网关&#xff0c;主 要用于 PLC 远程调试、程序上下载&#xff0c;为用户提供一种简单可靠的远程维护方案。 1.1 SGBOX 软件 SGBOX 软件是 SSF-BOX-100 网关的配套软件&#xff0c;可以查看设备状态…

FTP(File Transfer Protocal,文件传输协议)

文章目录 引言FTP管理工具FTP客户端FTP连接模式控制连接数据连接FTP命令/响应FTP命令FTP响应FTPSSFTP引言 FTP(File Transfer Protocal,文件传输协议)用于建立两台主机间的数据文件传输下载。使用客户/服务器(Client/Server)架构,基于TCP协议,服务端口为21。 FTP链接…