《GAMES101-现代计算机图形学入门》学习笔记

图形学和计算机视觉
计算机视觉:从图片到模型
图形学:从模型到图片

  • 3d怎么投影到2d
  • 仿真
  • 曲线生成
  • 光栅化

地址:www.bilibili.com/video/BV1X7411F744

线代

A^T: 转置
向量的点乘:两向量长度,乘cos夹角,方向为两者之和。在图形学中通常用来算夹角
向量的叉乘:两向量长度,乘sin夹角,方向和两向量所在平面垂直。可以用来判断左右关系、点和三角形的内外关系(算三角形包裹几个像素)等

a × b = (ya*zb-yb*za, za*xb-xa*zb, xa*yb-ya*xb)
a × b = -b × a
右手定则:从a绕道b,大拇指方向为叉乘方向

矩阵

用于图形学的:移动、旋转、缩放、错切、切变

性质:

  • 没有交换律
  • 有结合律和分配率

矩阵的转置:
i行j列 -> j行1列
(A * B)^T = B^T * A^T

矩阵的逆:
A*A^-1 = I(单位矩阵)
(A * B)^-1 = B^-1 * A^-1

伴随矩阵:a和b叉乘的矩阵形式

模型变换

model

非齐次坐标

缩放矩阵:x缩放sx倍率,y缩放sy倍率
\(\begin{bmatrix} sx & 0 \\ 0 & sy \\ \end{bmatrix}\)

切变矩阵: y轴右拉a距离
\(\begin{bmatrix} 1 & a \\ 0 & 1 \\ \end{bmatrix}\)

旋转矩阵:默认逆旋转,逆旋转x度
\(\begin{bmatrix} cosx & -sinx \\ sinx & cosx \\ \end{bmatrix}\)

平移变化:非线性变换,因此无法表示

齐次坐标

因为平移变换无法用同阶矩阵表示,因此升维处理。即齐次坐标

齐次坐标中 (x, y, w) = (x/w, y/w, 1)

齐次坐标的点:
\(\begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix}\)

齐次坐标的向量:
\(\begin{bmatrix} x \\ y \\ 0 \\ \end{bmatrix}\)

点和向量 1和0 不同的原因:确保向量平移后是不变的
vec + vec = vec
pot - pot = vec
pot + vec = pot
pot + pot = pot / 2(中点)

平移变化:
\(\begin{bmatrix} 1 & 0 & tx \\ 0 & 1 & ty \\ 0 & 0 & 1 \\ \end{bmatrix}\)

仿射变换 = 线性变换 + 平移变换:
最后一行是 (0, 0, 1)
\(\begin{bmatrix} a & b & tx \\ c & d & ty \\ 0 & 0 & 1 \\ \end{bmatrix}\)

逆变换

目标点乘逆矩阵即可

旋转矩阵的逆,就是旋转矩阵的转置。这种矩阵被称作正交矩阵

变换顺序

先线性变化,再平移

根本原因是矩阵不满足交换率,不同的操作顺序会影响结果

过原点轴旋转

罗德里格斯(Rodrigues)旋转方程:

其中n表示过原点的轴的矩阵,I表示单位矩阵

非原点旋转

先把目标点移动到原点(T(-c)),经过旋转后,再移回去(T(c))。最终结果T(c)*R(a)*T(-c)

任意轴旋转

先得到一个交于原点的旋转轴和旋转角度,得到了之后只需要根据轴角公式旋转即可

三维空间的旋转

分别绕着三条坐标系旋转(原则:绕谁谁不变)
Rx(a) =
\(\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & cosa & -sina & 0 \\ 0 & sina & cosa & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\)

Ry(a) =
\(\begin{bmatrix} cosa & 0 & sina & 0 \\ 0 & 1 & 0 & 0 \\ -sina & 0 & cosa & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\)

Rz(a) =
\(\begin{bmatrix} cosa & -sina & 0 & 0 \\ sina & cosa & 0 & 0 \\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\)

四元数

四元数可以表示为x = a + bi + cj + dk,其中包含i,j,k三个虚部

优点:

  • 可以避免万向节锁现象;
  • 只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;
  • 可以提供平滑插值;

缺点:

  • 比欧拉旋转稍微复杂了一点点,因为多了一个维度;
  • 理解更困难,不直观;

