101

Lec1 overview of Computer Graphic

判断游戏画面水平如何
可以去看画面的明暗.亮的,一般都是采用了全局光照技术.从技术层面来看更加优秀

特效是最简单的图形学技术应用
特效是特殊的效果.在平常生活中见得很少,即使特效出错,观众不一定看得出来.而对日常东西的渲染更为困难

Visualization
Virtual Reality
Digital Illustration数字图像处理
Simulation
Graphic User Interface
Typography矢量字体?

  • course topic
    • Rasterazation
    • Curves and Meshes
    • Ray Tracing
    • Animation / Simulation

CG与CV
一切需要理解,猜测的都是计算机视觉的内容.
no clear boundaries

Lec2 Review of Linear Algebra

A Swift and Brutal Introduction to Linear Algebra

Vectors

$\vec {a}$ 或者$\boldsymbol {a}$

dot product 点乘

$\vec {a} \cdot \vec{b}=\lvert \vec{a} \rvert \lvert \vec{b} \rvert \cos\theta$
$\cos\theta=\frac{\vec{a} \cdot \vec{b}}{\lvert\vec{a}\rvert\lvert \vec{b} \rvert}0$
for unit Vectors
$\cos \theta=\hat{a} \cdot \hat{b}$
符合

  1. 交换律
  2. 结合律
  3. 分配律

用矩阵表达的点乘计算更加简单直接
在二维
$\vec{a} \cdot \vec{b}=\begin{pmatrix}x{a} \ y{a} \ \end{pmatrix}\cdot \begin{pmatrix}x{b} \ y{b}\end{pmatrix}=x{a}x{b}+y{a} y{b}$

同理对于三维

$\vec{a} \cdot \vec{b}=\begin{pmatrix}x{a} \ y{a} \z{a} \end{pmatrix}\cdot \begin{pmatrix}x{b} \ y{b} \ z{b}\end{pmatrix}=x{a} x{b}+y{a} y{b}+z{a} z{b}$

主要是用来寻找投影

对于$\vec{b}$在$\vec{a}$上的投影$\vec{b}\perp$
$\vec{b}\perp=\lvert\vec{b}\perp\rvert \cdot\hat{a}=\lvert\vec{b}\rvert\hat{a} \cos\theta$
若$\vec{a}$为$\hat{a}$,则
$\vec{b}\perp=\lvert\vec{b}\rvert \vec{a} \cos\theta =(\vec{b} \cdot \vec{a})\vec{a}$ ^fae5ki

用处:
观察点乘结果判断

  1. 两个向量是否接近
  2. 两个向量的前后位置关系

cross product

$\vec{a} \times \vec{b}=-\vec{b} \times \vec{a}$

$\lvert \vec{a} \times \vec{b} \rvert=\lvert \vec{a} \rvert \lvert \vec{b} \rvert \sin\theta$

方向上采用右手定则

没有交换律但符合分配律和结合律

$\vec{a} \times \vec{a}=\vec{0}$

是向量,不是单纯的$0$

$\vec{a}\times\vec{b}=A^{*}b=\left(\begin{array}{l l l}0&{-z{a}}&{y{a}}\ {z{a}}&{0}&{-x{a}}\ {-y{a}}&{x{a}}&0\end{array}\right)\left(\begin{array}{l}{x{b}}\ {y{b}}\ {z_{b}}\end{array}\right)$

$\vec{a}\times\vec{b}\;=\;\left(\begin{array}{l l}{y{a}z{b}-y{b}z{a}}\ {z{a}x{b}-x{a}z{b}}\ {x{a}y{b}-y{a}x{b}}\end{array}\right)$

作用:
通过
叉乘结果判断

  1. 左和右
    if($\vec{a} \times \vec{b}=\vec{z}$)
    then,$\vec{b}$在$\vec{a}$左侧
    if($\vec{a} \times \vec{b}=-\vec{z}$)
    then,$\vec{b}$在$\vec{a}$右侧
  2. 内和外
    利用左右判断
    if($\overrightarrow{AP} \times \overrightarrow{AB}=\overrightarrow{BP} \times \overrightarrow{BC}=\overrightarrow{CP} \times \overrightarrow{CA}$)
    then,p在内侧

在3D情况下寻找投影
类似于二维的情况


$\begin{array}{c}{||\overrightarrow{v}||=||\overrightarrow{w}||=||\overrightarrow{v}||=1}\ {\overrightarrow{u}\cdot\overrightarrow{v}=\overrightarrow{u}\cdot\overrightarrow{w}=\overrightarrow{v}\cdot\overrightarrow{w}=0}\ {\overrightarrow{w}=\overrightarrow{u}\times\overrightarrow{v}}&{\scriptscriptstyle\mathrm{(右手系)}}\end{array}$

$\vec{p}\perp=(\vec{p}\cdot\vec{u})\vec{u}+(\vec{p}\cdot\vec{v})\vec{v}+(\vec{p}\cdot\vec{w})\vec{w}$

matrix

矩阵的乘法
$\begin{pmatrix}1&3 \ 2&4 \3&3 \ \end{pmatrix} \begin{pmatrix}2 &5\ 1&6\end{pmatrix}=\begin{pmatrix}x&x \ x&x \ x&x\end{pmatrix}$
不符合交换律但符合结合律和分配律
将向量vector视作列向量m*1的矩阵

矩阵的转置
$(AB)^T=B^{T}A^T$

单位矩阵$I_{3*3}=\begin{pmatrix}1&0&0 \ 0&1&0 \ 0&0&1 \ \end{pmatrix}$
对于逆运算$A^{-1}$
$AA^{-1}=A^{-1}A=I$
$(AB)^{-1}=B^{-1}A^{-1}$

将点乘与叉乘转换为矩阵乘法

Lec3 Transformation A

  • transformation
    • modeling
      1. rotation
      2. scaling
    • viewing
      1. projection

homogeneous coordinate 齐次坐标

为解决Translation问题,齐次坐标堂堂登场

  • $2D point=\begin{pmatrix}x \ y \ 1\end{pmatrix}$
  • $2D vector=\begin{pmatrix}x \ y \ 0\end{pmatrix}$
  • 为什么 point用1补位 vector用0补位?
    对于向量来说,人类希望它由平移不变的性质.所以用0来保护它
    • 1的情况
    • 0的情况确保了即使是利用矩阵乘法计算向量平移不变

或者换一个角度看

  • $vector+vector=vector$
  • $point-point=vector$
  • $point+vector=point$ 某个点沿着向量平移
  • $point+point=midpoint$
    对于点$\begin{pmatrix}x \ y \ w \end{pmatrix}=\begin{pmatrix}x/w \ y/w \ 1\end{pmatrix}$

  • 题外话:
    trade off是一个在工程学科中必然存在的策略.齐次坐标虽然需要更多的性能
    但能够将基础的变换统一起来

增加的储存数据只有最后一列的$\begin{pmatrix}0 \ 0 \ 1\end{pmatrix}$与最后一行的$\begin{pmatrix}0,0,1\end{pmatrix}$,而且在大部分情况下,$\begin{pmatrix}0,0,1\end{pmatrix}$只要储存一个1就够了.性能开销不大的情况下实现了相当好的效果

modeling

先线性变换再平移

线性变换

除了平移之外都是线性变换?

都可以用一个统一的矩阵来表示
$x \prime=ax+by$
$y \prime=cx+dy$

scale


缩放矩阵,缩放系数为$S{x}=0.5,S{y}=1.0$
$\left[\begin{array}{l}{x^{\prime}}\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{l l}{s_x}&0\ 0&{s_y}\end{array}\right]\left[\begin{array}{l}\ \end{array}\right]$

reflection

$\left[\begin{array}{l}{x^{\prime}}\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{l l}1&0\ 0&1\end{array}\right]\left[\begin{array}{l}{x}\ {y}\end{array}\right]$

sheer 拉伸


$\left[\begin{array}{l}{x^{\prime}}\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{l l}1&{a}\ 0&{1}\end{array}\right]\left[\begin{array}{l}{x}\ {y}\end{array}\right]$

rotate


写出正确的旋转矩阵,只需要找到前后变化的点的相对位置关系
$\left[\begin{array}{l}{x^{ \prime}}\ {y^{\prime}}\end{array}\right]=R{\theta}\left[\begin{array}{l}{x}\ {y}\end{array}\right]$
$\left[\begin{array}{l}{x^{\prime}}\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{l l}{?}&{?}\ {?}&{?}\end{array}\right]\left[\begin{array}{l}{x}\ {y}\end{array}\right]$
推导$R
{\theta}$的值,可以由特殊到一般,
$\left[\begin{array}{l}{x^{\prime}}\ {y^{\prime}}\end{array}\right]=(\cos\theta,\sin\theta)$带入推导随便算
对于旋转来说
$R{-\theta}=\left[\begin{array}{c c}\cos\theta&\sin\theta \ -\sin\theta&\cos\theta\end{array}\right]$
存在下列关系:
$R
{-\theta}=R{\theta}^{T}$
可以用转秩简单求得$R
{-\theta}$

线性变换的齐次坐标表示

非线性变换

Translation 平移变换


平移不是一个线性变换
为了避免这样的情况
引入了齐次坐标来解决

在齐次坐标下平移的表示
$\left(\begin{array}{c c c}{x^{\prime}}\ {y^{\prime}}\ {w^{\prime}}\end{array}\right)\ =\ \left(\begin{array}{c c c}1&0&{t{x}}\ 0&1&{t{y}}\ 0&0&1\end{array}\right)\cdot\left(\begin{array}{c}{x}\ {y}\ 1\end{array}\right)$

affine transform仿射变换

仿射变换:线性变换再接上平移
对于这样的操作来说,无法简单的写成与上方统一的矩阵相乘的形式
只能写成
$\left[\begin{array}{l}{x^{\prime}}\ {y^{\prime}}\end{array}\right]=\left[\begin{array}{l l}{a}&{b}\ {c}&{d}\end{array}\right]\left[\begin{array}{l}{x}\ {y}\end{array}\right]+\left[\begin{array}{l}{t{x}}\ {t{y}}\end{array}\right]$

但通过齐次坐标
可以写成

composing transform 组合变换

矩阵乘法的顺序会影响结果
所以变换顺序的不同也会影响结果
$R{45}\cdot T{(1,0)} \neq T{(1,0)} \cdot R{45}$

默认情况下先做旋转再做平移
对于下式来说
$T{(1,0)}\cdot R{45}\ \left [\begin{array}{c}x\ y\1\end{array}\right]$
先做旋转再做平移

对于一系列操作来说
$A{n}(A{n-1}(A{n-2}…(A{1})))$可以先合成之前的矩阵,最终变成$A{(3*3)} \cdot \begin{pmatrix}x \ y \ 1\end{pmatrix}$
$A
{(3*3})$能够表达无数多的复杂变换

非原点旋转

$T{c} \cdot R{\alpha} \cdot T_{-c}$
顺序是从左到右
先平移到原点,再旋转,最后再平移回去

inverse transform 逆变换

使用逆矩阵就可以完成逆变换

Lec4 Transformation B

How to get a photo?

  1. 摆pose modeling transformation
  2. 选相机位置 viewing transformation
  3. 按快门 projection transformation
    MVP!
    modeling viewing projection

三维下的模型变换

  • $3D point=\begin{pmatrix}x \ y \ z\ 1\end{pmatrix}$
  • $3D vector=\begin{pmatrix}x \ y \z \ 0\end{pmatrix}$
    $\begin{pmatrix}x \ y \ z\ w\end{pmatrix}=\begin{pmatrix}x /w\ y/w \ z/w\ 1\end{pmatrix}$

affine transform

平移仍然在最后一列

scale

reflection

Translation

sheer

Rotate

  • 沿着x轴旋转
  • 沿着y轴旋转
    是最特殊的一个,右上角是$\sin\alpha$
    下见推算过程

  • 沿着z轴旋转

对于任意的3D旋转来说,可以分解为一个在3D直角坐标系中的
$R{xyz}(\alpha\beta\gamma)=R{x}(\alpha)R{y}(\beta)R{z}(\gamma)$
三个绕各个轴旋转的矩阵相乘
$\alpha,\beta,\gamma$叫做欧拉角(Euler Angles)
战地中的开飞机也是这样

  • Rodrigues’ Rotation Formula
    rotation by angle $\alpha$ around axis $n$

    这部分$\sin\alpha\left(\begin{array}{l l l}0&{-n{z}}&{n{y}}\ {n{z}}&0&{-n{x}}\ {-n{y}}&{n{x}}&0\ \end{array}\right)$是叉乘的矩阵表达形式

viewing/camera 视图变换

基础:
相机的位置 $\vec{e}$ 人的位置
相机看向的方向 $\hat{g}$ 眼睛朝向
相机顶部向量 $\hat{t}$ 脑袋歪斜方向

在物理学的角度,可以将物体的移动看成,相机位置不动,其他物体相对运动.
于是把相机固定在标准位置,

相机位于原点,永远看向-z轴,顶部指向y轴正方向

$\vec{e}=(0,0,0)$
$\hat{g}=(0,0,-1)$
$\hat{t}=(0,1,0)$
让操作计简化

标准化流程

  1. $T{view}=\left[\begin{array}{c c c c}1&0&0&-x{e}\ 0&1&0&-y{e}\0&0&1&-z{e}\0&0&0&1\end{array}\right]$
  2. 将后面几步旋转矩阵计算为同一个矩阵可得逆矩阵$R{view}^{-1}$.由于矩阵$R{view}$计算困难,故使用逆矩阵

    第一行为(g x t) To X 结果
    第二行为t To Y的结果
    第三行为g To -Z的结果

projection 投影变换

  • orthographic projection 正交投影
  • perspective projection 透视投影

    orthographic projection 正交投影


把z轴直接去掉,再进行平移与缩放到$[-1,1]^{2}$范围内,就可以得到正交投影的结果

工程上的做法

注意,

  • 左右的范围为[l,r],left\<right
  • 上下的范围为[b,t],bottom\<top
  • 前后的范围为[f,n],far\<near.因为我们看向的方向是-z,例如f=-9,n=1.

变换矩阵为

前一个为了缩放立方体到$[-1,1]^{2}$范围
后一个为了平移立方体中点至原点

但现在并没有完全完成变换,因为缩放的过程中存在拉伸,还需要后续的视口变换来矫正
也存在精度上的问题.把大的立方体缩放到小立方体,会导致信息损失

perspective transformation 透视投影

  • 视锥如何定义?

    定义一个fov-Y(垂直可视角度),再定义一个aspect ratio(宽高比),就可以确定视锥的形状
    其他的数据都可以简单计算出来$n,t,l$等等


将从视锥通过投影面截出来的截锥体挤压成cuboid,再进行正交投影,就可以得到透视投影
只要求得$M_{persp\rightarrow ortho}$就行力


显而易见
$y^\prime=\frac{n}{z}y$
$x^\prime=\frac{n}{z}x$
但$z^{\prime}$仍然不清楚

得到

可推算得

而根据定义,近平面,z不变可知
将$z=n$带入

再由远平面点经过变换f不变,同理可得

由上两式可得

最后得到透视矩阵
$M{persp}=M{ortho}M_{persp\rightarrow ortho}$

思考题:
对于$\frac{n+f}{2}$,经过变形之后,会更加靠近$n$还是$f$?

比较$\frac{n^{2}+f^{2}}{n+f}$与$\frac{n+f}{2}$得
$\frac{n^{2}+f^{2}}{n+f}\geq\frac{n+f}{2}$
更靠近n面

Lec5 Rasterazation Triangle

  • 屏幕是一个数组,数组的单个元素是颜色信息
  • Raster\==screen in German
  • Pixel\==short for “picture for element”

canonical(规范的) cube to screen

  • rules
    1. 用(x,y)的形式表示
    2. x,y为整数
    3. 像素表示范围为(0,0)到(width-1,height-1)
    4. 中心点在(x+0.5,y+0.5)
    5. 因为单个像素占有1*1空间,所以像素实际占据的屏幕空间为(0,0)~(width,height)

view port 视口变换

将之前Transformation得到的$[-1,1]\times[-1,1]$的正方形变换到$[0,width]\times[0,height]$上,$z$先不管
viewport transform matrix

左上$3\times3$负责缩放
第四列负责平移
和$z$有关的都不变

显示原理

显示的图像,存在于显卡的memory中.
告诉显示器读取哪块内存就能展示

LCD

liquid crystal display
用液晶光栅对光偏振进行改变

LED

light emitting diode 发光二极管

electronic ink

triangle Mesh

why triangle?

  • 最基础的多边形
  • 能够用三角形表示其他的多边形
  • 三角形的三个点确保了他们在同一个平面中
  • 内部外部很容易区分,可以用向量的叉积进行判断
  • 定义了三个点$v{1},v{2},v_{3}$ value属性的值,就可以判断三角形内部某个点.value

光栅化方法

采样

对风景采样=拍照
对时间采样=video

将函数离散化的方法

采样算法示例
判断像素中心点是否在三角形中

1
2
3
4
5
6
7
for (int x = 0; x < xmax; ++x)
for (int y = 0; y < ymax; ++y)
image[x][y] = inside(tri,
x + 0.5,
y + 0.5);
# inside 函数的具体实现,依靠叉积判断点是否在三角形中
# 对于中心点在边上的情况,可以自行决断

加速方法

bounding box

用bounding box包围核来减少判断

锯齿问题

信号走样

Lec6 Rasterazation anti-aliasing and z-buffer

Sampling Artifacts (Errors / Mistakes / Inaccuracies) in Computer Graphics

artifacts

  • Jaggies (Staircase Pattern) 锯齿
  • Moiré Patterns in Imaging 摩尔纹
  • Wagon Wheel Illusion (False Motion)

原因:
Signals are changing too fast (high frequency),but sampled too slowly

滤波采样

对原有的信号模糊(滤波)再采样

为什么不能先采样再模糊?
按照下面的理论来看,先采样会有频域的重叠,即使进行模糊之后,频域还是会重叠,导致信号出现较大的差错

Fourier series

傅里叶级数是采样定理原始证明的核心
任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示

Fourier Transform

傅里叶变换的正变换与负变换

通过频率分析,发现,对于变化太快的函数来说,采样不能够很好地体现函数本身的性质
低级傅里叶级数采样 失真较小
高级傅里叶级数采样 失真较大

甚至会有对于完全不同的函数进行采样,结果相同
仅仅通过采样,无法区分两种函数区别
所以才会有aliasing

sample出现aliasing的原因分析

频域与时域

Filtering = Getting rid of certain frequency contents
从时域到频域
越靠外频率越高

怎么样的图像是高频?
画面变化大的地方,边界,经过傅里叶变换之后生成的就是高频信号.
同理,图像变化小的地方,经过傅里叶变换之后生成的就是低频信号.

亮度代表在某个频率下,信号的强度
横竖的两条亮线先不管

高通滤波的效果
仅让高频通过,再经过逆傅里叶变换,生成图像
发现生成的图像是有意义的,大体描述了图像内容的边界


低通滤波的效果
能看到大致的图像,但看不见细节与边界

卷积

filter=average=convolution

在时域上的卷积等于频域上的乘积
同时验证了,卷积=滤波,最左边的频域图像进行类似低通滤波效果的操作之后,变成了最右边的频域