对比欧拉旋转的问题:
优点:

  • 很容易理解,形象直观;
  • 表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元数;

缺点:

  • 之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;
  • 会造成万向节锁(Gimbal Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。
  • 由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;

视图变换

view

定义一个相机:

  • 相机的位置:e
  • 相机拍摄的方向:g
  • 相机向上的方向(用来确认相机的旋转角):t

相机原点

默认相机在原点的位置,朝向-z,垂直y

移动方式就是把上面的egt分别乘以移动矩阵:g to -z, t to y, (g × t) to x
结果:
R(view) = \(\begin{bmatrix} x(g×t) & y(g×t) & z(g×t) & 0 \\ x(t) & y(t) & z(t) & 0 \\ x(-g) & y(-g) & z(-g) & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\)

正交投影到透视投影

\(\begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0\\ \end{bmatrix}\)

投影变换

projection

  • 正交投影
  • 透视投影

透视投影 R(pers) = \(\begin{bmatrix} \frac{2N}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2N}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{F+N}{F-N} & \frac{2NF}{F-N}\\ 0 & 0 & -1 & 0\\ \end{bmatrix}\)

光栅化

把模型数据,转换成像素数据

可视角度

fovY:垂直距离可视角度

tan(fovY / 2) = t / |n| (t为可视高度,n为相机距离)

采样

如何判断一个像素是亮还是不亮,则看像素点是否在三角形内,用点和向量的叉积判断

采样中的artifacts

  • 锯齿
  • 摩尔纹
  • 车轮倒转

本质原因是:信号的变化过快,采样的速度跟不上。再根本的原因是,同一个采样频率可能会无法区分两种不同频率的信号

图片时域和频域变换

  1. 白色表示剧烈变换的信息。越靠近中心点表示越低频
  2. 横竖两条表现出现的原因:分析边界点的时候,是以图片另一边的点,来判断变换频率的。通常图片两边对不上,所以会出现非常强烈的变化,表现在图像上,就是两条无限长的线

时域的卷积 = 频域的乘积

抗锯齿算法

antialias

  • MSAA:多重采样,然后得出模糊后的结果,再采样
  • FXAA(Fast Approximate AA)
  • TAA(Temporal AA)

超分辨率

  • DLSS(Deep Learning Super Sampling)

成像

  • 画家算法(nlogn): 先绘制最远的物体,再绘制近处的物体。但是无法解决两两互相覆盖的情况。
  • 深度缓存算法: 存储每个像素点的深度。用framebuffer存储颜色信息,用zbuffer存z信息

shadow mapping

  • 硬阴影:点光源产生的边角很明显的阴影
  • 软阴影:体积光源产生的边角比较模糊的阴影

光线记录离自己最近的z值,然后用眼睛看到的点的z值和之前记录的光线的z值比较,如果相等,说明能够看到。

缺点:会产生走样。因为相等的判断有误差

着色(shading)

定义:对不同物体应用不同材质。不同材质对光线的作用是不同的

Blinn-Phong反射模型

物体的光 = 环境光 + 漫反射 + 镜面反射

L = La + Ld + Ls

漫反射

  • lambert's cosine law: 亮度的百分比,和cos(光线和法线的夹角)成正比
  • 光衰减: 光的强度和距离的平方成反比

由上面两个定义推出lambertian漫反射着色公式

Ld = kd (I/r^2)max(0, n·l)

其中ld是漫反射光强度,kd是漫反射系数,I是点光源光强,r是点光源到物体表面的距离,n是物体表面法线,l是入射光矢量

镜面反射

半程向量:视角和光线向量的角平分线

h = v + l / ||v + l||

得出镜面反射公式:

Ls = ks(I/r^2)max(0, n·h)^p

其中h是半程向量,p是用来控制高光范围的

环境光

这里假设环境光是一个常数

La = kaIa

着色频率

  • 平面shading: 对面做着色
  • 高洛德(gouraud)shading:对点做着色,然后三角形内做插值
  • phong shading: 对上面的插值的每个像素做着色

顶点的法线计算方式:相连的所有面的法线相加(也可以改成加权平均,比如按照面积来算权值)

Nv = ∑iNi / ||∑iNi||

三角形插值