时域上的乘积等于频域上的卷积

bigger box=lower frequency
用越大的box进行卷积,得到的图像越模糊,通过的频率越低

从频域看采样的本质

Sampling = Repeating Frequency Contents
左边为函数的频域
右边为函数的时域
$f(c)$为频域冲击函数
$f(e)$为$f(c)$经过傅里叶变换之后生成的时域冲击函数
$f(a)\times f(c)=f(e)$
$f(b)\otimes f(d)=f(f)$
频域上的乘积等于时域上的卷积

从$f(f)$可知,采样在一直重复某个信号的频谱

如果时域采样越稀疏,频域上,频谱就越密集,重叠在一起就会发生走样

how can we reduce aliasing error

  1. 提升采样率
    拥有更高分辨率的显示器
  2. antialiasing
    先做模糊再做采样
    即低通滤波,把高频去除再采样
    这样即使稀疏采样也能够得到足够好的采样结果

在工程上,把图像模糊,即用低通滤波器,对图像进行卷积
filter之后像素内部的值就是卷积之后的结果
但计算原像素内部黑色占据的百分比不是一件简单的事情,所以我们有一项新技术:MSAA 超采样

超采样

运用于模糊操作这个过程
既然单独计算原像素内部黑色占据的百分比不是一件简单的事情,那我们就在单个像素中进行超采样,将一个完整的像素视为多个小像素的组合.
再次采样后的结果近似于直接计算黑色占比
从而实现更好的抗锯齿效果

  • the cost of MSAA
    增大了计算量

其他反走样方法

  • FXAA Fast Approximate AA
    通过图像对比的方法,直接把锯齿换成没有锯齿
  • TAA Temporal AA
    通过学习上一帧的图像,在静态中效果不错
  • Super Resolution /Super Sampling
    把小图,低分辨率的图,拉大为高分辨率
    DLSS(Deep Learning Super Sampling)

Lec7 shading 1

visibility / occlusion

由于z轴的存在,图像投射到2D上会有遮挡问题

painter’s algorithm

由远及近,对图像进行光栅化
paint from back to front

但对于这种情况,画家算法无能为力
哪个三角形在前,哪个在后,很难排

z-buffering

既然,对于三角形排序存在困难,那不如直接对像素进行排序
Idea:

  • Store current min. z-value for each sample (pixel)
  • Needs an additional buffer for depth values
    • frame buffer stores color values
    • depth buffer (z-buffer) stores depth
      用两个buffer储存数据.一个存生成图像,一个存深度数据

在这里,z的值一直都是正的,且越小越近,越大越远

算法

先认定所有的三角形中的所有像素都会被画出来
通过zbuffer中的值判断
如果该像素是最近的,就更新framebuffer与zbuffer中的值
并且与画三角形的顺序无关

1
2
3
4
5
6
7
8
9
10
//Z-Buffer Algorithm
//Initialize depth buffer to ∞
//During rasterization:
for (each triangle T)
for (each sample (x,y,z) in T)
if (z < zbuffer[x,y]) // closest sample so far
framebuffer[x,y] = rgb; // update color
zbuffer[x,y] = z; // update depth
else
; // do nothing, this sample is occluded

在GPU加速的情况下,性能非常好

复杂度分析

$O(n)$复杂度

深度相同如何处理

没讲…

缺陷

处理不了透明物体

shading

The process of applying a material to an object.
材质处理

shading is local
只看这个点的局部,不管光线的遮挡
不能实现阴影的生成
shading is different with shadow

Blinn-Phong reflectance model

三种光线类型

  • specular highlights
  • diffuse reflection
  • ambient lighting

几个输入数据

diffuse reflection 漫反射

光接受能力

$\hat{l}$与$\hat{n}$的夹角决定能量的接受能力
计算时仅仅考虑单位面积
$\cos\theta=\hat{l}\cdot\hat{n}$

光衰减

把射出的光看作球壳,单位面积上的光强度为$I$
则对于距离点光源距离为$1$与$r$的球壳来说

  • $k_{d}$漫反射系数
  • $I/R^{2}$单位面积的能量
  • $max(0,\hat{n}\cdot\hat{l})$能量吸收率,若$\hat{n}\cdot\hat{l}$为负数,则值为0

为什么与$v$没关系?
由于漫反射对于各个方向都一样,观察$v$在哪个位置没有区别,所以漫反射公式与$v$无关

漫反射公式

Lec8 shading2

shading

Blinn-Phong reflectance modeling

一个简化模型,与现实存在差距

Specular Term 高光

原理

it depends on the direction of your view
当观察角度$v$与镜面反射$R$足够接近的时候,才会观察到高光

高光公式

算法实现上,
判断$R$与$v$的接近程度$\Leftrightarrow$半程向量$\hat{h}$与法线向量$\hat{n}$的接近程度,这样就不需要计算镜面反射.半程向量实在是太好算

求$\hat{h}$只要用$\hat{l}+\hat{v}$,再归一化就行

$k_{s}$为镜面反射系数

为什么不考虑能量被吸收?
blinn-phong把这点简化了.

$max(0,\cos \alpha)$后面为什么会有一个指数?
$\cos \alpha$本身存在变化太慢的问题,不能够很好地表达高光情况,指数$p$越大,值变化更快,高光区域更小

ambient term 环境光照

定义

不依赖于任何东西
从任何一个角度看都一样,与$\hat{v}$无关
从实现效果来看就是进行最基础的颜色填充

This is approximate / fake!
$La = ka Ia$

conclusion

shading frequencies

在着色的时候存在精度问题

  • flat shading
  • gouraud shading
    shading each pixel
    在每个顶点上进行着色
  • phong shading
    shade each pixel

顶点法向量算法

将$v$对应的法向量$n_{v}$视作与$v$有关的面所对应的法向量的和,再进行归一化
简单平均与加权平均都可以

Barycentric interpolation重心插值算法

Graphic pipeline 实时渲染

shader

用来定义对某个像素进行如何操作

编辑了一个基础的根据lambertian shading模型的DiffuseShader

1
2
3
4
5
6
7
8
9
10
11
12
uniform sampler2D myTexture;// program parameter
uniform vec3 lightDir;// program parameter
varying vec2 uv;// per fragment value (interp. by rasterizer)
varying vec3 norm;// per fragment value (interp. by rasterizer)
void diffuseShader()
{
vec3 kd;
}
kd = texture2d(myTexture, uv);// material color from texture
kd *= clamp(dot(–lightDir, norm), 0.0, 1.0);// Lambertian shading model
gl_FragColor = vec4(kd, 1.0);// output fragment color
}

可以在shadertoy.com上联系观看别人的shader

GPU

并行度高,特别适合做图形学的运算
CPU并行计算能力差点意思

texture mapping

模型本身是3D的,而他们的纹理是2D的.
要做到模型上的三角形对应到纹理上的三角形是很有难度的.
我们默认已知

纹理映射

默认$u,v$大小都在$(0,1)$
模型上每个顶点都有一个对应的$(u,v)$坐标
且$(u,v)$坐标已知

纹理的无缝衔接合成

一种方案:Wang tile
可以依靠源砖,来产生相对较好的纹理,拼贴出的结果不会有太明显的重复,且没有周期性
wiki

Lec9 shading3

Barycentric coordinates

定义

坐标角度

在任意的坐标系中,在一个三角形所在的平面上,已知三角形的三个点$A,B,C$,任意点$(x,y)$都可以用$(\alpha ,\beta ,\gamma)$来表示,并且和为1

注意:

  1. 在三角形内部,要求$\alpha ,\beta ,\gamma \geq0$
  2. 由于$\alpha + \beta +\gamma=1$的特性,知道$\alpha \beta \gamma$中的任意两个就可以求得另外一个,未知数其实为2个

    $A=(1,0,0)$
    $B=(0,1,0)$
    $C=(0,0,1)$

几何角度

从面积的角度求重心坐标

不用去记

using Barycentric coordinates

Linearly interpolate values

对于任何一个点,已知其重心坐标$(\alpha,\beta,\gamma)$,可以计算出该点的属性值,例如颜色,亮度,向量等等

可以在投影之前3D空间中的三角形做线性插值,经过投影之后不行
但可以通过逆变换,将二维的三角形变为三维的三角形,再做插值

Texture Mapping

在原来的纹理中,只有三角形顶点的坐标
而经过重心坐标的处理之后,texture中的每一个点$(u,v)$都可以用$\alpha A+\beta Y+ \gamma C$表示
只要在texture上对$(u,v)$进行查询,就可以知道该点对应的纹理的信息(颜色,亮度等等)

从而可以知道在经过光栅化之后的显示器上显示的效果

问题

texture magnification

small case

如果纹理太小了,将到较大的屏幕映射到较小的纹理上有问题.
大集合映射到小集合上,会出现大集合中的多个元素同时映射到小集合的同一个元素上.
从观感上来说,是纹理放大,用一张画去贴图整个墙面,把画放大之后再去贴
几种处理方式:

  • nearest
  • bilinear
  • bicubic

从效果上来看,bicubic最好,bilinear不错,差距主要在眼角的位置.但是bicubic性能开销大

nearest

将pixel坐标映射到纹理坐标上,选择最近的纹理顶点
如图,选择$u11$

疑问:既然前面介绍了重心坐标,可以计算texture上每一个点的属性,为什么还要用这种方法?
和采用的纹理本身有关.这里使用的纹理是由是纹素组成

线性插值 bilinear interpolation

linear interpolation 公式:

对于这幅图来说
从红点的位置可以推算出来两个单线性插值

两个单线性插值能够计算出$u{1},u{0}$
再根据$u{1},u{0}$再进行一次插值

这就是双线性插值,从步骤上看,
第一次插值:四个点插值为两个点
第二次插值:两个点插值为一个点
双线性对应的是$2^{2}$的指数$2$

bicubic

性能开销太大,效果最好

big case

texture太大,而screen太小
一个像素对应的texture范围过大,会造成走样.
从信号的角度看,单个像素对应的texel中,内容变换过快,信号变化频率高,而采样次数太少,从而产生了走样

传统方法处理最右边的情况效果就很差了

处理方式:

  • super-samping

super Sampling

例如单个像素中采样512次,通过提高采样频率避免走样
但是对性能消耗太高

range query

既然采样会出现走样的问题,那我就不采样了😡
对于一个像素包含大范围的texture的情况,进行range query
获取某一像素下对应的纹理区域颜色

mipmap
what is mipmap

Allowing (fast, approximate, square) range queries
仅限于正方形,被操作对象为texture
“Mip” comes from the Latin “multum in parvo”, meaning a multitude in a small space

以原图为$n \times n$为例
在原图的基础上,削减像素数量,为原来的一半,最后图像$level=log_{2}n$.,例如当$n=128$时,最终图为$level 7$
从性能开销上来看,储存仅仅为原来的$\frac{4}{3}$

mipmap的生成是在range query之前完成

左边为屏幕像素,右边为纹理上的texel
如果要对点$(u,v){00}$进行mipmap计算
找到这个点周围距离为一个pixel的几个点,计算它们的textue坐标.再计算中心点与周围点的距离,用最大的$L$值画一个正方形,进行range query
查询的图像的$level=log
{2}L$.
一个像素对应的$L \times L$texel.既然已经对纹理进行过mipmap的操作,那就可以在对应level上查询到$L \times L$的范围内的颜色.
例如,当$L=4$的时候,$level=2$,只要查询$level_{2}$上$(u,v)$坐标对应的块的数据就行

trilinear interpolation 三线性插值

根据不同位置查询的层数的值进行渲染.
但也有这不理想的地方.因为mipmap生成的图是离散的,导致,查询的层数是离散的,两个相邻的像素点,一个查询1,一个查询2,可能结果图像会有一条缝隙,做不到查询1.8层.

优化方法:
三线性插值法
trilinear interpolation

查询相邻的两个level的mipmap,对D level进行一次bilinear interpolation,对D+1 level也进行一次bilinear interpolation.最后对双线性插值的结果进行线性插值.

效果非常漂亮

三线性插值在游戏中经常用到,可以自己开关试试效果

overblur问题

mipmap本身还是存在问题,因为查询的是像素对应的texture范围上的颜色,所以会出现模糊

pixel应该对应的范围是矩形,而mipmap算法用square对应,差错就会很大了

Anisotropic Filtering各向异性过滤

各向异性:各个方向上表现不同

这时候就需要我各向异性过滤来优化,效果很不错

沿着图像对角线为mipmap,横向为横向压缩图,纵向为纵向压缩图

游戏中,各项异性过滤有不同的层数,例如4层,16层等.但是实际上,改变各项异性层数对于性能开销不大.
层数代表在各个方向上运算的次数.2层表示各个方向上压缩两次,
开销为:

而4层,
开销为:

差距非常小
一旦开启各向异性,层数区别不大,并且,无限层的开销趋向于原来的三倍.显存够,开最高就行

可以根据ripmaps查询,比较好处理蓝色的矩形,但对于红色的斜矩形,效果还是差

可以用EWA方法进行优化

Applications of textures

In modern GPUs, texture = memory + range query (filtering).
纹理就是一些内存,使用内存就是内存查询的过程.

Environment Map

你能看到的任何东西都有光照信息

用纹理描述环境光照
将环境光照的texture贴到茶壶上.
光照最好有方向和距离两个定义,单单方向会有问题.

Spherical Environment Map

将环境光记录在球体上

好处在于,方便查询,任意方向的光线,直接在球体上找对应的方向就行,但也有问题

像世界地图一样,上方和下方会有扭曲

Cube Map

用立方体描述环境光
好处在于图像展开没有变形
坏处在于,查询的时候,需要计算下方向才能查找到正确的点

Bump map

如何实现凹凸不平的表面效果?
model可以是一个光滑的球体,而贴图采用凹凸贴图.凹凸贴图上记录一个相对高度信息,或者一个新的法向量,来实现凹凸的shading效果.从而欺骗眼睛.
用复杂的贴图代替复杂的模型

凹凸贴图法向量计算

使用凹凸贴图后的表面

1D 贴图

flatland
求导求切线,再对切线变换,算出向量
注意要对向量进行归一化操作

2D 贴图

处理2D贴图,默认原来表面的向量为(0,0,1)

2D texture上有两个方向,$u,v$,对两个方向分别求导,
再取负数,可得到法向量
注意归一化

displacement mapping

会去真的移动几何结构,例如移动顶点
为了弥补bump map的缺点,在图像边缘,和由于本身高度变换带来的阴影显示效果不好

需要足够精细的模型

3D纹理

定义一个三维的纹理,劈开之后还能看到内部的纹理
实际上并没有纹理,而是一个三维噪声函数,通过一系列的操作,可以得到图形

记录信息

Provide Precomputed shading
先计算好环境光遮蔽,再存储到texture中.

3D Textures and Volume Rendering

三维的纹理

Lec10 Geometry1 Introduction to Geometry

隐式几何 implicit

做光线追踪方便

Algebraic Surfaces

通过对点进行分类,实现的隐式表达.
例如对于球体$x^{2}+y^{2}+z^{2}=1$,对点进行分类,分成符合该式子,与不符合.$(x,y,z)$这个点就是我定义的球体表面上的点.

便于判断某个点在不在面上,但不好列举哪些点在面上,从而不便推断出图像的样子

不好采样

Constructive Solid Geometry (Implicit)

CSG方式
对隐式表达进行布尔运算

signed distance function

表示能力非常强大

求空间中,各个点到边界的距离,并且是有方向的距离(signed).
blend距离,就等于blend他们的边界

level set 水平集描述

从用distance function生成的数据集中,使用插值的方法,找到$f(x)=0$的线,绘制出$f(x)=0$的表面

医疗数据,组织密度渲染

物理仿真

fractals 分形法

类似万花筒,细节非常到位,但控制它生成什么形状存在困难

显式几何 explicit

直接定义或是参数定义

直接

直接告诉三角形的各个坐标,来显式构造球体,

参数映射的方式

对于二维平面$(u,v)$上的各个点,通过一个函数$f$映射到三维空间中,实现显式构造

采样非常方便,判断里外艰难

point cloud

一个$(x,y,z)$的列表就行,是最简单的方法,
绘制对采样的精度要求高.精度过低,效果不好,

polygon mesh

应用最为广泛的图形表达方式
对各种操作的支持度都不错.

.obj格式

v 储存点信息
vt储存纹理
vn储存法向量

f为v/vt/vn

Lec11 Curves and Surfaces

Bézier Curves 贝塞尔曲线

Bézier Curves 之 de Casteljau 算法

进行递归运算,一次减少一个点,最后一个点的轨迹就是该算法得到的贝塞尔曲线
使用的是显式几何,引入时间参数$t$,$t\in(0,1)$,来定义贝塞尔曲线
先找到在$t$时间,$b{0},b{1}$之间的点$b{0}^{1}$,
同理得到$b
{1}^{1},b{2}^{1}$
再处理$t$时间$b
{0}^{1},b{1}^{1},b{2}^{1}$三点,得到$b{0}^{2},b{1}^{2}$
最后同理得到$t$时间的$b_{0}^{3}$

从流程的图来看,
a,b,c,d为控制点

数学定义

总共有$n+1$个点
$b^{n}(t)$为表达最终生成点$b{0}^{n}(t)$的$n$次多项式.
$B
{j}^{n}(t)$是伯恩斯坦多项式

对于四个控制点的贝塞尔曲线应用
${\bf b}^{n}(t)={\bf b}{0}\,(1-t)^{3}+{\bf b}{1}\,3t(1-t)^{2}+{\bf b}{2}\,3t^{2}(1-t)+{\bf b}{3}\,t^{3}$

伯恩斯坦方程具有对称性

Properties of Bézier Curves

例子中是四个控制点$b{0},b{1},b{2},b{3}$的三维贝塞尔曲线
三维贝塞尔曲线,起点是$b{0}$,终点是$b{3}$
在控制点的切线是$b^\prime(n)=3(b{n+1}-b{n})$,系数一定为3
对于仿射变换具有良好性质.控制点直接生成的贝塞尔曲线经过仿射变换,和仿射变换之后的控制点生成的贝塞尔曲线,一摸一样,但对于其他的变换不适用
具有凸包性质.生成的贝塞尔曲线一定在控制点形成的闭包之内.

什么是闭包

最外面的一个圈就是

Piecewise Bézier Curves 分段贝塞尔曲线

对于这样的控制点,生成的贝塞尔曲线,难以控制,并且生成难度高

所以人们选择分段生成贝塞尔曲线
每段由四个控制点生成
衔接的地方不一定平滑

为了描述平滑的情况,提出了不同级别的continuity

  • $C^{0}$ continuity
    几何上的连续
    两段贝塞尔曲线都经过红点
    前段结束点为后段起始点
  • $C^{1}$ continuity
    公共点为左右两点的中点时

其他曲线

splines 样条

有与分段贝塞尔曲线类似的性质,并且更可控.但也更难计算

surface

贝塞尔曲面
用$4\times4$的控制点,两个时间参数$(u,v)$生成
在时间$u$下,每组控制点生成一个新的点,共计四个新点
四个新点在时间$v$下生成新的点,贝塞尔曲面点

mesh

三大主题

  • subdivision 网格细分
  • simplification 网格化简
  • regularization 网格正规化,尽量接近正三角形,大小接近

Lec12 geometry3 mesh

subdivision