重心坐标(α, β, γ): 三角形ABC所在平面中的任意一个点,满足以下公式

(x, y) = αA + βB + γC
α + β + γ = 1
如果点在三角形内,则α β γ都非负

计算方式:

α = Aa / (Aa + Ab + Ac)
β = Ab / (Aa + Ab + Ac)
γ = Ac / (Aa + Ab + Ac)
A表示面积。点和三角形三点相连之后会出现三个三角形,Aa就是A这个点对面的那个三角形面积

note: 重心坐标在三维空间中的投影位置会发生变化,所以在投影时,先计算三维空间中的插值,再计算投影结果

三角形重心的重心坐标

(α, β, γ) = (1/3, 1/3, 1/3)
(x, y) = A/3 + B/3 + C/3

即时渲染管线

顶点数据(建模)->三角形(几何处理)->像素(光栅化)->着色像素(着色处理)->拼接+输出

纹理映射

UV坐标: 类似x和y,范围是0-1

双线性插值

当屏幕分辨率很高,但是纹理分辨率很低时,会出现纹理一格一格显示的情况(原因是四舍五入取纹理)

因此引入双线性插值,用于平滑过渡低分辨率纹理中非整数坐标的取值

双线性插值:去临近四个texel(纹理像素),取对应位置的加权平均值

插值定义
lerp(x, v0, v1) = v0 + x(v1 - v0)
双插值
u0 = lerp(s, u00, u10)
u1 = lerp(s, u01, u11)
u00左下,u10右下,u01左上,u11左下
最终插值
f(x, y) = lerp(t, u0, u1)

mipmap

当屏幕分辨率很低,但是纹理分辨率很高时,因为一个像素覆盖多个纹理,会导致走样现象

因此引入mipmap,用于查询纹理范围内的均值

mipmap
类似线段树一样,预存储低分辨率纹理的结果。前提:只能求类似正方形。

然后根据像素在纹理上的步长,算出覆盖纹理的近似正方形的边长L。然后在对应的D=log2L层找到结果。

但是这里有个问题,就是如果出现一部分像素在a层,一部分像素在b层,可能会因为纹理不连续导致出现图像断层。
为了解决这个问题,引入三线性插值

三线性插值
现在a层做双线性插值,再在b层做双线性插值,最后两个结果再做双线性插值
各向在·异性过滤
是为了解决mipmap处理长条形的采样纹理出现的过渡模糊的问题。注意:只能解决矩形,无法解决斜着的矩形。
EWA过滤
能够处理不规则图形

纹理

cube map
球体每个点的法线,映射到包围盒上,产生的纹理方块
凹凸贴图
纹理上定义每个点的“假”的法线,然后着色后,会得到有凹凸感的物体,欺骗眼镜。实际上几何形体不变
法线贴图
不改变几何形体的基础上,扰动物体表面的法线
位移贴图
会真的移动几何形体的顶点。这种贴图要求形体三角形的间隔频率超过纹理频率
漫反射贴图
漫反射贴图表现了什么? 列举一下,物体的固有色以及纹理,贴图上的光影。通过颜色和明暗来绘制一幅漫反射贴图
曲面细分
根据需要来细分三角形
平面上点的法线计算
n = (-dp/du, -dp/dv, 1)。前者是u方向上的偏导数,后者是v方向上的偏导数。
dp/du = c1 * [h(u+1) / h(u)]
dp/dv = c2 * [h(v+1) / h(v)]

其中,上面的h是纹理变化后的曲线

几何

隐式表示
用表达式表示一个几何,而非三角形。f(x,y,z) = 0,满足此表达式的所有点,表示一个几何
优点是方便判断点和几何的位置,缺点是不明显
显示表示
(u, v) -> (x, y, z)。平面中的每个点对应空间中的一个点
优点是明显,缺点是不方便判断点和几何的位置
SDF
用距离函数表示点到不同物体的距离,然后相加之后,再做恢复。这个过程叫做blend
分型
图像递归(套娃)

显示表示

方法:

  1. 点云
  2. 多边形面

贝塞尔曲线

德卡斯特里奥算法
假设一个[0, 1]区间内的时间t,在每个线段上,找到t位置的点,两两连接之后,递归找t位置的点和连接,最后只会剩下一个点,就是这个曲线上时间t的点

n阶贝塞尔曲线点计算公式:

\[b^n(t)=b^n_0(t)=\sum_{j=0}^n b_jB^n_j(t) \]

其中 \(B^n_j(t)\) 为伯恩斯坦多项式(二项式展开)

\[B^n_j(t)=\begin{pmatrix} n \\ i \end{pmatrix}t^i(1-t)^{n-i}\]

性质:

  • 仿射变换后不变
  • 曲线一定在控制点的凸包内

逐段贝塞尔曲线

通常用每四个控制点决定一段曲线

\(C_0\)连续:前一段曲线的终点 = 后一段曲线的起点
\(C_1\)连续:前一段最后一个线段的长度 = 后一段第一个线段的长度

B样条曲线

比起逐段贝塞尔曲线,更注重修改时的局部性。

网格操作

  • 网格细分
  • 网格简化
  • 网格规整化

网格细分

先做细分,再做调整

loop细分

前提:只有三角形网格能用

细分

每条边取中点,然后相连

调整

中点计算: 3/8(A+B) + 1/8(C+D)

其中AB是中点所在线的顶点,CD是所在四边形另两个顶点

顶点计算:(1 - n * u) * ori_pos + u * neighbor_pos_sum

其中n是顶点的度,u的计算方法:

if (n == 3)
	return 3/16;
else
	return 3/(8*n);

Catmull-Clark细分

优势:更容易处理四边形面

歧义点
度不为4的点
细分

细分方法:每条边取中点,面里面选取中点,然后面的中点和边的中点相连

细分后的两个特性:

  1. 每有一个非四边形面,会增加一个歧义点
  2. 细分后,全部变成四边形面
  3. 后续再细分,将不会增加歧义点
调整

面的中点: f = 面的顶点和 / 顶点数
边的中点:e = (两顶点和 + 相邻两面中点f之和) / 4
原来的点的调整:p' = (相邻四面中点和 + 2 * 相邻四边中点和 + 4 * p) / 16

网格简化

边坍缩

二次误差度量:新的点,到原来所有点的距离的平方和最小

流程:

  1. 用贪心算法,优先选取二次度量误差小的边
  2. 坍缩之后,用优先队列维护变化后的数据

光线追踪

光栅化遇到的困难

  1. 着色只关注自己,无法处理阴影。
  2. 光线多次弹射比较难处理

whitted-style光追

光线不断弹射,将最终所有光的结果加起来

缺点:

  1. 漫反射做不了。因为只考虑镜面反射,遇到漫反射认为不弹射
  2. 模糊做不了。因为这里的光是一条线,而不是一个锥体

射线和平面求交