loop subdivision

loop与循环没关系,发明这个的人姓loop
First, create more triangles(vertices)
Second, tune their positions
先细分再调整位置

  • 对于新vertices

  • 对于旧vertices
    根据原来点的度来选择权重

catmull-clark subdivision

适用于四边形网格.
奇异点:degree != 4

每有一个非四边形,就会产生一个新的奇异点.
取非四边形的边的中点,再选择一个点与他们相连,破坏原有的非四边形,生成四边形,与一个新的奇异点

调整各个vertice的权重计算

mesh simplification

edge collapse 边坍缩

使用二次度量误差算法Quadric Error Metrics

简单对原来的点求平均的简化算法不够好,提出了二次度量误差算法
二次:点到平面的距离的平方
要求新的位置到原来各个面的距离的平方和最小

二次度量误差的数据结构采用堆(优先队列),能够迅速查询最小值,也能够快速更新

先对最小值的边进行坍缩,更新堆,再对最小值的边进行坍缩.贪心算法

局部最优!=全局最优,但在绝大部分情况下,这样的贪心算法效果很好

shadow mapping

只能处理点光源,只能生成硬阴影(边界没有颜色过度,非常锐利)
点光源没有大小,只是一个点

原图

  1. 记录从点光源方向看去的深度图
  2. 从相机或人眼看过去的点的深度
  3. 比较1,2的深度,来判断是否生成shadow mapping

浮点数本身的比较存在困难.判断浮点数是否相等,被精度问题困扰,比较难.
method:

  • 判断 from eye’s 大于 from light’s,就生成shadow mapping
  • 引入bias,若from eye’s大于 from light’s + bias,就生成shadow mapping

problem with shadow mapping

  • Hard shadows (point lights only)
  • Quality depends on shadow map resolution(general problem with image-based techniques) 不同的分辨率最后的阴影结果不同
  • Involves equality comparison of floating point depth values means issues of scale, bias, tolerance

Lec13 ray tracing 1

光线追踪是另一种成像方式.
主要是为了解决rasterization上的
不足:

  • soft shadow
  • 光的二次,多次反射

    • 间接光照
    • glossy reflection
  • 质量低

  • Ray tracing is accurate, but is very slow

  • Rasterization: real-time(每秒至少30frame), ray tracing: offline

Basic Ray-Tracing Algorithm

三条定义

  • 光以直线传播,忽略波动性
  • 与其他光线碰撞不会发生交互
  • 光线从光源到眼睛(工程上的实现与这个恰好相反,光路可逆性的应用)

ray casting算法

仅仅考虑了光的一次发射,没有考虑多次反射的光线

  1. 从每个像素发出光线
  2. 判断物体与光线的交点,与光源的连线是否有遮挡,判断阴影情况
  • Pinhole Camera Model
    根据与光源的相对情况给进行着色

    Recursive (Whitted-Style) Ray Tracing

    对光线进行多次递归运算,再进行shading.
    光线名称做出分类:
  • primary ray
  • secondary ray
  • shadow ray

    效果也不错

Ray-Surface Intersection (交点)

光线由三个参数来定义.
t为时间 o为原点 d为单位方向向量
光线被定义为射线,只有一个方向

Ray Intersection With Sphere

简单的数学运算

Ray Intersection With Implicit Surface

计算可以用各种方法实现:

  • 利用包,数学运算库
  • 利用试点,优化法

Ray Intersection With Triangle Mesh (最常见的显式表面)

对于给定的mesh与光线,遍历全部三角形求交点.忽略完全平行的请况.
简单但是效率低下

inside与outside判断:
给定一个封闭图形(2D,3D都行),判断一个点是否再图形内部中,从该点射出一条射线,
if(交点数量为奇数)
在图形内部
else if(交点数量为偶数)
在图形外部

平面计算化简法

先算平面与光线的交点,再算交点是否在三角形内

平面的定义:
一个平面法向量$N$与平面上的一个点$P^{\prime}$
平面是点的集合,根据式子

来定义平面

对于平面上的这个点,它既在面上,又在射线上
联立方程可解
最后要检查,要求$0 \leq t < \infty$

Möller Trumbore Algorithm 直接求交

用上克拉默法则

Accelerating Ray-Surface Intersection

每一个像素发出一条射线,每条射线要与每个objects计算,效果非常差

Bounding Volumes 包围盒

将需要计算交点的物体,用包围盒包起来.包围盒一般都是比较简单的物体.长方形,长方体等等
长方体包围盒由三对相对的面来定义
AABB 包围盒,要求与每个面直角坐标系的某个平面平行,

AABB好处在于,计算时间$t$非常简单

bounding box本身是由几对面求∩表达
光线在bounding box内的时间也是如此
先对各对面,求光线进入时间$t{min}$,出去时间$t{max}$.
再求交集,就是对
所有的$t{min}$求最大值 $max(t{min})$
所有的$t{max}$求最小值 $min(t{max})$
暂时不考虑$t_{min}<0$的处理

iff意为当且仅当

Lec14 ray tracing 2 Acceleration & Radiometry

传统的ray tracing算法开销太大,要进行加速优化
Using AABBs to accelerate ray tracing

Uniform grids

在分布均匀的图像中表现较好
不均匀的图像中,表现差

形成规则网格,来加速

对每个小格子进行相交判断.
if(与盒子相交)
计算与物体相交情况
else
跳过

通过盒子不一定与物体有交点
不通过盒子与物体一定没有交点

但盒子的分辨率会导致加速效果.
盒子太少,每个盒子都要计算与物体相交情况
盒子太多,要对每个盒子计算是否相交

最好的盒子数量约为 物体数量的27倍

Spatial Partitions 空间划分

  • oct-tree 八叉树
    在d维度下为n叉树,$n=2^{d}$.
    该特性导致n叉树实际效果不太好,尤其是在高维的情况下.划分难度高,性能要求高
  • kd-tree
    总体来说最好的空间划分方式.运用二叉树与AABB的思想.每次划分一刀,每刀方向不同,但与轴align.例如在二维平面中,先横切,再对每个部分竖切.
  • BSP-tree

kd-tree

内部节点与叶子节点的数据结构

类似于二分查找,对每一个叶子节点求是否相交

但kd-tree本身也有一些缺陷

  • 某个物体可能被多个AABB划分,导致每个AABB对应的叶子节点中都要储存这个物体的信息
  • 给出一个包围盒很难判定它和哪些三角形有交集,也是这个原因最近10年渐渐不用KD树的方法了
    为解决,引入Object Partitions 物体划分 Bounding Volume Hierarchy (BVH)

Object Partitions & Bounding Volume Hierarchy (BVH)

将原有的图形分为好几部分,每一个几何结构只有可能在一个包围盒中出现,即只储存在一个叶子节点中
但也会导致,划分不是严格的划分,bounding box 之间会有相交.质量越好的划分,bounding box 之间的重叠越小

具体划分方法

  • Choose a dimension to split
    类似kd-tree,横竖横竖地顺序划分
  • Heuristic #1: Always choose the longest axis in node
    对于长方形的图像,垂直于长,进行划分
  • Heuristic #2: Split node at location of median object
    尽量从中间的三角形划分,保证划分之后,两个新的叶子节点,所包含的三角形的数量接近,实现平衡二叉树的样子

数据结构

伪代码
1
2
3
4
5
6
7
8
9
10
11
12
Intersect(Ray ray, BVH node) {              
if (ray misses node.bbox) return; //光线和整个BVH节点不相交,什么也不发生

if (node is a leaf node) //如果光线与BVH的叶子节点相交
test intersection with all objs; //和节点内所有物体都求交
return closest intersection; //返回最近的交点

hit1 = Intersect(ray, node.child1); //如果相交的不是叶子节点,那光线与两个子节点都可能相交
hit2 = Intersect(ray, node.child2); //分别与两个子节点求交

return the closer of hit1, hit2; //返回最近的交点
}

Basic radiometry (辐射度量学)

鉴于whitted-style模型是一个简化过之后的光线追踪模型,与实际上的情况有着一定的区别.
辐射度量学就是为了做出更加贴近于现实的光线追踪.
New terms: Radiant flux, intensity, irradiance, radiance
从物理的角度正确表示光线

Radiant flux

Radiant Energy为能量,单位为$Q$,焦耳
Radiant flux(power)为单位时间内的能量,$\phi=\frac{dQ}{dt}$,单位为$W$,或者$lm$,流明 其实就是功率

Radiant Intensity

光源发出的每单位角的光的功率
$I(\omega)=\frac{d\Phi}{d\omega}\;\;\;\;[\frac{W}{s r}][\frac{l m}{s r}=c d=c a n d e l a]$

what is solid angle?
在二维空间中,用弧长与半径的比值来定义角
在三维空间中,用面积与半径的平方来定义立体角

单位立体角
由高等数学计算得出,球体上单位面积对应的单位立体角为$\mathrm{d}\omega=\frac{\mathrm{d}A}{r^{2}}=\sin\theta\,\mathrm{d}\theta\,\mathrm{d}\phi$

用$\omega$来表示单位向量

对于一个向四面八方发射光线的点光源,光照强度相同,且由积分可算得
$I=\frac{\phi}{4\pi}$

Lec15 ray tracing 3

irradiance

在单位面积上的功率

radiance

per unit solid angle,per projected unit area

某个面向某个方向辐射能量
要确定面与方向

  • Radiance: Irradiance per solid angle
  • Radiance: Intensity per projected unit area

Irradiance vs. Radiance

对各个方向的radiance求积分,可以得到irradiance

DRBF Bidirectional Reflectance Distribution Function

描述一个unit area 接受的某个方向上的radiance,经过反射后,会向某方向反射的radiance大小.

BRDF
描述每一个入射光与每一个出射光的关系

The Reflection Equation
对于确定的出射方向,计算各个入射方向的积分.
入射的光线除了点光源,还会有一次反射,二次反射等等之后产生的光线.

rendering equation

除了上方的渲染方程之外,还增加了,观测点本身发光的情况下发出的光源.
求积分,只对上半球体求,下半球体默认为0
$(n \cdot w{i})$就是$\cos \theta{i}$

单个点光源

多个点光源

sum函数求和

面光源

integral求积分
面光源是点光源的大集合
对面光源所在的立体角进行积分

其他物体反射光源

光源不一定来自直接光源,也有可能来自其他的物体反射出来的光源
计算物体反射光线对应的立体角

式子化简

对式子进行数学化简
$(x,w{r})=u$ $(x^{\prime},-w{i})=v$
最后化简为只与L,E,K有关的式子
E为自发光,L为光线,K为由BRDF得到的转换矩阵,将入射光线L转换为出射光线
L, E are vectors, K is the light transport matrix



矩阵也有类似于泰勒展开的性质,对于$(I-K)^{-1}$可以展开为$(I+K+K^{2}+K^{3}+…)$,$I$为单位矩阵.

$E$ 为自发光
$KE$ 为直接光照
$K^{2}E$ 为间接光照
全局光照=直接光照+间接光照

本质就是解方程,计算出变换矩阵$E$和由BFDR定义的$K$就能解出最终$L$的结果

普通的rasterization只对自发光和直接光照处理,虽然也可以处理间接光照,但有难度.

概率论复习

Lec16 ray tracing 4

黎曼积分

对于$f(x)$求积分,黎曼积分方法是,先将积分域内,划分为数量众多的等宽的长方形,对每个长方形求面积,再对面积求sum,最终得到的结果近似积分结果
微元法

Monte Carlo Integration

对于不定积分,最终的计算结果是一个函数$f(x)$
而对于定积分,最终的计算结果是一个值

传统的方法是,先求积分之后的函数,再带入积分域的上下限,从而求得定积分的值.
但对于某些函数来说,对他求积分函数是相当困难的.既然最终结果为值,那就可以绕过函数求解,直接对结果进行近似.

对于积分域,进行采样操作,对每次采样的结果求面积,再求出定积分.再对多次采样的定积分的值,进行平均.
采样法

积分通式:

$p(x)$为采样对应的概率密度函数PDF

采样越多,误差越小
在哪个轴上采样,就在哪个轴上积分

Whitted-Style Ray Tracing 的问题

Whitted-Style Ray Tracing 模型本身存在局限
对于光线的反射只有两种结果

  1. 完全的镜面反射
  2. 光线完全漫反射,并不对漫反射的之后的光线进行处理
    对于处理glossy材质的反射效果较差.

Monte Carlo Solution

只考虑直接光照


最简单的对于半球所有方向平均采样的Monte Carlo 积分
$pdf=\frac{1}{2 \pi}$


伪代码:

1
2
3
4
5
6
7
8
shade(p, wo)
Randomly choose N directions wi~pdf
Lo = 0.0
For each wi
Trace a ray r(p, wi)
If ray r hit the light
Lo += (1 / N) * L_i * f_r * cosine / pdf(wi)
Return Lo

分布式光线追踪

处理直接光照+间接光照

伪代码

1
2
3
4
5
6
7
8
9
10
11
shade(p, wo)
Randomly choose N directions wi~pdf
Lo = 0.0
For each wi
Trace a ray r(p, wi)
If ray r hit the light
Lo += (1 / N) * L_i * f_r * cosine / pdf(wi)
Else If ray r hit an object at q
Lo += (1 / N) * shade(q, -wi) * f_r * cosine
/ pdf(wi)
Return Lo

进行else判断,对没有找到直接光照的点,寻找间接光照

但这样的算法还是有问题
由于要进行采样,每个角度随机发散出光线,每次间接光照的情况都会导致采样指数增长
$n\neq 1$ 这就叫做分布式光线追踪

路径追踪

仍然是工业界最常用的
处理直接光照+间接光照,但与分布式光线追踪不同
only 1 ray is traced at each shading point

1
2
3
4
5
6
7
shade(p, wo)
Randomly choose ONE direction wi~pdf(w)
Trace a ray r(p, wi)
If ray r hit the light
Return L_i * f_r * cosine / pdf(wi)
Else If ray r hit an object at q
Return shade(q, -wi) * f_r * cosine / pdf(wi)

This is path tracing!

但由于光线数量过少,导致结果失真


光线生成

1
2
3
4
5
6
7
8
ray_generation(camPos, pixel)
Uniformly choose N sample positions within the pixel
pixel_radiance = 0.0
For each sample in the pixel
Shoot a ray r(camPos, cam_to_sample)
If ray r hit the scene at p
pixel_radiance += 1 / N * shade(p, sample_to_cam)
Return pixel_radiance

路径追踪代码:

1
2
3
4
5
6
7
shade(p, wo)
Randomly choose ONE direction wi~pdf(w)
Trace a ray r(p, wi)
If ray r hit the light
Return L_i * f_r * cosine / pdf(wi)
Else If ray r hit an object at q
Return shade(q, -wi) * f_r * cosine / pdf(wi)

解决了运算指数爆炸的问题,但还存在问题
The recursive algorithm will never stop!

但简单地限制光线弹射的次数(即限制递归的次数)是不够令人满意的
这必然会造成某些多次反射的光线没有被计算,被舍弃,能量不守恒了🤔🤔🤔

Russian Roulette (RR).

设定一个值P
With probability 0 < P < 1, shoot a ray and return the shading result divided by P: Lo / P
With probability 1 - P, don’t shoot a ray and you’ll get 0
通过概率判定是否要继续path tracing
期望得到的能量与实际上的能量相等

1
2
3
4
5
6
7
8
9
10
11
shade(p, wo)
Manually specify a probability P_RR
Randomly select ksi in a uniform dist. in [0, 1]
If (ksi > P_RR) return 0.0;

Randomly choose ONE direction wi~pdf(w)
Trace a ray r(p, wi)
If ray r hit the light
Return L_i * f_r * cosine / pdf(wi) / P_RR
Else If ray r hit an object at q
Return shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR

递归以概率的方式停下来

算法优化 sampling the light

联系之前,信号与采样的关系可以得出
光源越小,光源周围的信号变化越大,对采样要求越高.
这样对投射出去的光线的浪费也越多

但如果能在光源上采样,就不会浪费性能了.
但也带来一个新问题,Monte Carlo methods要求必须,在哪里采样就在哪里积分.对光源面采样,就一定要在光源面上积分,原来对于半球体的积分函数就要转换

两个积分函数之间的积分域相互联系起来.

对于直接光源部分,采用优化算法,不需要RR
对于间接光源部分,采用原来算法

1
2
3
4
5
6
7
8
9
10
11
12
shade(p, wo)
# Contribution from the light source.
Uniformly sample the light at x’ (pdf_light = 1 / A)
L_dir = L_i * f_r * cos θ * cos θ’ / |x’ - p|^2 / pdf_light
# Contribution from other reflectors.
L_indir = 0.0
Test Russian Roulette with probability P_RR
Uniformly sample the hemisphere toward wi (pdf_hemi = 1 / 2pi)
Trace a ray r(p, wi)
If ray r hit a non-emitting object at q
L_indir = shade(q, -wi) * f_r * cos θ / pdf_hemi / P_RR
Return L_dir + L_indir

最后一个小问题,可能会有物体阻挡在光源与观察点之间
需要增加一个小判断

1
2
3
4
5
6
# Contribution from the light source.
L_dir = 0.0
Uniformly sample the light at x’ (pdf_light = 1 / A)
Shoot a ray from p to x’
If the ray is not blocked in the middle
L_dir = …

misc


Lec17 Materials and appearances

Material == BRDF

Diffuse / Lambertian Material 漫反射材质

假设:
没有自发光
每一条入射光的漫反射都是均匀分布
同时入射光本身也均匀分布
那么某着色点的出射光就等于该点所有入射光在小范围内的积分,再乘上BRDF($f{r}$).

由式子可得,
$f=\frac{1}{\pi}$
设$\rho$为albedo,即颜色反射系数,$\rho \in [0,1]$.
那么完整的$f
{r}=\frac{1}{\pi}$

$\rho$可以是多通道,针对三原色,也可以针对某种原色

Glossy material

不完全镜面反射,表面还是存在凹凸

Ideal reflective material

即为Perfect Specular Reflection

三维空间中的光线需要两个角度来定义.
侧为$\theta$,俯视为$\phi$
$\theta$平行四边形法
$\phi$俯视角投影

难点在于求这样条件下的BRDF值为多少,感兴趣可以自己推导

Specular refraction

折射

右下角的海水也是由光的折射导致的.
由于海水本身的起伏,多道折射光可能射到同一点上,就出现了高光
这种现象叫做caustics,国内翻译作焦散.其实并没有没有散射,翻译不好.

一样也是用$\theta$,$\phi$定义
$n{i}$,$n{t}$是折射系数
$\frac{n{i}}{n{t}} \gt 1$


仍然存在$\cos \theta_{t}$无意义的情况.
光线在这个折射角无法折射.


人在水下的fov-y仅有$97.2^{\circ}$

Fresnel Reflection/Term

不同的入射角,会有不同强度的反射

引出概念Fresnel Term
对于绝缘且$n=1.5$的material来说,
法线夹角与反射率的关系如下,

而对于导体
导体不论任何角度,反射率都极其优秀,镜子都是玻璃再镀银.

S,P极化为光的波动性的体现
一般就取极化平均值

反射率的精准计算:

工程上采用的比较多的是近似方法 Schlick’s approximation
确保
$R{0}=R{eff}$
$R{90}\approx R{eff}$