平面上一点p
点法式:(p - p')·N = 0
ax + by + cz + d = 0

MT算法

\[O + tD = (1- b_1 - b_2)P_0 + b_1P_1 + b_2P_2 \]

根据克拉默法则,变成:

\[\begin{bmatrix} t \\ b1 \\ b2 \end{bmatrix} = \frac{1}{S_1 \cdot E_1} \begin{bmatrix} S_2 \cdot E_2 \\ S_1 \cdot S \\ S_2 \cdot D \end{bmatrix}\]

其中(上面和下面大写的都是向量):
\(E_1 = P_1 - P_0\)
\(E_2 = P_2 - P_0\)
\(S = O - P_0\)
\(S_1 = D \times E_2\)
\(E_1 = S \times E_1\)

判定是否在三角形内:

  1. t < 0
  2. b1 >= 0, b2 >= 0

光线判交加速

包围盒加速

如果光线和包围盒都碰不到,说明一定不会有交

AABB(轴对其包围盒)
每条边平行于坐标轴的包围盒
  1. 对于每个对面,都存在最小和最大进入时间\(t_{min}\)\(t_{max}\)
  2. 因此对于一个3d盒子,\(t_{enter}\) = max{\(t_{min}\)}, \(t_{exit}\) = min{\(t_{max}\)}
  3. 如果 \(t_{enter}\) < \(t_{exit}\) 则认为和盒子有焦点

考虑特殊情况:

  1. \(t_{exit}\) < 0 : 说明光线在盒子后面,因此不在盒子里面
  2. \(t_{exit}\) >= 0 and \(t_{enter}\) < 0 : 光线起点在盒子里

因此: \(t_{enter}\) < \(t_{exit}\) && \(t_{exit}\) >= 0 则认为光线和AABB有焦点

体素化

包围盒再细分成一格一格的小格子,然后光线对一个个格子求交

优缺点:适合紧密的场景,不适合疏松的场景

空间划分

  • oct-tree: 八叉树
  • kd-tree: 每次做一次划分,且按照xyz循环划分
  • bsp-tree: 不按照水平轴划分

KD-Tree

通过划分形成一个二叉树,然后只要某一个节点有交,则进入所有子节点;如果没交,跳出逻辑

存在问题:三角形和盒子求交很难

BVH

划分的不是空间,而是划分物体。把物体分成两堆,然后求它的包围盒。

划分方式:

  1. 每次划分,按照最长的轴划分,让他变短
  2. 找到中间的物体,按照这个物体划分。能够保证这个树平衡

辐射度量学

用于精确的定义光(物理意义上)

名词定义

  • radiant energy: 光的能量,单位J
  • radiant flux(power): 单位时间的能量,单位W(瓦特)
  • radiant intensity: 单位立体角的能量,单位candela(简称cd)
    • 如果点光源是均匀扩算的,点光源强度 = 4π * intensity
  • 立体角: 和度类似,[ 对应球面的单位曲面 / r^2 ],球的立体角是4π
  • irradiance:单位面积上的能量,单位lux(w/m^2)。投影到垂直方向上的面积
  • radiance:单位立体角、单位照射面积上的能量,单位nit(W / srm^2)

BRDF,双向反射分布函数

\[f_r(w_i \rightarrow w_r) = \frac{dL_r(w_r)}{dE_i(w_i)} = \frac{dL_r(w_r)}{L_i(w_i)cos\alpha_idw_i} \]

出射方向上的radiance的微分 除以 入射点上的irradiance的微分

描述了光线和物体是如何作用的(某个入射方向进来后,反射出去的结果),最后决定了物体的材质

某个点的能量方程:

\[L_r(p, w_r) = \int_{H^2}f_r(w_i \rightarrow w_r)L_i(p,w_i)cos\theta_i dw_i \]

即单位面积上的能量,反射到个个单位角的能量之和

\(w_i\)是入射光和法线的夹角,\(w_r\)是出射光和法线的夹角

渲染方程

上面的能量方程,加上自己发出的光,就是渲染方程:

\[L_o(p, w_o)=L_e(p, w_o) + L_r(p, w_r) \]

\[L_o(p, w_o)=L_e(p, w_o) + \int_{\Omega+}L_i(p,w_i)f_r(p,w_i,w_o)(n \cdot w_i)dw_i \]

经过一系列推算…… K表示省略后的算子

\[L = E + KE + K^2E + K^3E + ... \]

全局光照 = 直接光照 + 间接光照 + 两次弹射光照 + 三次弹射光照 + ....

蒙特卡洛路径追踪

PDF
概率密度函数。函数每个点的微分为该点的概率

蒙特卡洛积分

\[F_N = \int_a^bf(x)dx = \frac{b-a}{N}\sum_{i=1}^Nf(X_i) \]

即在PDF上随机取样,求出取样点和两边形成的矩形面积,最后平均值就是概率的结果

note
1、样例越少,结果越不准
2、对x积分,样本只能是x

路径追踪

因为一个点发出N条光时,会出现指数爆炸。当N取1时,则不会出现这种情况,即路径追踪
因为N=1时噪声很大,所以可以在一个像素上取多个路径求均值

其次,因为递归需要结束条件,所以引入结束概率P。

俄罗斯轮盘赌(RR): \(E = P * (L_o / P) + (1 - P) *0 = L_o\)

shade(p, wo)
	If (ksi > P_RR) return 0.0;
	
	Randomly choose N(or ONE) 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) / P_RR
		Else If ray r hit an object at q
			Lo += (1 / N) * shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR
	Return Lo

光线生成:

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

优化

直接在光源上采样,然后将\(d\omega\)\(dA\)关联起来

\[d\omega = \frac{dAcos\theta}{{\Vert x^\prime - x \Vert}^2} \]

换元结果:

\[L_o(p, w_o)=L_e(p, w_o) + \int_{\Omega+}L_i(p,w_i)f_r(p,w_i,w_o)(n \cdot w_i)\frac{cos\theta}{{\Vert x^\prime - x \Vert}^2}dA \]