Microfacet material

神中神,大火都在用的顶级模型.基于物理,模拟光线效果好

Macroscale是从远处看过来的情况,强调是模型材质,忽略细节,视作平整粗糙的一整块,
Microscale,重视表面的凹凸细节,且全部都是镜面反射.采用微元法,把每个微元都看作有自己法线的小镜面

由microfacet的原理来定义材质.

  • glossy是小镜面法线集中
  • diffuse是小镜面的法线分散

从数学上计算Microfacet BRDF

$F(i,)h$定义整体折射率
$G(i,o,h)$定义自身阴影遮挡.当光线几乎平行于平面的时候,遮挡产生阴影.
$D(h)$定义小镜面总体法线的分布情况,判定漫反射

分母项为推导过程中产生的残留

Isotropic / Anisotropic Materials (BRDFs)

各向同性与各向异性材质

  • 物理定义
    由表面的方向性决定.

  • BRDF定义
    对入射出射角,转动方位角,如果BRDF不变,为各向共同性
    否则为各向异性
    各向异性的结果就是一些奇奇怪怪的高光

isotropic只与方位角之差绝对值有关
Anisotropic要求具体的的方位角,即使保持方位角不变的旋转也不行

尼龙是一种接近各向同性的各向异性材质,因为它的表面分布比较有规律

而Velvet天鹅绒的各向同性与各向异性是可以人为改变的.
捋顺冬天的毛毯,就是各向异性
反之就是各向同性

Properties of BRDFs

  • 非负
  • 线性

  • 可逆性
  • 能量守恒

  • 对于isotropic材质,可以进行化简,参数可以变为三个.

Measuring BRDFs

计算化简之后的BRDF与现实之间还是存在差距.

使用机械测量

鉴于BRDF有$\theta{i},\theta{o},\phi{i},\phi{o}$四大参数,测量是一个非常复杂繁琐的过程.4D的数据集保存也很困难
测量流程与优化方法:

各种测量方法:

存储要求:

Lec18 Advanced Topics in Rendering

Advanced Light Transport

  • 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)

有偏与无偏是统计学上的概念

能收敛到的为无偏
不能收敛到的叫有偏
无限采样,无限接近的被叫做一致(consistant)

模糊的就是有偏,无限产生的不模糊就是consistent

从工程的角度看
有偏方法最终的结果可能会与实际差距较大
而无偏方法不管怎么处理,结果都贴近真实
例如下方的Photon mapping
n过大的时候,会产生模糊现象,就是由于Photon Mapping本身是有偏方法,造成n越大,偏差越大

Unbiased light transport

BDPT

双向的路径追踪

光照能量主要集中在某个漫反射上

对于path tracing非常困难
对于BDPT不错.但BDPT实现难度高,运行速度慢

Metropolis Light Transport (MLT)

原理在于,找到一条正确的光路,再在光路周围生成新的推测出来的光路

对于困难的光路比较好用,尤其是specular-diffuse-specular (SDS)这种光路

当然也存在问题咯
无法估计收敛的时间.相较于其他的光线追踪算法,MLT不能较好地估计产生一个比较好的图像所需要的时间
并且由于相邻的像素,在收敛程度上并不存在相关性,导致相邻像素差距较大,噪点过多,图像看着太脏.尤其是在动画方面,前后两帧差距过大,动画不稳定

Biased light transport

Photon Mapping

  • A biased approach & A two-stage method
  • Very good at handling Specular-Diffuse-Specular (SDS)
    paths and generating caustics

原理:

  1. 从光源开始发射光线,不管折射与反射,但要在漫反射的位置停下来.
  2. 从眼睛(相机)开始,发射sub-path,同样,不管折射与反射,在漫反射位置停下
  3. Calculation — local density estimation.求周围$N$个光子对应的面积的密度.$N$人为指定

可以看到,并不是$N$越大,效果越好

这是因为,Photon Mapping 本身是一个有偏的方法.
根本在于,计算密度的时候,我们并不是严格按照定义$\frac{dN}{dA}$,而是计算$\frac{\Delta N}{\Delta A}$(固定数量N对应的面积)
只有当光源,人眼发出的光线越多,$\frac{\Delta N}{\Delta A}$中的$\Delta A$越接近$dA$,效果越好
当接近无限的时候,就能产生consistent的效果

为什么不用固定的$\Delta A$?
很简单,固定的$\Delta A$永远不可能等于$d A$,永远实现不了consistent

Vertex Connection and Merging

A combination of BDPT and Photon Mapping
对于两个sub-path的终点非常接近的情况,会采用Photon Mapping的方法,将终点看作光子,再在两个点存在的面上,计算贡献.从而提高的利用率,减少对于sub-path的浪费

Instant Radiosity (IR)

实时辐射度算法
每个光源产生新的光源.实现用直接光的算法,得到间接光的效果

在diffuse中效果好
无法处理glossy 材质
在边缘会有奇怪的发光点

Advanced Appearance Modeling

  • Non-surface models

    • Participating media
    • Hair / fur / fiber (BCSDF)
    • Granular material
  • Surface models

    • Translucent material (BSSRDF)
    • Cloth
    • Detailed material (non-statistical BRDF)
  • Procedural appearance

    Non-Surface Models

    Participating media

    各种非表面的散射介质(participating medium)fog,could…
    在反射中,我们有BRDT描述
    在散射中,我们有相位函数(Phase Function)描述

    它决定了散射的方向,散射的能量分布,光线传播多远等

rendering方法

需要注意的是,很多看似不是散射介质,而是表面材质的东西,其实也是散射介质.
例如这只巧克力兔子,液体的内部仍然是散射材质,只是不明显,光线很快会在内部消失

Hair Appearance

Kajiya-Kay Model

将毛发视作一个圆柱
光线在一个圆锥的范围内进行散射,效果一般

Marschner Model

T为折射
R为反射
TT即穿过毛发,发生两次折射

cuticle为头发表面,由角质组成
cortex为内部,不同颜色的毛发有不同的,由色素决定的cortex,也能吸收光线

效果非常漂亮

Fur Appearance

直接套用人类头发模型效果不够好

原因在于,动物毛发与人类头发本身就存在差异
头发被分为三级,cuticle,cortex,medulla,由于人类的髓质(meddula)本身就比较小,用单个cylinder模型,效果也不错,但是对于动物而言,毛发的髓质层较大,忽略之后,效果差距明显

改用Double Cylinder Model

$TRT^{s}$意为穿透-经过髓质-反射-穿透
其他同理

从之前的三层变为五层结构,增加了$TT^{s}$与$TRT^{s}$层,可以看出它们对于结果的贡献也是极大的

Granular Material

颗粒材质

目前处理得还不够好,难度很高

Surface Models

Translucent Material 通透材质

相较于BRDF,增加了表面下的光线散射,叫做BSSRDF.
SS应该就是Subsurface Scattering

与BRDF类似,对于面积和角度进行积分.但计算极为困难

因此提出近似方法Dipole Approximation

在表面下生成一个光源,对应的表面上的位置也生成一个光源
可以看到模拟人的皮肤,玉石的效果都很好

Cloth 布料模拟

物理上的组成情况
fibers->ply->yarn->cloth

有三种比较主流的渲染方式

  • BRDF
    简单有效
    受材质限制:
    对于类似天鹅绒这种本来就不在一个平面上的材质来说,效果差
    对针织,在一个平面上的材质,效果好

  • Render as Participating Media
    当作散射介质进行渲染,与对云烟的渲染类似
  • Render as Actual Fibers
    最最暴力的算法,直接对每一根纤维进行渲染

Detailed appearance

这样子的茶壶虽然效果很好,但不够真实.
原因在于相对于现实世界中缺少的细节:各种划痕


将上面两幅合成之后的效果就好多了

在传统的微表面模型中,$D(h)$是理想化的

法线的高斯分布是极其均匀的.但在正常的情况下,应该是大体符合,部分不同.这就是缺少的细节.

但要对这样充满细节的镜面模型进行渲染开销很大.
path sampling经常会出现miss现象

Solution: BRDF over a pixel
对一个规定区域内,求它们的平均法线方向来代替每个微表面的方向

范围越小,细节约多,范围越大,越贴近高斯分布,细节越少

不同范围有不同的P-NDF
不同的材质也有不同的P-NDF

Wave Optics

在某些情况下,会有波动光学的特性体现出来


非常困难

Procedural Appearance

生成式 表面
利用noise函数生成
生成的结果是三维的内容.相较于表面材质,物体的内部材质也可以通过noise函数查询到.

Lec19 Cameras, Lenses and Light Fields

Imaging = Synthesis + Capture
从成像的角度来看,除了之前的光栅化与光线追踪的虚拟成像之外,还有最最原始的方法,捕捉.
利用小孔成像或者lens+sensor进行成像

What’s Happening Inside the Camera?

两大派别:

  • Pinholes
  • Lenses Form Image on Sensor

    Pinholes

    小孔成像的结果存在问题,所有地方都不会出现应该有的虚化.
    因为小孔成像没有焦距的概念,成像缺乏深度信息,自然没有虚化,景深

Lenses Form Image on Sensor

shutter(快门)控制曝光期间的进光量(irradiance)
Sensor Accumulates Irradiance During Exposure

如果缺少lens,单单一个传感器,就会导致记录所有的光线,成像得到的每个pixel都很接近.
因为sensor本身只会记录irradiance,不能区别进光的方向,记录不了radiance.
Sensors Without Lenses

Field of View (FOV)

可以简单计算得FOV与$f,h$的关系
$h$不变,$f$越大,FOV越小
$f$不变,$h$越大,FOV越大

由于历史性的原因,$f$值往往都是参考35mm-format film的标准转换来的

在手机的小底上保持相同的FOV,就需要更小的$f$