最终光线传播:

光源采样 + 总的球面的采样

BRDF的性质

1、非负性

\[f_r(w_i \rightarrow w_r) \ge 0 \]

2、线性
可以拆成很多块,然后再相加

3、可逆性

\[f_r(w_i \rightarrow w_r) = f_r(w_r \rightarrow w_i) \]

4、能量守恒

BRDF的测量

测量机器:gonioreflectometer
计算方式:枚举每个入射角和出射角,然后得出值

开源库:MERL BRDF Database

材质与外观

折射定律

snell's定律:入射角和折射角的sin成正比,\(n_isin\theta_i = n_tsin\theta_t\)

菲涅耳项:不同的角度下,有多少能量反射,多少能量折射

微表面模型

近处看是几何,远处看就变成材质了

根据表面法线的分布,来分辨材质

\[f(i,o) = \frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)} \]

D代表在h方向上的法线分布,G阴影遮罩(没这个的话,边界会特别亮),F表示菲涅耳项

区分材质的方式

各向同性材质:法线分布没有方向性
各向异性材质:法线分布有一定方向区间

进阶话题

有偏的:非无偏的情况
无偏的:估计出来的值和目标期望一直

无偏估计

  • BDPT:双向(半程)路径追踪。光源发出一条光,摄像机发出一条光,然后求出焦点
    • 适合光源非直接照亮,而是间接照亮的位置
  • MLT:马尔科夫链方法,找到周围近似光路求结果。
    • 优点:适合做更加复杂的场景
    • 缺点:收敛无法确定,以及像素各做各的,导致结果很脏

有偏估计

  • 光子映射
  • VCM:光子映射+双向路径追踪
  • IR:每个一个照亮的点,都算作是新的光源(VPL,虚拟光源)

外观建模

非表面模型

散射介质

雾、云。光线穿过发生两件事,被吸收或者被散射

头发

  • 有色高光
  • 无色高光

Marschner Model:玻璃珠模型,R+TT+TRT
Double Cylinder Model:中间考虑髓质的模型,R+TT+TRT+TT's+TRT's

颗粒

晶体、沙子

透光性材质

玉石、水母

次表面散射

用来计算透光性材质的,进入光的地方,和出光的地方非同一个点

BSSRDF:\(S(x_i, w_i, x_o, w_o)\),从哪个方向进来,从哪个方向出去
替换原来的渲染方程

\[L(x_o, w_o)=\int_{A}\int_{H^2}S(x_i, w_i, x_o, w_o)L_i(x_i,w_i)cos\theta_i dw_i d_A \]

对方向进行积分,对面积也要进行积分

第二种方法:Dipole Approximation
在材质内部生成一个虚拟的光源。可以近似次表面反射的效果

用于渲染人的皮肤效果会比较真实

布料

渲染方法:

  1. 当做表面
  2. 当做散射介质
  3. 当做头发

程序化材质

3D噪声:对于空间中的任何一个点,返回给你一个值

可以用于生成地形、水面、木头纹理

相机、透镜和光场等其他话题

相机

传感器上记录的是irradiance

FOV
视场,能够看到多大的范围
ISO
感光度。用于扩大亮度的系数
但是系数太大的话,会导致噪声跟明显
F-Number
光圈大小。等于焦距除以这个光圈直径
快门时间
时间越长,会导致运动模糊

透镜

CoC:点被模糊成一个圈

拍更清楚的东西,需要用小光圈

景深

成像清晰的一段范围

光场

全光函数
我们能看到的所有东西,在任何时刻、任何位置、任何方向看到的东西,总共7个维度
光场
在任何一个位置,往任何一个方向去的光的强度。光场是全光函数的一小部分

参数化方法:两个面上所有可能的位置和方向

光场照相机
拍完照之后,可以虚拟的移动照相机位置
也可以做重新聚焦

颜色