Exposure

Exposure = time * irradiance
time controlled by shutter
irradiance controlled by lens aperture(光圈) and focal length

除了光圈大小与快门速度外,还有一个ISO增益.
三者都能影响最后成像的曝光度

  • 光圈:
    $F$越大,光圈越小,挡光越强,越接近于小孔成像,深度信息越少,景深越少
    对曝光的影响为指数.$(\frac{F{1}}{F{2}})^{2}$
    $F2.0$与$F4.0$,前者亮度为后者4倍,越小光圈越大,越亮
  • 快门:
    快门时间越短,记录的时间信息越少,动作越静止,成像越清晰
    对曝光的影响为线性.$1/30$与$1/15$,后者为前者亮度的两倍

标红的几组,在亮度上几乎没有区别,但成像结果也并非是一摸一样
景深与动作模糊存在区别

  • ISO:
    ISO越小,信号放大增益越小,噪点信号与周围信号差距越小,噪点越不明显
    乘法计算,且放大效果为线性.12800比100放大128倍
    Multiply signal before analog-to-digital conversion
    Linear effect (ISO 200 needs half the light as ISO 100)

shutter side effect

  • motion blur
    Doubling shutter time doubles motion blur

  • Rolling shutter
    快门的开关不是一瞬间发生的,而是一个过程.这就会导致某些地方的光先被sensor接收,某些地方后被接收,成像时间上存在先后顺序
    螺旋桨位置就因此发生了扭曲

Fast and Slow Photography

High-Speed Photography

Long-Exposure Photography

Aperture

F-N定义为焦距除以直径

The Thin Lens Equation/Gaussian Thin Lens Equation

将正常的复杂镜头组视作简单的薄棱镜,来解释各种现象

简单的光学定理,由相似三角形推导得出


Defocus Blur

不能正好出现在成像平面上的物体,会产生一个Circle of Confusion (CoC),造成景深模糊的效果.

用相似三角形的原理可以计算得出CoC大小
并且光圈越大,即$F$越小,CoC越明显
$A$为光圈的直径.
将$A=\frac{F}{N}$带入得

Depth of Field


景深大小也受到别的参数的影响

what is small enough?
如果成像大小为一个像素或者比一个像素小,就算是锐利的图像.反应到图上就是Depth of focus这个范围内成像,都被认为没有CoC

$D{F}$为最远,$D{N}$为最近,$D_{S}$为Sensor所在的位置


在线演示中还能看出越$F-N,f$等参数的联系

Renderings with Lens Focus

示例

计算过程

Lec20 Color and Perception

Finishing up light field / lumigraph
Color
• What is color
• Color perception
• Color reproduction / matching
• Color space

The Plenoptic Function (全光函数)

最完整的全光函数有七大参数
分别表示方向$\theta,\phi$,颜色$\lambda$,时间$t$,位置$V{x},V{y},V_{z}$

去掉颜色为黑白
去掉时间为静态照片
去掉位置为固定位置,不能移动

全光函数的光线表示

  • 5D,起点与方向五个参数
  • 4D,2D点与2D方向

Light Field / Lumigraph 光场

一个三维的物体,只要两个参数就能在它的表面贴图中找到对应的位置.再来一个2D的方向,就能确定出一条光线

记录这全部信息,得到的就是光场.在光场中进行简单地查询,就能得到从某个方向看向某点的结果

$2D position+2D direction=2D position+2D position$

进行替换,每个点由两个参数表示.分别为$(u,v)$ $(s,t)$
并且物体在$(s,t)$的另外一面

固定$(u,v)$,变化$(s,t)$,得到的是相机从$(u,v)$观察物体的结果,与成像相同
但固定$(s,t)$,变化$(u,v)$,得到的结果很奇怪

Light Field Camera

苍蝇的复眼就是光场照相机.
在原本成像的位置,加上了透镜,使得已经完成聚焦的光线,被拆分开来,从irridiance变为ridiance,增加了方向性.

光场相机的优点在于,方便后期调节焦距,甚至镜头位置.

原理与苍蝇的复眼相同

如何在后期处理的时候,改变相机位置?
只要某个固定方向的radiance,就可以得到视觉效果.例如图中得到的是从下往上看.

根本的原因在于记录的是光场信息.处理光场信息得到不同的结果

也有一些问题

Color

光谱

SPD

Describes distribution of energy by wavelength

太阳与天空的SPD

SPD是线性的,直接相加就行
开两盏灯就是两倍的亮度

Biological Basis of Color


有柱形感光细胞,锥形感应颜色细胞.锥形有三种SML

SML对不同的波长感应不同
spectral response curve

每个人的SML也有所不同

最终的结果是对响应曲线的积分,得到SML三个数,再把三个数传递给人脑

Metamerism 同⾊异谱

SML三个值影响了最终的颜色.而SML是由积分得到的,也就是说,存在不同的频谱,但是得到的SML值相同.
同⾊异谱的现象存在发生的可能.
一样的太阳不同的频谱

Color Reproduction / Matching

我们使用的是加色系统,几种色彩混合的结果趋近于白色.
而现实生活中是减色系统,多种色彩混合的结果趋近于黑色

增色系统由RGB三大参数决定

可能存在RGB某个值是负的情况

匹配函数

对匹配函数进行积分,得到的就是最终的RGB值
例如在500nm波长位置,积分得到的RGB值,就是500nm波长光线的RGB表示的最终结果

Color Spaces

CIE XYZ

A Universal Color Space.
是一种人为构造的匹配函数,在科学界使用比较广泛
由$XYZ$三个参数确定,$Y$用来表示亮度

HSV Color Space

CIELAB Space Lab

lab系统是由人类的视觉生理特点实验得到

红绿为互补色
蓝黄为互补色
所以才会在ab轴相反方向上采用不同的颜色

Gamut (⾊域)

Different color spaces represent different ranges of colors
So they have different gamuts, i.e.
they cover different regions on the chromaticity diagram

不同标准的色域有着不同的色度图覆盖范围

以CIE $XYZ$为例
$xyz$是由$XYZ$归一化之后得到的.
如果把色域放在三维空间中展示,结果不够直观,并且也不好打印到书本上
所以要减少参数.
由于$x+y+z=1$,只需要$xyz$中的两个就够.
因为$Y$用来表达亮度,所以可以固定$Y$的值.
最终只要$XZ$就行.可视化的结果只要$xy$两轴.
Chromaticity Diagram 色度图

白色是最不纯的,越靠近边缘颜色越纯
White at the centroid of the plot (1/3, 1/3)

Opponent Color Theory

There’s a good neurological basis for the color space dimensions in CIE LAB

  • the brain seems to encode color early on using three axes:

    • white — black, red — green, yellow — blue
  • the white — black axis is lightness; the others determine hue and saturation

互补色对于人来说是不能融合的.例如,有黄绿蓝绿深绿,但没有红绿.
还有一个有趣的实验GAMES101-现代计算机图形学入门-闫令琪 1:24:35

color is relative

not only color,everything is relative.
就像音乐中,绝对音准虽然很酷,但最重要的还是相对音准.
在颜色中,重要的是相对,而不是绝对的RGB,或者其他颜色空间的参数.


Subtractive Color Space

减色系统 CMYK
C为蓝绿,M为品红,Y为黄,K为黑

为什么有K呢?
应用中,黑色比较常见,便宜,用CMY来混,成本高

Lec21 Animation

An extension of modeling
Represent scene models as a function of time

Animation应用视觉残留的原理,短时间输出大量image,得到动画

history

Keyframe Animation

插值法

插值也有Linear interpolation和smooth / controllable interpolation
线性插值效果比较差

Physical Simulation

布料模拟,液体模拟


Mass Spring System

质点弹簧系统
Example of Modeling a Dynamic System
Mass Spring Rope,头发,Mass Spring Mesh模拟

Mass Spring System在布料模拟的效果很好

spring

弹簧的情况从最简单理想到最复杂写实

  • A Simple Spring
    原长为0
  • Non-Zero Length Spring
    会有永远简谐振动

引入摩擦力简单模型.
对于质点,有相反方向的摩擦力.
有如下问题:

  1. 当弹簧下落时,会受到$f$的阻力,且$f$远大于实际上的空气阻力,下落速度减慢
  2. 所有质点的运动速度都会变慢

    改进
    $\frac{b-a}{||b-a||}\cdot(\dot{b}-\dot{a})$为相对速度与弹簧方向的点乘,结果为相对速度在弹簧方向上的投影,是一个标量
    解决了上面的两个问题.同时保证了,当一点不动,另外一点做匀速圆周运动时,$f=0$.

Structures from Springs

对于弯折裁切(shear)的力量模拟不好

加上比较强的对角线弹簧,就能抵抗住裁切力了

但是bending问题没有解决
在间隔相邻的质点之间加上红色弱弹簧,就可以啦,模拟布料的效果很好

FEM (Finite Element Method)

除了质点弹簧系统外,还有有限元方法,模拟仿真也很好,就是代码实现困难

Particle Systems

粒子系统.

流程上很简单,实现困难

除了比较普通的作用力,还要考虑很多

除了这样的粒子系统外,还有一些更复杂的

鸟群模拟

人群

Forward Kinematics

正向运动学

对于使用不方便

Inverse Kinematics

不关注关节的运动,只关注最终结果的点
创作者决定终点,电脑决定关节的状态

如果用正向运动学推导…结果感人

逆向运动学存在多解或无解,也是要解决的.

有些优化算法

Rigging

类似提线木偶上的线,控制角色动作.翻译不好翻译
就是角色上的控制点

用控制点控制角色

用插帧的方法控制

Motion Capture

动补技术

效果上看非常真实,但是昂贵

实际生产中,多用控制点与摄像头的方法

The Production Pipeline

生产管线