谱功率密度(SPD)
光线在不同的波长,强度是多少
同色异谱现象
最后得出的(S, M, L)相同,最后导致不同的光谱得出的颜色一致
加色系统
RGB。当rgb为负数时,相当于对面的颜色加上这部分颜色
色域
一个颜色空间所能表示的所有颜色空间
颜色空间
sRGB。
HSV/HSL颜色空间
色调,饱和度,亮度。饱和度表示颜色的纯度,越高越纯
互补色
白-黑,黄-蓝,红-绿
减色系统
CMYK。蓝绿色 + 品红色 + 黄色 + 黑色。这些颜料可以调出各种系统
带上黑的是因为黑色墨水成本低

动画与模拟

关键帧动画

重要的位置,就是关键帧。能够定义整个动画的走向

本质就是插值

质点弹簧系统

\[f_{a \rightarrow b} = k_s \frac{b-a}{\Vert b-a \Vert}(\Vert b-a \Vert - l) \]

其中l是初始长度

阻尼公式:

\[f_b = -k_d \frac{b-a}{\Vert b-a \Vert} \cdot (\dot{b} - \dot{a}) \cdot \frac{b-a}{\Vert b-a \Vert} \]

\(\dot{b}\)表示b点的速度

其他方法

有限元方法(FEM):方便处理力的传导和热的传导

粒子系统

粒子之间的作用力。先模拟后渲染

运动学(Forward Kinematics)

定义一个个关节:

  1. 滑车关节(订上的关节)
  2. 球窝关节(球形包裹的关节)
  3. 导轨关节(中间加了可以伸缩的关节)

告诉每个关节如何运动,就知道最终的位置
优点:实现方便

反向运动学(Inverse Kinematics)

  • T-Pose:模型的初始形态
  • Two Bone IK:两根骨头,UE4的一种IK解算器

CCD

1、从末端关节连接的父关节A开始,计算末端关节与目标末端关节位置与该关节形成的夹角,旋转之;
2、如果旋转后的末端关节未达到目标,则以A的父关节开始重复步骤1;
3、如果到达根关节仍未将末端关节达到目标,则结束一次迭代,重复步骤1、2,进入下一次迭代。

其他

Full Body Biped ik

Rigging(骨骼绑定)

对模型上的节点,绑定一个控制节点,然后通过改变这些节点可以控制整个模型

Motion Capture(动捕)

优点:更真实;获取数据更快
缺点:动捕服不好穿;还是需要手动调整;采样是否准确?

模拟中的误差问题

欧拉方法:解决常微分方程,微分取值。上一帧数值,加上这一帧变化的量

数值法去解微分总会有误差,比如无法圆周运动,最后造成【正反馈】,即现象越来越大,无法控制

优化法:

  • 中点法:类似泰勒展开,取值的时候再取中点的值
  • 隐式欧拉
  • 龙格库塔方法:最常用的是RK4
  • Position-Based/Verlet Integration

刚体模拟

pass

流体模拟

关键概念:

  1. 模拟出不同小球的位置,然后再渲染成面
  2. 水不可压缩

梯度下降法:不断调整数据,最终和结果相似

质点法:拉格朗日方法,用来考虑一大堆物体的
网格法:欧拉方法
MPM:上面两种方法结合

其他知识

术语

  • artifacts: 图形学中,采样中一切不准确的/瑕疵,都叫artifacts
  • 高通滤波: 过滤掉低频的滤波
  • 均值模糊
  • 冲激函数: 周期离散的点
  • specular:镜面的(材质)
  • glossy:稍微有点镜面的(材质)
  • The Utah teapot:一个著名的茶壶模型
  • The Cornell box:一个用来测试全局光照的知名模型
  • 计算摄影学
  • 果冻效应

隔行扫描

用在CRT

优点:运算量减半

缺点:显示高速运动的物体时,会有很强的画面撕裂感

如何学习

WHY,WHAT,then HOW

radiance转换成颜色

gamma correction

全反射

当光线从较高折射率的介质进入到较低折射率的介质时,如果入射角大于某一临界角θc(光线远离法线)时,折射光线将会消失

  1. 反射原理不同:镜面反射光是撞到了不透明的物体反射。全反射是光通过透明的物体上出现的现象。
  2. 折射光存在形式不同:镜面反射,光线是任何角度,都只会有反射光,不存在折射光出现。全反射,只有大于一定角度的时候才没有折射光出现。
  3. 包含关系不同:全反射包含于镜面反射。
posted @ 2022-03-04 00:43  二律背反GG  阅读(318)  评论(0编辑  收藏  举报