Compare commits
2 Commits
eef89cb99e
...
fe05a1acfe
Author | SHA1 | Date |
---|---|---|
|
fe05a1acfe | |
|
871a2a082b |
|
@ -66,7 +66,7 @@ typedef struct
|
|||
|
||||
时间复杂度为O(mn)
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
|
||||
|
@ -101,7 +101,7 @@ int Index_BF(string s, string t)
|
|||
|
||||
时间复杂度为O(m + n)
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
|
||||
|
|
|
@ -21,8 +21,7 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* G = (V,E)
|
||||
* V = {1,2,3,4,5,6}
|
||||
* E = {(1,2),(2,3),(3,4),(4,5),(1,5),(5,6),(2,6),(3,6)}
|
||||
* 
|
||||
|
||||
* 
|
||||
### 常考结论
|
||||
|
||||
* 无向图边数*2 = 各顶点度数之和
|
||||
|
@ -49,22 +48,22 @@ date: 2023-08-01T11:26:56+08:00
|
|||
|
||||
* 无向图
|
||||
* 全部由无向边构成的图
|
||||
* 
|
||||
* 
|
||||
* 有向图
|
||||
* 全部由有向边构成的图
|
||||
* 
|
||||
* 
|
||||
* 简单图、多重图
|
||||
* 简单图:不存在重复边,不存在顶点到自身的边
|
||||
* 多重图:两个顶点之间的边数大于1
|
||||
* 完全图(简单完全图)
|
||||
* 完全无向图:边数$\frac{n(n-1)}{2}$
|
||||
* 完全有向图:边数为$n(n-1)$
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 子图、生成子图
|
||||
* G的子图:所有顶点和边
|
||||
* G的生成子图:含有G的所有顶点
|
||||
* 
|
||||
* 
|
||||
* 连通、连通图、连通分量【无向图】
|
||||
* V和W连通:无向图中,V到W的路径存在
|
||||
* 连通图:图中任意两个顶点都是连通的
|
||||
|
@ -79,15 +78,15 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 出度:从该顶点出去的边的数目
|
||||
* 顶点的度 = 出度 + 入度
|
||||
* 对于具有n个顶点,e条边的有向图,出度和 = 入度和 = e对于具有n个顶点,e条边的无向图,度和 = 2e
|
||||
* 
|
||||
* 
|
||||
* 边的权和网
|
||||
* 权Weight:边上的数值
|
||||
* 网Network:边上标识权的图
|
||||
* 
|
||||
* 
|
||||
* 稠密图,稀疏图
|
||||
* 稠密图:边多
|
||||
* 稀疏图:边少
|
||||
* 
|
||||
* 
|
||||
* 路径、路径长度和回路
|
||||
* 路径Path:在一个图中,路径是从顶点u到顶点v所经过的顶点序列
|
||||
* 路径长度:该路径上边的数目
|
||||
|
@ -113,7 +112,7 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 用两个数组来表示图
|
||||
* 一个一位数组存储图中顶点信息
|
||||
* 一个二维数组存储图中的边或弧的信息
|
||||
* 
|
||||
* 
|
||||
* 邻接表
|
||||
* 邻接表是由两部分组成
|
||||
* 顶点用一个一维数组存储
|
||||
|
@ -121,17 +120,17 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 由于邻接点的个数不定,所以用单链表存储
|
||||
* 无向图称为顶点Vi的边表
|
||||
* 有向图则称为顶点Vi作为弧边的出边表
|
||||
* 
|
||||
* 
|
||||
* 十字链表【针对有向图】
|
||||
* 把邻接表和逆邻接表整合在了一起
|
||||
* 既容易找到以Vi为尾的弧,也容易找到以Vi为头的弧
|
||||
* 容易求得顶点的出度和入度
|
||||
* 创建图算法的时间复杂度和邻接表相同
|
||||
* 
|
||||
* 
|
||||
* 邻接多重表【针对无向图】
|
||||
* 仿照十字链表的方式,对边表结点的结构进行一些改造
|
||||
* 同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点
|
||||
* 
|
||||
* 
|
||||
|
||||
### 图的基本操作
|
||||
|
||||
|
@ -163,11 +162,11 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 最好情况:O(1)
|
||||
* 最坏情况:O(n)
|
||||
* 遍历过程
|
||||
* 
|
||||
* 
|
||||
* 生成树
|
||||
* 
|
||||
* 
|
||||
* 生成森林
|
||||
* 
|
||||
* 
|
||||
|
||||
### 广度优先搜索BFS
|
||||
|
||||
|
@ -180,11 +179,11 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 空间复杂度
|
||||
* O(n)
|
||||
* 遍历过程
|
||||
* 
|
||||
* 
|
||||
* 生成树
|
||||
* 
|
||||
* 
|
||||
* 生成森林
|
||||
* 
|
||||
* 
|
||||
|
||||
### 遍历次数
|
||||
|
||||
|
@ -217,34 +216,34 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 算法1:Prim算法
|
||||
* 类似于寻找图的最短路径的Dijkstra算法【以自我为中心】
|
||||
* 当带权连通图的任意一个环中所包含的边权值不同时,最小生成树是唯一的
|
||||
* 
|
||||
* 
|
||||
* 算法2:Kruskal算法
|
||||
* 按权值的递增次序选择合适的边来构造最小生成树【不以自我为中心】
|
||||
* 
|
||||
* 
|
||||
|
||||
### 最短路径
|
||||
|
||||
* BFS
|
||||
* 求无权图的单源最短路径问题
|
||||
* 
|
||||
* 
|
||||
* Dijkstra
|
||||
* 求有向图的单源最短路径问题
|
||||
* 
|
||||
* 
|
||||
* Floyd算法
|
||||
* 求任意两顶点的最短路径
|
||||
* 
|
||||
* 
|
||||
|
||||
### 有向无环图描述表达式
|
||||
|
||||
* 有向无环图定义
|
||||
* 若一个有向图中不存在环,则称为有向无环图,简称DAG图
|
||||
* 利用有向无环图描述表达式【顶点中不能出现重复操作数】
|
||||
* 
|
||||
* 
|
||||
|
||||
### 拓扑排序(优先入度为0)
|
||||
|
||||
* 核心算法
|
||||
* 
|
||||
* 
|
||||
* 时间复杂度
|
||||
* 采用邻接矩阵存储,时间复杂度为$O(|V|^2)$
|
||||
* 采用邻接表存储,时间复杂度为O(|V|+|E|)
|
||||
|
@ -252,7 +251,7 @@ date: 2023-08-01T11:26:56+08:00
|
|||
### 逆拓扑排序(优先出度为0)
|
||||
|
||||
* 核心算法
|
||||
* 
|
||||
* 
|
||||
|
||||
### 关键路径
|
||||
|
||||
|
@ -264,10 +263,10 @@ date: 2023-08-01T11:26:56+08:00
|
|||
* 有多条关键路径的时候,减少关键活动的时间不一定会缩短工程的工期
|
||||
* 求关键路径的快速方法:找起点到终点的最长路径
|
||||
* AOE网
|
||||
* 
|
||||
* 
|
||||
* 计算过程
|
||||
|
||||

|
||||

|
||||
|
||||
1. 求所有事件的最早发生事件Ve()
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ date: 2023-08-03T19:21:43+08:00
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -12,7 +12,7 @@ date: 2023-08-03T19:21:43+08:00
|
|||
|
||||
(2)
|
||||
|
||||

|
||||

|
||||
|
||||
front为队首指针,rear为队尾指针
|
||||
|
||||
|
@ -26,7 +26,7 @@ front,rear均指向空闲结点
|
|||
|
||||
(3)
|
||||
|
||||

|
||||

|
||||
|
||||
(4)
|
||||
|
||||
|
@ -53,7 +53,7 @@ front = front -> next;
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -80,7 +80,7 @@ $01011010\cdots$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -101,7 +101,7 @@ $01011010\cdots$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -124,7 +124,7 @@ $01011010\cdots$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(2)
|
||||
|
||||
|
@ -137,7 +137,7 @@ $01011010\cdots$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -184,7 +184,7 @@ $$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -261,7 +261,7 @@ typedef struct hNode
|
|||
|
||||
(3)
|
||||
|
||||

|
||||

|
||||
|
||||
|目的网络|路径|代价|
|
||||
|:---:|:---:|:---:|
|
||||
|
@ -273,7 +273,7 @@ typedef struct hNode
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
不一定能求得最短路径
|
||||
|
||||
|
@ -283,7 +283,7 @@ typedef struct hNode
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -300,7 +300,7 @@ $$
|
|||
|
||||
(2)
|
||||
|
||||

|
||||

|
||||
|
||||
(3)
|
||||
|
||||
|
@ -311,7 +311,7 @@ $$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
总费用均为16
|
||||
|
||||
|
@ -330,7 +330,7 @@ TTL = 5=>IP分组的最大传递距离 = 5
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -381,7 +381,7 @@ $ASL_{失败} = \frac{3+2+1+2+1+5+4}{7} = \frac{18}{7}$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -409,7 +409,7 @@ $ASL=0.15\times1 + 0.35\times2 + 0.35\times2 + 0.15\times3 = 2.0$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ date: 2023-08-02T21:25:52+08:00
|
|||
* 稳定性
|
||||
* 稳定
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 代码
|
||||
|
||||
```c
|
||||
|
@ -48,7 +48,7 @@ void insertion_sort(int arr[],int len)
|
|||
* 常考点
|
||||
* 计算希尔排序的增量大小
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 代码
|
||||
|
||||
```c
|
||||
|
@ -104,7 +104,7 @@ void shell_sort(int arr[],int len)
|
|||
* 元素从小到大时 = 最坏情况比较次数 = $\frac{n\times(n-1)}{2}$
|
||||
* 元素从小到大时 = 最好情况比较次数 = n-1
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
|
||||
代码
|
||||
|
||||
|
@ -161,10 +161,10 @@ int main()
|
|||
* 最小递归深度 = 枢纽值每次都是子表的最大值或最小值 = 单链表 = 树高为n
|
||||
* 例图
|
||||
* 三位取中【通常取最左边的元素为枢纽值】
|
||||
* 
|
||||
* 
|
||||
* 根据枢纽值进行分割【通常先从右到左交换比枢纽值小的,再从左到右交换比枢纽值大的
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 代码
|
||||
|
||||
```c
|
||||
|
@ -212,7 +212,7 @@ void Qsort(int A[],L,R)//a数组保存数据,L和R是边界
|
|||
* 常考点
|
||||
* 比较次数数量级与序列初始状态无关
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 代码
|
||||
|
||||
```c
|
||||
|
@ -310,15 +310,15 @@ void heapSort(int A[],int n)
|
|||
|
||||
### 建堆过程
|
||||
|
||||

|
||||

|
||||
|
||||
### 掌握堆增加一个元素的过程
|
||||
### 堆增加一个元素的过程
|
||||
|
||||

|
||||

|
||||
|
||||
### 掌握大顶堆和小顶堆的概念
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## 归并排序和基数排序
|
||||
|
@ -340,7 +340,7 @@ void heapSort(int A[],int n)
|
|||
* 比较次数数量级与序列初始状态无关
|
||||
* 对于N个元素进行k路归并排序的趟数满足$k^m = N$
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 代码
|
||||
|
||||
```c
|
||||
|
@ -404,7 +404,7 @@ void mergeSort(vector<int>& arr,int l,int r)
|
|||
* MSD是最高位优先,LSD是最低位优先
|
||||
* 基数排序不能对float和double类型的实数进行排序
|
||||
* 例题
|
||||
* 
|
||||
* 
|
||||
* 代码
|
||||
|
||||
```c
|
||||
|
@ -488,7 +488,7 @@ void radixSort(int data[],int n)
|
|||
* 将整个文件等分为10个临时文件(每个文件有1000个记录)
|
||||
* 然后将这10个文件依次进入内存,采取适当的内存排序算法对其中的记录进行排序,将得到的有序文件(初始归并段)移至内存
|
||||
* 对得到的10个初始归并段进行如图的两两归并,直到得到一个完整的有序文件
|
||||
* 
|
||||
* 
|
||||
* 如图有10个初始归并段到一个有序文件,共进行了4次归并,每次都由m个归并段得到[m/2]个归并段,这种归并方式被称为2-路平衡归并
|
||||
* 效率分析
|
||||
* 影响整体排序效率的因素主要取决于读写外存的次数,即访问外存的次数越多,算法花费的时间越多,效率就越低
|
||||
|
|
|
@ -72,7 +72,7 @@ int Search.Seq(SSTable ST,ElemType key){
|
|||
|
||||
查找判定树
|
||||
|
||||

|
||||

|
||||
|
||||
性质:
|
||||
|
||||
|
@ -119,7 +119,7 @@ int Binary_Search(SSTable L,ElemType ket){
|
|||
|
||||
### 查找效率分析
|
||||
|
||||

|
||||

|
||||
|
||||
$ASL_{成功} = (1 \cdot 1 + 2\cdot 2+3\cdot 4+4\cdot 4)/11 = 3$(有分支结点)
|
||||
|
||||
|
@ -130,7 +130,7 @@ $ASL_{失败} = (4\cdot 3+8\cdot 4)/12 = \frac{11}{3}$(叶子结点)
|
|||
* 折半查找树是平衡二叉树(左右子树高度之差不大于1)
|
||||
* 折半查找判定树可以用二叉排序树来判别,其中序序列是一个有序序列
|
||||
* 还有可能要判断取整方向是否一致
|
||||
* 
|
||||
* 
|
||||
|
||||
### 常考结论
|
||||
|
||||
|
@ -144,7 +144,7 @@ $ASL_{失败} = (4\cdot 3+8\cdot 4)/12 = \frac{11}{3}$(叶子结点)
|
|||
|
||||
### 定义
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
//索引表
|
||||
|
@ -158,7 +158,7 @@ ElemType List[100];
|
|||
|
||||
### 效率分析
|
||||
|
||||

|
||||

|
||||
|
||||
设长度为n的查找表被均匀低分为6块,每个块包含s个元素
|
||||
|
||||
|
@ -212,7 +212,7 @@ $ASL = [\log_2(b+1)]+\frac{s+1}{2}$
|
|||
|
||||
#### 查找
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
typedef Struct BSTNode{
|
||||
|
@ -251,7 +251,7 @@ BSTNode *BSTSearch(BSTTree T,int key){
|
|||
|
||||
#### 插入
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
//在二叉排序树中插入关键字为key的新结点(递归)
|
||||
|
@ -276,7 +276,7 @@ int BST_Insert(BSTTree &T,int k){
|
|||
|
||||
按{50,66,60,26,21,30,70,68}建立BST
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
//按照str[]中的关键字序列建立二叉排序树
|
||||
|
@ -292,18 +292,18 @@ void Create_BST(BSTTree &T,int str[],int n){
|
|||
|
||||
#### 删除
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 查找效率分析
|
||||
|
||||

|
||||

|
||||
|
||||
$ASL_{成功} = \frac{(1\times1 + 2\times2 + 3\times4 +4\times1)}{8} = \frac{21}{8}$
|
||||
|
||||
$ASL_{失败} = \frac{(3\times7+2\times4)}{9} = \frac{29}{9}$
|
||||
|
||||

|
||||

|
||||
|
||||
$ASL_{成功} = \frac{(1\times1 + 2\times2 + 3\times1 +4\times1+5\times1+6\times1+7\times1)}{8} = \frac{30}{8}$
|
||||
|
||||
|
@ -314,14 +314,14 @@ $ASL_{失败} = \frac{(3\times2+1\times3+1\times4+1\times5+1\times6+2\times7)}{9
|
|||
|
||||
#### 调整最小平衡子树
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 平衡二叉树生成案例
|
||||
|
||||
{15,3,7,10,9,8}生成平衡二叉树的过程
|
||||
|
||||

|
||||

|
||||
|
||||
#### 平衡二叉树的查找
|
||||
|
||||
|
@ -335,7 +335,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
|
|||
|
||||
#### 平衡二叉树的删除
|
||||
|
||||

|
||||

|
||||
|
||||
1. 删除结点(二叉排序树)
|
||||
2. 向上寻找最小不平衡子树
|
||||
|
@ -343,9 +343,9 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
|
|||
4. 依孙子位置调节平衡(LL/RR/LR/RL)
|
||||
5. 调整后不平衡向上传导,重复第二步
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 红黑树
|
||||
|
@ -363,7 +363,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
|
|||
|
||||
插入序列{20,10,5,30,40,57,3,2,4,35,25,18,22,23,24,19,18}
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## B树(B-tree)
|
||||
|
@ -380,7 +380,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
|
|||
* 所有叶节点都在同一层次上
|
||||
* 概念图
|
||||
* B树中一个节点的子节点数目的最大值,用m表示,假如最大值为4,则为4阶
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## B+树
|
||||
|
@ -391,7 +391,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
|
|||
* 叶子结点本身依关键字的大小自小而大的顺序链接
|
||||
* 所有的非终端节点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字
|
||||
* 概念图
|
||||
* 
|
||||
* 
|
||||
* B树和B+树的对比
|
||||
|
||||
||m阶B树|m阶B+树|
|
||||
|
@ -437,12 +437,12 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
|
|||
* 一旦产生了冲突,就按某种规则去寻找另一空地址
|
||||
* 发生聚集的原因主要是解决冲突的方法选择不当
|
||||
* 线性探测
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 平方探测
|
||||
* 
|
||||
* 
|
||||
* 有定理显示,如果散列表长度TableSize是某个4k+3(k是正整数)形式的素数时,平方探测就可以探查到整个散列表空间
|
||||
* 链地址法
|
||||
* 将相应位置上冲突的所有关键词存储在同一单链表中
|
||||
* 
|
||||
* 
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ bool GetTop(SqStack S,ElemType x)
|
|||
* 利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间
|
||||
* 将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
|
||||
* 特点
|
||||
* 
|
||||
* 
|
||||
* 目的
|
||||
* 更有效地利用存储空间
|
||||
* 两个栈的空间相互调节,只有在整个存储空间都被占满时才发生上溢
|
||||
|
@ -180,13 +180,13 @@ typedef struct Linknode
|
|||
|
||||
后缀表达式和正常表达式的相互转换
|
||||
|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
中缀到后缀表达式转换的过程
|
||||
|
||||

|
||||

|
||||
|
||||
#### 递归
|
||||
|
||||
|
@ -219,7 +219,7 @@ typedef struct Linknode
|
|||
|
||||
##### 顺序队列的实现
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
|
||||
|
@ -244,7 +244,7 @@ typedef struct
|
|||
|
||||
##### 循环队列的实现
|
||||
|
||||

|
||||

|
||||
|
||||
##### 区分循环队列队空还是队满
|
||||
|
||||
|
@ -439,12 +439,10 @@ bool DeEmpty(LinkQueue &Q,ElemType &x)
|
|||
|
||||
### 队列的应用
|
||||
|
||||
#### 层次遍历
|
||||
#### 层序遍历
|
||||
|
||||
使用队列是为了保存下一步的处理顺序
|
||||
|
||||

|
||||
|
||||
#### 计算机系统中的应用
|
||||
|
||||
* 解决主机与外部设备之间速度不匹配的问题
|
||||
|
|
|
@ -16,7 +16,7 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 每一个非根节点有且只有一个父节点
|
||||
* 除了根节点外,每个子节点可以分为多个不相交的子树
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
* 树的高度、深度、层
|
||||
* 节点的高度 = 节点到叶子节点的最长路径
|
||||
* 节点的深度 = 根节点到这个节点所经历的边的个数
|
||||
|
@ -47,10 +47,10 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 采用一组连续空间来存储每个节点
|
||||
* 在每个节点中设置一个伪指针
|
||||
* 尾指针指示器双亲节点在数组中的位置
|
||||
* 
|
||||
* 
|
||||
* 孩子表示法
|
||||
* 将每个节点的孩子节点用单链表连接
|
||||
* 
|
||||
* 
|
||||
* 孩子兄弟表示法
|
||||
* 又叫二叉树表示法
|
||||
* 以二叉链表作为树的存储结构
|
||||
|
@ -58,7 +58,7 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 孩子节点
|
||||
* 数据
|
||||
* 兄弟节点
|
||||
* 
|
||||
* 
|
||||
|
||||
### 树林和二叉树的转换
|
||||
|
||||
|
@ -66,12 +66,12 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 在兄弟节点之间加一连线
|
||||
* 对每个节点,只保留它与第一个孩子的连线
|
||||
* 以树根为轴心,顺时针旋转45度
|
||||
* 
|
||||
* 
|
||||
* 树、树林与二叉树
|
||||
* 将森林中的每棵树转换成相应的二叉树
|
||||
* 每棵树的根也可以视为兄弟关系,在每棵树之间加一根连线
|
||||
* 以第一棵树的根为轴心旋转45
|
||||
* 
|
||||
* 
|
||||
|
||||
### 树和森林的遍历对应关系
|
||||
|
||||
|
@ -91,7 +91,7 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 二叉树可以是空集
|
||||
* 根可以有空的左子树或右子树
|
||||
* 左、右子树皆为空
|
||||
* 
|
||||
* 
|
||||
* 性质
|
||||
* 二叉树第i层上的节点数目最多为$2^{i-1}$
|
||||
* 深度为k的二叉树最多有$2^k-1$个节点(满二叉树)
|
||||
|
@ -104,21 +104,21 @@ date: 2023-07-31T14:08:42+08:00
|
|||
|
||||
* 满二叉树
|
||||
* 高度为h,并且有$2^h -1$个结点的二叉树
|
||||
* 
|
||||
* 
|
||||
* 完全二叉树
|
||||
* 叶子结点只能出现在最下层和次下层,最下层的叶子结点集中在树的左部
|
||||
* 一棵满二叉树必定是一棵完全二叉树
|
||||
* 完全二叉树未必是满二叉树
|
||||
* 完全二叉树中,度为1的节点数 = 0个或者1个
|
||||
* 
|
||||
* 
|
||||
* 二叉查找树
|
||||
* 左子树节点比根节点值小
|
||||
* 右子树节点比根节点值大
|
||||
* 没有剑指相等的节点
|
||||
* 
|
||||
* 左右子树页分别为二叉查找树
|
||||
* 
|
||||
* 平衡二叉树
|
||||
* 树上任一结点的左子树和右子树的深度值差不超过1
|
||||
* 
|
||||
* 
|
||||
|
||||
### 二叉树的存储结构
|
||||
|
||||
|
@ -136,7 +136,7 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 完全二叉树
|
||||
* 满二叉树
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
* 链式存储结构
|
||||
* 定义
|
||||
* 只要知道根节点,就可以通过左右子节点的指针把整棵二叉树串起来
|
||||
|
@ -148,7 +148,7 @@ date: 2023-07-31T14:08:42+08:00
|
|||
* 适用于
|
||||
* 二叉树
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
|
||||
## 二叉树的实现
|
||||
|
||||
|
@ -172,7 +172,7 @@ struct TreeNode
|
|||
|
||||
根节点->左节点->右节点
|
||||
|
||||

|
||||

|
||||
|
||||
递归代码
|
||||
|
||||
|
@ -219,7 +219,7 @@ void PreOrderTraversal(BinTree BT)
|
|||
|
||||
左节点->根节点->右节点
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
递归代码
|
||||
|
@ -269,7 +269,7 @@ void InOrderTraversal(BinTree BT)
|
|||
|
||||
左节点->右节点->根节点
|
||||
|
||||

|
||||

|
||||
|
||||
递归方式
|
||||
|
||||
|
@ -350,7 +350,7 @@ void LevelOrderTraversal(BinTree BT)
|
|||
|
||||
#### 三种遍历示例
|
||||
|
||||

|
||||

|
||||
|
||||
(01) 前序遍历结果 : 3 1 2 5 4 6
|
||||
(02) 中序遍历结果 : 1 2 3 4 5 6
|
||||
|
@ -365,7 +365,7 @@ void LevelOrderTraversal(BinTree BT)
|
|||
* 前序序列与后序序列刚好相反的时候,二叉树的高度 = 节点数(即每层只有一个节点)
|
||||
* 后序遍历可以找到m到n的路径(其中m是n的祖先)
|
||||
* 根据两个序列确定二叉树的方法
|
||||
* 
|
||||
* 
|
||||
|
||||
### 线索二叉树
|
||||
|
||||
|
@ -395,7 +395,7 @@ void LevelOrderTraversal(BinTree BT)
|
|||
2. 节点右子节点为空的指针域指向它的后继节点
|
||||
3. 节点左子节点为空的指针域指向它的前驱节点
|
||||
|
||||

|
||||

|
||||
|
||||
## 树和二叉树的应用
|
||||
|
||||
|
@ -413,7 +413,7 @@ void LevelOrderTraversal(BinTree BT)
|
|||
* 构造
|
||||
* 每次把队列中值最小的合并,合并后的值加入队列中再继续比较
|
||||
* 例题
|
||||
* 
|
||||
* 
|
||||
|
||||
### 哈夫曼编码
|
||||
|
||||
|
@ -428,9 +428,9 @@ void LevelOrderTraversal(BinTree BT)
|
|||
* 01 110 10 01 1111 00 00 10 01 110 10 01 111 00 00 10 11101 10 1110
|
||||
* 最终只需50位内存,比ascii码表示节省了2/3空间
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
最终编码表
|
||||
|
||||
|
@ -444,7 +444,7 @@ void LevelOrderTraversal(BinTree BT)
|
|||
* 并查集是一种简单的集合表示,支持3种操作
|
||||
* 并查集的存储结构是双亲表示法存储的树,主要是为了方便两个主要的操作
|
||||
* 例题
|
||||
* 
|
||||
* 
|
||||
|
||||
#### 并查集操作
|
||||
|
||||
|
@ -461,7 +461,7 @@ void Initial(int S[])
|
|||
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
##### Union(S,Root1,Root2)
|
||||
|
||||
|
@ -476,7 +476,7 @@ void Union(int S[],int Root1,int Root2)
|
|||
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
##### Find(S,x)
|
||||
|
||||
|
@ -491,4 +491,4 @@ int Find(int S[],int x)
|
|||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
|
|
@ -104,7 +104,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
### 控制器结构和功能
|
||||
|
||||
* 结构
|
||||
* 
|
||||
* 
|
||||
* 连接关系
|
||||
* 运算器
|
||||
* 运算器部件通过数据总线与内存储器、输入设备和输出设备传送数据
|
||||
|
@ -134,7 +134,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 时序系统产生的机器周期信号和节拍信号
|
||||
* 来自执行单元的反馈信号,即标志
|
||||
* 微操作控制信号的形成主要与指令译码信号和时钟信号有关
|
||||
* 
|
||||
* 
|
||||
* 时序系统及微操作
|
||||
* 时钟周期:用时钟信号控制节拍发生器,可产生节拍,每个节拍的宽度正好对应一个时钟周期
|
||||
* 机器周期:视为所有指令执行过程中的一个基准时间
|
||||
|
@ -215,7 +215,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 用于产生初始微地址和后继微地址,以保证微指令的连续执行
|
||||
* 微地址寄存器
|
||||
* 接收微地址形成部件送来的微地址,为在CM中读取微指令做准备
|
||||
* 
|
||||
* 
|
||||
* 工作过程
|
||||
* 执行取微指令公共操作
|
||||
* 由机器指令的操作码字段通过微地址形成部件产生该及其指令所对应的微程序的入口地址,并送入CMAR
|
||||
|
@ -356,7 +356,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 主存$\rightarrow$数据总线MDR$\rightarrow$IR(存放指令)
|
||||
* CU发出控制信号$\rightarrow$PC内容加1
|
||||
* 流程图
|
||||
* 
|
||||
* 
|
||||
* 间址周期
|
||||
* 取操作数的有效地址
|
||||
* 数据流向
|
||||
|
@ -366,7 +366,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 主存$\rightarrow$数据总线$\rightarrow$MDR(存放有限地址)
|
||||
* Ad(IR)表示取出IR中存放点饿指令字的地址字段
|
||||
* 流程图
|
||||
* 
|
||||
* 
|
||||
* 执行周期
|
||||
* 取操作数,并根据IR中的指令字的操作码通过ALU操作产生执行结果
|
||||
* 无统一的数据流向
|
||||
|
@ -379,7 +379,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* PC$\rightarrow$MDR$\rightarrow$数据总线$\rightarrow$主存(程序断电存入主存)
|
||||
* CU(中断服务程序的入口)$\rightarrow$PC
|
||||
* 流程图
|
||||
* 
|
||||
* 
|
||||
|
||||
### 指令的执行方案
|
||||
|
||||
|
@ -448,13 +448,13 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 性能高
|
||||
* 基本不存在数据冲突
|
||||
* 示例图
|
||||
* 
|
||||
* 
|
||||
* in表示该部件的允许输入控制信号,OUT表示该部件的允许输出控制信号
|
||||
* ALU只能有一个输入端与总线相连,另一个输入端要通过暂存器与总线相连
|
||||
|
||||
### 数据传输举例
|
||||
|
||||

|
||||

|
||||
|
||||
* 寄存器间的数据传输
|
||||
* 寄存器之间的数据传送可以通过CPU内部总线完成
|
||||
|
@ -676,7 +676,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 设一条指令有3条流水段,每段平均时间为t,度为4,单流水线处理机执行20条指令的时间 = $3t+\frac{20-4}{4}t$,度为4说明是超标量流水线处理机,一次可以发生4条指令
|
||||
* 流水线吞吐量计算
|
||||
* 吞吐量 = $\frac{指令条数}{流水线执行时间}$
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
### 流水线的基本概念
|
||||
|
@ -707,7 +707,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 数据和指令在存储器中对齐存放,有利于减少访存次数,使所需数据在一个流水段内就可以从存储器中找到
|
||||
* 流水线的表示方法
|
||||
* 采用时空图描述流水线的执行情况
|
||||
* 
|
||||
* 
|
||||
|
||||
### 流水线的性能指标
|
||||
|
||||
|
@ -725,7 +725,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
### 流水线的分类
|
||||
|
||||
* 超标量流水线技术
|
||||
* 
|
||||
* 
|
||||
* 特点
|
||||
* 一个时钟周期内一条流水线可执行一条以上的指令
|
||||
* 不影响流水线功能段的处理时间
|
||||
|
@ -740,7 +740,7 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 静态流水线上下段连接方式固定
|
||||
* 超流水线技术
|
||||
* 提高主频来提高流水线性能
|
||||
* 
|
||||
* 
|
||||
* 特点
|
||||
* 流水线划分的段数越多,流水寄存器的开销越大
|
||||
|
||||
|
@ -752,9 +752,9 @@ date: 2023-07-20T09:56:49+08:00
|
|||
* 包括数据通路上流经的部件(如PC,ALU,通用寄存器,状态寄存器,异常和中断处理逻辑)
|
||||
* 数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号
|
||||
* 数据通路不包含生成控制信号的控制部件
|
||||
* 
|
||||
* 
|
||||
* 流水线的控制信号
|
||||
* 
|
||||
* 
|
||||
* 流水线寄存器保存的信息
|
||||
* 后续流水段要用到的所有数据信息
|
||||
* 包括PC+4、指令、立即数、目的寄存器、ALU运算结果、标志信息等
|
||||
|
|
|
@ -33,7 +33,7 @@ date: 2023-07-23T11:15:49+08:00
|
|||
|
||||
## 历年真题
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -63,7 +63,7 @@ CPU用于B输入输出时间 = $40000\times500 = 2\times10^7$个时钟周期
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -87,7 +87,7 @@ CPU的时间 = $1000\times(10+20\times4) = 90000$个时钟周期
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -109,7 +109,7 @@ DMA的开销 = $1000\times500 = 0.5M$个时钟周期
|
|||
|
||||
## 存储系统相关
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -146,7 +146,7 @@ Cache初始为空,Cache行有效位为0,Cache访问缺失
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
(1)
|
||||
|
@ -177,7 +177,7 @@ Cache缺失的额外开销 = 平均访存次数 $\times$Cache缺失率$\times$1
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -213,7 +213,7 @@ TLB表位数增加2位
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -246,7 +246,7 @@ Cache总容量 = $2^3\times2(20+1b+1b+1b+23B) = 4464b = 558B$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -293,7 +293,7 @@ TLB有2个组 = 高11位为TLB标记,最低1位为TLB组号
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -330,7 +330,7 @@ cache组号 = 0 0000 0011 = 3
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -368,7 +368,7 @@ a[1][1]地址 = $320+256\times4+1\times4 = 1348 = 10101000100_B$=>Cache行号为
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -400,7 +400,7 @@ Cache有$\frac{64}{4} = 16组 $=>组号占4位
|
|||
|
||||
## 数据运算相关
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -431,7 +431,7 @@ $ n = 1111 0110_{[补]} = 1000 1010_{[原]} = -10$
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -452,7 +452,7 @@ a最长,c最短
|
|||
## 指令执行相关
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -483,8 +483,7 @@ f(13) > $2^{32} - 1$,发生了溢出的错误结果,可将$f_1$的返回值
|
|||
|
||||
---
|
||||
|
||||

|
||||
|
||||

|
||||
(1)
|
||||
|
||||
CISC,M的指令长短不一,不符合RISC的指令系统的特点
|
||||
|
@ -500,7 +499,7 @@ CISC,M的指令长短不一,不符合RISC的指令系统的特点
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
@ -538,7 +537,7 @@ I、J型:2^6 -1 = 63种操作
|
|||
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
(1)
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
|
||||
## 多级层次的存储系统
|
||||
|
||||

|
||||

|
||||
|
||||
* 层次结构:Cache$\rightarrow$主存层和主存$\rightarrow$辅存
|
||||
* 前者解决CPU和主存速度不一致的问题
|
||||
|
@ -124,21 +124,21 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 片选线CS:确定哪个存储芯片被选中,可用于容量扩充
|
||||
* 引脚最低数目 = 片选线(1) + 控制线(2,读RD写WR) + 数据线 + 地址线
|
||||
|
||||

|
||||

|
||||
|
||||
* 主存储器的组成部分
|
||||
* 数据线的宽度 = MDR的宽度 = 存储字长
|
||||
* 地址线的宽度 = MAR的宽度 = 存储字数
|
||||
* 如下图的总容量为$2^{36} \times 64位 = 2^{39}B$
|
||||
|
||||

|
||||

|
||||
|
||||
### 存储体的组成元素
|
||||
|
||||
* 存储体 + 存储单元 + 存储元
|
||||
* 总容量 = 存储字数 + 存储字长
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 寻址方式
|
||||
|
@ -228,7 +228,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 刷新时需要选中一行,即占用片选线,地址线,地址译码器
|
||||
* 同理,刷新操作之间也不能够并行
|
||||
|
||||

|
||||

|
||||
|
||||
#### 分散刷新
|
||||
|
||||
|
@ -242,7 +242,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 不存在停止读/写的死时间,但存取周期变长,整个系统速度都降低了
|
||||
* 分散刷新的刷新周期为128us,但其实无需如此频繁,产生了浪费
|
||||
|
||||

|
||||

|
||||
|
||||
#### 异步刷新
|
||||
|
||||
|
@ -258,7 +258,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 是存储周期加长且降低系统速度的缺点,又不会出现集中刷新的访存死区问题
|
||||
* 根本上提高了整机的工作效率
|
||||
|
||||

|
||||

|
||||
|
||||
### 多模块存储器
|
||||
|
||||
|
@ -284,7 +284,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 缺点
|
||||
* 各模块串行工作,存储器的带宽受到了限制,并不能提高吞吐量
|
||||
* 示意图
|
||||
* .jpg)
|
||||
* 
|
||||
* 低位交叉编址(交叉方式)
|
||||
* 特点
|
||||
* 连续地址分布在相邻的不同模块内,同一模块内的地址是不连续的
|
||||
|
@ -301,10 +301,10 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 判断发送访问冲突的规则
|
||||
* 给定的访存地址在相邻的四次访问中出现在同一个存储模块中
|
||||
* 示意图
|
||||
* .jpg)
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 计算带宽
|
||||
* 
|
||||
* 
|
||||
* 常考
|
||||
* 模块数=4,存储周期T,字长W,数据总线宽度即为W,总线传输周期r,连续存取n个字,分别求带宽
|
||||
* 有m个存储体,存储周期为T,字长为W,每隔r时间启动下一个存储体,连续存取n个字,分别求带宽
|
||||
|
@ -325,7 +325,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 8K * 8位的存储器 = 共8片 8K*1位的RAM组成
|
||||
* 地址线并行,数据线一一接上
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
* 字扩展法-线选法实现
|
||||
* 18k * 8位的存储器 = 2片8K*8位的存储器
|
||||
* 由片选信号来区分芯片的地址范围
|
||||
|
@ -333,7 +333,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 谁工作,数据线就接送谁的数据吗,即将CS设置为1
|
||||
* 2位二进制时,只能利用01,,0
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
* 字扩展法-译码片实现
|
||||
* 有4块芯片,不需要4条线而只需要两条
|
||||
* 2位二进制时,可以利用00,01,10,11
|
||||
|
@ -341,14 +341,14 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 一个二进制转十进制的物理元件,将三根地址线表示的二进制意义映射到右边十进制的选通线
|
||||
* 结构图
|
||||
* 地址线应为A0~A11共12位,译码线位A12和A13共2位
|
||||
* 
|
||||
* 
|
||||
* 字位同时扩展法
|
||||
* 一块芯片只有4位,因此通过两片叠加实现位扩展
|
||||
* 等价于实现了一个8位的存储芯片
|
||||
* 在通过译码片选的方式实现字拓展
|
||||
* 在不同的地址线中选择不同的芯片组合进行工作
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
线选法和译码片选法的比较
|
||||
|
@ -361,7 +361,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
|
||||
例题:求字扩展法的地址
|
||||
|
||||

|
||||

|
||||
|
||||
## 外部存储器
|
||||
|
||||
|
@ -379,7 +379,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 抗震性好
|
||||
* 缺点
|
||||
* 易磨损
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 高速缓存存储器
|
||||
|
@ -413,7 +413,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 让Cache读取主存,CPU再从Cache中读取
|
||||
* CPU一边直接访问主存读取,一边让Cache读取主存,CPU再从Cache中读取
|
||||
|
||||

|
||||

|
||||
|
||||
### Cache的性能分析
|
||||
|
||||
|
@ -441,7 +441,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 计算方法
|
||||
* 全相联中的t,c,b,m和直接映射中的都一样
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 优点
|
||||
* 映射灵活
|
||||
* 块冲突概率比较低
|
||||
|
@ -456,7 +456,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 而且相邻块之间映射的位置也是相邻的
|
||||
* 因为主存的容量肯定比cache大得多,其实相当于一轮轮映射过去
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 计算方法
|
||||
* 主存地址长度
|
||||
* 主存中存储单元个数为$2^{10}$,则主存地址长度就是10
|
||||
|
@ -504,7 +504,7 @@ date: 2023-07-17T20:39:45+08:00
|
|||
* 先按号分组【如8块Cache分为四组】
|
||||
* 组内再任意放【组内为全相联映射】
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 计算过程
|
||||
* $2^c$
|
||||
* Cache总块数
|
||||
|
@ -679,18 +679,19 @@ q可以认为是Cache分为1024块,每组是$2^r$ = 4块,就能分$\frac{102
|
|||
* 先入先出算法(FIFO)
|
||||
* 由于最先进入的是0号cache
|
||||
* 因此0号cache替换掉,标记位标记为2
|
||||
* 
|
||||
* 
|
||||
* 近期最少使用(LRU)算法
|
||||
* 从后往前,先把前面使用过的划去
|
||||
* 没有被划去的意味着用的比较少
|
||||
* 然后从前往后看
|
||||
* 看第一块没有被划去的就决定替换它
|
||||
* 
|
||||
* 
|
||||
* 最不经常使用(LFU)算法
|
||||
* 统计使用次数
|
||||
* 4号块用了3次,6号块用了2次
|
||||
* 其他几块均用了1次,需要更多判断依据
|
||||
* 最终替换掉cache第2块(12号)
|
||||
* 
|
||||
|
||||
### 写入/更新策略
|
||||
|
||||
|
@ -703,23 +704,23 @@ q可以认为是Cache分为1024块,每组是$2^r$ = 4块,就能分$\frac{102
|
|||
* 在写的时候CPU将数据通过数据总线橙色箭头方向运输
|
||||
* 由于CPU写给cache的速度和写入主存的速度会差很多
|
||||
* 所以需要设计一个缓冲,先写入缓冲块中,再慢慢写入
|
||||
* 
|
||||
* 
|
||||
* 回写法
|
||||
* 在CPU执行写操作时,先按橙色线写入cache存储体中
|
||||
* 此时并没有修改主存的内容,会在cache中设计一个脏位
|
||||
* 当一块中的任何一个单元被修改时,脏位(修改位)被置1
|
||||
* 需要替换掉该块时,如果修改位为1,则必须先把这一块写回到主存中,然后才能再调入新的块
|
||||
* 如果修改位为0,则这一块不必写回主存,只要用新调入的块覆盖这一块即可
|
||||
* 
|
||||
* 
|
||||
|
||||
#### cache写没命中
|
||||
|
||||
* 写分配法
|
||||
* 先将数据从内存中调入到cache中
|
||||
* 再按回写法修改cache
|
||||
* 
|
||||
* 
|
||||
* 非写分配法
|
||||
* 直接去内存修改
|
||||
* 
|
||||
* 
|
||||
|
||||

|
||||

|
|
@ -81,7 +81,7 @@ date: 2023-07-22T10:06:23+08:00
|
|||
* 组成
|
||||
* 系统总线
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
* 双总线结构
|
||||
* 优点
|
||||
* 将低速IO设备从单总线上分离出来
|
||||
|
@ -91,7 +91,7 @@ date: 2023-07-22T10:06:23+08:00
|
|||
* 组成
|
||||
* 主存总线+IO总线
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
* 三总线结构
|
||||
* 优点
|
||||
* 提高了IO设备的性能
|
||||
|
@ -102,7 +102,7 @@ date: 2023-07-22T10:06:23+08:00
|
|||
* 组成
|
||||
* IO总线+主存总线+DMA总线
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
|
||||
## 总线性能标准
|
||||
|
||||
|
@ -130,10 +130,10 @@ date: 2023-07-22T10:06:23+08:00
|
|||
### 例题
|
||||
|
||||
* 计算传输数据所要的时间
|
||||
* 
|
||||
* 
|
||||
* 计算数据传输率/总线带宽
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 总线事务和定时
|
||||
|
@ -196,3 +196,4 @@ date: 2023-07-22T10:06:23+08:00
|
|||
* 全互锁方式
|
||||
* 主设备发请求$\rightarrow$需要等从设备的回答,才能撤销请求信号
|
||||
* 从设备收到回答$\rightarrow$需要等到主设备的回答,才能撤销回答信号
|
||||
* 
|
||||
|
|
|
@ -57,12 +57,12 @@ date: 2023-07-18T22:48:35+08:00
|
|||
|
||||
操作码和地址码分组存放
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
操作码和地址码放在一起
|
||||
|
||||

|
||||

|
||||
|
||||
### 地址码
|
||||
|
||||
|
@ -232,7 +232,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 跳跃的地址分为绝对地址【标记符直接得到】和相对地址【相对当前指令地址的偏移量】
|
||||
* 跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过PC给出
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
### 数据寻址
|
||||
|
@ -262,7 +262,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 隐地址不给出明显的操作数地址,而在指令中隐含操作数的地址
|
||||
* 可以简化地址结构,如零地址指令
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 立即寻址
|
||||
* 有效地址
|
||||
* A就是操作数
|
||||
|
@ -285,7 +285,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 特点
|
||||
* 直接寻址主要执行取指令访存1次,还有执行指令访存1次
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 间接寻址
|
||||
* EA=(A)
|
||||
* 定义
|
||||
|
@ -295,7 +295,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 特点
|
||||
* 与直接寻址相比:间接寻址执行取指令访存1次,还要执行指令访存2次
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 访问寄存器的寻址
|
||||
* 寄存器寻址
|
||||
* $EA = R_i$
|
||||
|
@ -307,7 +307,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 访问寄存器会比访问主存快得多
|
||||
* CPU中寄存器不是很多,用很短的编码就可以指令寄存器,能有效地缩短地址段的位数
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 寄存器间接寻址
|
||||
* $EA = (R_i)$
|
||||
* 定义
|
||||
|
@ -319,7 +319,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 寄存器间接寻址主要执行指令访存1次
|
||||
* 还有一次是寄存器执行指令访存1次
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 转/偏移类寻址
|
||||
* 基址寻址
|
||||
* EA = (BR)+A
|
||||
|
@ -334,8 +334,8 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 原先只能寻址A的位数范围内的地址,有了基址寻址的方式
|
||||
* 可以通过加上一个基地址从而在更大范围的空间内设计程序
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 变址寻址
|
||||
* EA = (IX) + A
|
||||
* 定义
|
||||
|
@ -345,7 +345,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 变址寻址常用在一些有规律的操作上,比如遍历字符串,遍历数组
|
||||
* 1条指令实现了基址寻址多条的功能
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 相对寻址
|
||||
* EA = (PC)+A
|
||||
* 定义
|
||||
|
@ -356,7 +356,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 相对寻址有利于程序浮动,广泛用于转移指令和多道程序设计中
|
||||
* 所以相对寻址的相对地址是以下条指令在内存中首地址为基准位置的偏移量
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 堆栈寻址
|
||||
* 定义
|
||||
* 把操作数存放在堆栈中,隐含的使用堆栈指针(SP)作为操作数地址
|
||||
|
@ -365,7 +365,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* 入栈,先压入数据,再修改指针
|
||||
* 出栈,先修改指针,再弹出数据
|
||||
* 例图
|
||||
* 
|
||||
* 
|
||||
* 常考点
|
||||
* 速度方面
|
||||
* $立即寻址\rightarrow寄存器寻址\rightarrow直接寻址\rightarrow寄存器间接寻址\rightarrow间接寻址$
|
||||
|
@ -381,7 +381,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
|
||||
### 选择结构语句的机器级表示
|
||||
|
||||

|
||||

|
||||
|
||||
参数列表中越后面的参数越早压入,压完参数之后就是返回地址,以及旧的 ebp 数值
|
||||
|
||||
|
@ -429,7 +429,7 @@ date: 2023-07-18T22:48:35+08:00
|
|||
* g(greater)、l(less)、e(equal)s(sign)
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 举例
|
||||
* 无符号的情况下 jb 就是 B 大,jae 就是 A 大于等于 B。
|
||||
|
@ -457,12 +457,12 @@ ret
|
|||
|
||||
Switch 语法举例
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 循环结构语句的机器级表示
|
||||
|
||||

|
||||

|
||||
### 过程(函数)调用对应的机器级表示
|
||||
|
||||
* 被保存的寄存器)函数P将要使用的“被调用者保存寄存器”通过push保存在函数的栈帧中。
|
||||
|
|
|
@ -24,11 +24,11 @@ date: 2023-07-07T16:48:40+08:00
|
|||
* 范围:0~9 + ABCDEF
|
||||
* 数制的相互转换
|
||||
* 二进制$\rightarrow$八进制或十六进制
|
||||
* 
|
||||
* 
|
||||
* 任意进制$\rightarrow$十进制
|
||||
* 
|
||||
* 
|
||||
* 十进制$\rightarrow$任意进制
|
||||
* 
|
||||
* 
|
||||
|
||||
## 无符号数
|
||||
|
||||
|
@ -146,7 +146,7 @@ date: 2023-07-07T16:48:40+08:00
|
|||
* 和表达式 = $A_i\bigoplus B_i \bigoplus C_i$
|
||||
* 进位表达式$C_i = A_iB_i + (A_i \bigoplus B_i) C_{i-1}$
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
|
||||
### 串行进位加法器
|
||||
|
||||
|
@ -154,7 +154,7 @@ date: 2023-07-07T16:48:40+08:00
|
|||
* 串行进位加法器:把n个FA相连得到的n位加法器
|
||||
* 每级进位直接依赖于前一级的进位,进位信号逐级形成
|
||||
* 最长运算时间由进位信号的传递时间决定
|
||||
* 
|
||||
* 
|
||||
|
||||
### 并行进位加法器
|
||||
|
||||
|
@ -181,7 +181,7 @@ date: 2023-07-07T16:48:40+08:00
|
|||
* CF:进位/借位标志,$C_{in} = 0$时,$CF = C_{out};C_{in} = 1$时,$CF = C_{out}$取反
|
||||
* A - B < 0 时,CF = 1;溢出时 OF = 1
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
|
||||
### 算术逻辑单元ALU
|
||||
|
||||
|
@ -193,7 +193,7 @@ date: 2023-07-07T16:48:40+08:00
|
|||
* 在ALUop的控制下,由一个多路选择器MUX选择输出某种操作结果
|
||||
* MUX是多路选择开关,它从多个输入信号中选择一个送到输出端
|
||||
* 结构图
|
||||
* 
|
||||
* 
|
||||
|
||||
## C语言中的整数类型与类型转换
|
||||
|
||||
|
@ -268,7 +268,7 @@ int main(){
|
|||
* double 占8字节 = 64位
|
||||
* 大端方式:按MSB到LSB的顺序存储数据
|
||||
* 小端方式:按LSB到MSB的顺序存储数据
|
||||
* 
|
||||
* 
|
||||
* 如小端方式中,按字节编制
|
||||
* 设int变量i的地址为0800H,i的机器数为01234567H,则地址0800H表示的内容为67H
|
||||
|
||||
|
@ -278,9 +278,9 @@ int main(){
|
|||
* 存储字长为32位时,半字是2的整数倍,字地址是4的整数倍,字节大小为8位
|
||||
* 边界对齐虽然浪费了一些存储空间,但是可以提高取指令和取数的速度
|
||||
* 边界不对齐可以充分利用存储空间,但是效率低
|
||||
* 
|
||||
* 
|
||||
* 例题
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 定点数
|
||||
|
@ -296,7 +296,7 @@ int main(){
|
|||
* 符号位和数值位一起参与运算
|
||||
* 运算结果的高位被丢弃
|
||||
* 实例
|
||||
* 
|
||||
* 
|
||||
* 运算电路信号解释
|
||||
* |记忆方法|解释|是否有意义|
|
||||
|---|---|---|---|
|
||||
|
@ -336,9 +336,9 @@ int main(){
|
|||
* 积和被乘数采用双符号位
|
||||
* 最多进行n次加法运算,n次移位
|
||||
* 计算过程
|
||||
* 
|
||||
* 
|
||||
* 电路图
|
||||
* 
|
||||
* 
|
||||
* 补码一位乘法
|
||||
* 定义和概念
|
||||
* 一种有符号数的乘法
|
||||
|
@ -351,9 +351,9 @@ int main(){
|
|||
|1|0|部分积加$[-a]_补$,右移一位|
|
||||
|1|1|部分积右移一位|
|
||||
* 计算过程
|
||||
* 
|
||||
* 
|
||||
* 电路图
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
### 除法
|
||||
|
@ -369,9 +369,9 @@ int main(){
|
|||
* 该方法商符和商值分开进行
|
||||
* 商符由两个操作数的符号位异或形成
|
||||
* 计算过程
|
||||
* 
|
||||
* 
|
||||
* 电路图
|
||||
* 
|
||||
* 
|
||||
* 补码除法运算(加减交替法)
|
||||
* 该方法符号位和数值位一起参与运算,商符自然形成
|
||||
* 根据被除数和除数的符号决定加法还是减法
|
||||
|
@ -380,9 +380,9 @@ int main(){
|
|||
* 异号上商0
|
||||
* 最后一步商置1
|
||||
* 计算过程
|
||||
* 
|
||||
* 
|
||||
* 电路图
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 移位运算
|
||||
|
@ -423,7 +423,7 @@ int main(){
|
|||
* d中,数据位连同CF一起左移
|
||||
* 数据的最高位移入CF
|
||||
* CF则移入数据的最低位
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 浮点数
|
||||
|
@ -452,12 +452,12 @@ int main(){
|
|||
* 基数为2时,将小数点前面的值固定为1,基数为4时,尾数的最高两位不全为0
|
||||
* 指数(阶码)部分
|
||||
* 阶码的位数反映浮点数的表示范围
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
### 表示范围
|
||||
|
||||

|
||||

|
||||
|
||||
* 【正上溢】:大于最大正数
|
||||
* 【负上溢】:小于绝对值最大负数
|
||||
|
@ -479,7 +479,7 @@ int main(){
|
|||
* 规格化:规定尾数的最高数位必须是一个有效值(1)
|
||||
* 目的
|
||||
* 提高数据的表示精度
|
||||
* 
|
||||
* 
|
||||
* 左规
|
||||
* 当浮点数运算的结果为非规格化时要进行规格化处理
|
||||
* 将尾数算术左移一位,阶码减一
|
||||
|
@ -522,7 +522,7 @@ int main(){
|
|||
### IEEE754标准浮点数范围
|
||||
|
||||
* IEEE754中尾数使用原码表示,阶码用移码表示
|
||||
* 
|
||||
* 
|
||||
|
||||
|以正数为例|最小值|最大值|
|
||||
|---|---|---|
|
||||
|
@ -538,11 +538,11 @@ int main(){
|
|||
|
||||
#### 浮点数转十进制
|
||||
|
||||

|
||||

|
||||
|
||||
#### 十进制转浮点数
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## 浮点数和定点数区别
|
||||
|
|
|
@ -61,7 +61,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
## 计算机应用层次结构
|
||||
|
||||
* 层次结构图
|
||||
* 
|
||||
* 
|
||||
* 三种程序转换
|
||||
* 高级语言$\underrightarrow{编译}$汇编语言$\underrightarrow{汇编}$机器语言
|
||||
* 高级语言$\underrightarrow{解释}$机器语言
|
||||
|
@ -89,7 +89,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
### 冯诺依曼结构
|
||||
|
||||
* 组成示例图
|
||||
* 
|
||||
* 
|
||||
* 特点
|
||||
* 计算机由五大部件组成
|
||||
* 输入设备
|
||||
|
@ -111,7 +111,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
### 现代计算机结构
|
||||
|
||||
* 示例图
|
||||
* 
|
||||
* 
|
||||
* 特点
|
||||
* 计算机 = 主机 + 输入/输出设备
|
||||
* 主机 = CPU +主存
|
||||
|
@ -127,8 +127,8 @@ date: 2023-07-07T11:24:47+08:00
|
|||
### 存储器
|
||||
|
||||
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 组件
|
||||
* 存储元:存储二进制的电子元件,每个存储元可存储1bit
|
||||
* 存储单元:每个存储单元放一串二进制代码
|
||||
|
@ -145,7 +145,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
### 运算器
|
||||
|
||||
|
||||
* 
|
||||
* 
|
||||
* 组件
|
||||
* ACC:累加器,用于存放操作数或运算结果
|
||||
* MQ:乘商寄存器,在乘除计算中用于存放操作数或运算结果
|
||||
|
@ -154,7 +154,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
|
||||
### 控制器
|
||||
|
||||
* 
|
||||
* 
|
||||
* 组件
|
||||
* PC:程序计数器,存放下一条指令的地址,并跟踪下一条要执行的指令的地址
|
||||
* IR:指令寄存器:存放当前正在执行的指令
|
||||
|
@ -164,7 +164,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
## 计算机系统的细节
|
||||
|
||||
* 系统细节图
|
||||
* 
|
||||
* 
|
||||
* 系统的组成
|
||||
* CPU:中央处理器
|
||||
* PC:程序计数器
|
||||
|
@ -195,7 +195,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
* 送结果到寄存器中或送到内存
|
||||
* PC加一
|
||||
* 常见操作码
|
||||
* 
|
||||
* 
|
||||
* 程序执行过程举例
|
||||
* 举例计算$y = ax^2 + bx+c$
|
||||
* 取x至运算器中
|
||||
|
@ -205,7 +205,7 @@ date: 2023-07-07T11:24:47+08:00
|
|||
* 将运算器中数据送至存储器y中
|
||||
* 打印y
|
||||
* 停机
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 计算机性能指标
|
||||
|
|
|
@ -20,7 +20,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* 只能在OS内核的底层IO软件中使用
|
||||
* IO指令实现的数据传送通常发生在通用寄存器和IO端口之间
|
||||
* 一种特权指令
|
||||
* 
|
||||
* 
|
||||
* IO接口类型
|
||||
* 数据传输方式区分
|
||||
* 并行接口:一个字节或一个字的所有位同时传送
|
||||
|
@ -90,7 +90,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* 缺点
|
||||
* CPU在信息传送过程中要花费很多时间来查询和等待
|
||||
* 在一段时间内只能和一台外设交换信息,效率大大降低
|
||||
* 
|
||||
* 
|
||||
* 程序中断方式
|
||||
* 基本概念
|
||||
* 在计算机执行现行程序的过程中,出现某些急需处理的寻常情况或特殊情况请求CPU暂停中止现行程序,而专区对这些异常情况或特殊请求进行处理,处理完毕后再返回到现行程序的断点处,继续执行原程序
|
||||
|
@ -115,7 +115,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* 然后CPU继续执行当前的程序,不需要像查询方式那样等待外设准备就绪
|
||||
* 一但外设完成数据传送的准备工作,就主动向CPU发出中断请求,请求CPU为自己服务
|
||||
* 在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设之间的数据传送,传送完成后,CPU回到原来的程序
|
||||
* 
|
||||
* 
|
||||
* 程序中断的基本流程
|
||||
* 中断请求
|
||||
* 中断响应判优(硬件排队器实现)
|
||||
|
@ -138,7 +138,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* 非向量(软件)中断
|
||||
* CPU设置一个异常状态寄存器,用于记录异常原因,OS用一个统一的异常或中断查询程序,按优先等级顺序查询异常状态寄存器,以检测异常和中断的类型,先查到的先被处理,然后转到内核中相应的处理程序
|
||||
* 中断处理过程
|
||||
* 
|
||||
* 
|
||||
* 多重中断和中断屏蔽技术
|
||||
* 单重中断
|
||||
* 若CPU在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不响应
|
||||
|
@ -152,7 +152,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* 1表示屏蔽该中断源的请求,0表示可以正常申请
|
||||
* 所有屏蔽触发器组合在一起便构成一个屏蔽字寄存器
|
||||
* 屏蔽字寄存器的内容称为屏蔽字
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
* DMA(Direct Memory Access 直接存储器存取)方式
|
||||
|
@ -180,7 +180,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* DMA请求触发器:每当IO设备准备好数据后,给出一个控制信号,使DMA请求触发器置位
|
||||
* 控制/状态逻辑:由控制和时序电路及状态标志组成,用于指令传送方向,修改传送参数,并对DMA请求信号,CPU响应信号进行协调和同步
|
||||
* 中断机构:当一个数据块传送完毕后触发中断机构,向CPU提出中断请求
|
||||
* 
|
||||
* 
|
||||
* 传送方式
|
||||
* 当IO设备和CPU同时访问主存时,可能发生冲突,为了有效使用主存,DMAC和CPU通常采用3种方式使用主存
|
||||
* 停止CPU访问
|
||||
|
@ -198,7 +198,7 @@ date: 2023-07-22T13:59:04+08:00
|
|||
* 校验送入主存的数据是否正确
|
||||
* 测试传送过程中是否出错(错误则转诊断程序)
|
||||
* 决定是否继续使用DMA传送其他数据等
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
* DMA方式和中断方式的对比
|
||||
|
@ -222,8 +222,8 @@ date: 2023-07-22T13:59:04+08:00
|
|||
|
||||
|
||||
* 各种IO控制方式的对比和例题
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
|
||||
|
||||
## 思维导图
|
||||
|
|
|
@ -20,14 +20,14 @@ date: 2022-05-15T17:55:10+08:00
|
|||
对同一像素点内采用多个采样点的方式来减少走样但将采样点分散到了一段时间内的多个帧上,在每帧采样时对采样点进行偏移,即抖动(jitter)来实现MSAA中放置多个次采样点的效果
|
||||
|
||||
采样序列也使用Halto sequence
|
||||

|
||||

|
||||
|
||||
###### jitter的实现
|
||||
|
||||
采样点的位置会在初始化的时候确定,之后需要在与像素中心距离$[0,1]$的范围里发生偏移
|
||||
|
||||
实现这个效果只需要对投影矩阵中的值进行改动
|
||||

|
||||

|
||||
|
||||
图片中标红的值便是在归一化后的坐标空间里偏移值的替换位置
|
||||
|
||||
|
@ -154,7 +154,7 @@ blendFactor = (lastStencil & 0x18) == (currStencil & 0x18) ? blendFactor : 1.f;
|
|||
|
||||
在经过处理后,鬼影现象消失,但当相机从向右旋转时,人物的左侧边缘像素表现效果较差
|
||||
|
||||

|
||||

|
||||
|
||||
为了减少这种情况的产生,我们在blendFactor为1时,返回一个经过高斯模糊的上一帧的颜色值
|
||||
```s
|
||||
|
@ -170,7 +170,7 @@ Gaussian blur使用的卷积核与$3\times3$相邻像素采样一致
|
|||
<br>$ \begin{bmatrix} \frac{1}{16} & \frac{1}{8} &\frac{1}{16} \\\\ \frac{1}{8} &\frac{1}{4} &\frac{1}{8} \\\\ \frac{1}{16} &\frac{1}{8} &\frac{1}{16} \end{bmatrix} $
|
||||
|
||||
处理后依旧有1像素厚的鬼影存在
|
||||

|
||||

|
||||
|
||||
产生原因:
|
||||
<br>Color history 是线性采样,Stencil history 是点采样,两者在边缘并不相容
|
||||
|
|
|
@ -29,17 +29,17 @@ date: 2022-07-19T16:04:37+08:00
|
|||
1. 通过每个像素投射一条光线的方式来生成图像
|
||||
2. 通过向光源发送光线的方式来生成阴影
|
||||
|
||||

|
||||

|
||||
|
||||
#### 生成视角射线(Generating Eye Rays)
|
||||
|
||||
Pinhole Camera Model
|
||||
|
||||

|
||||

|
||||
|
||||
#### 着色像素(shading pixel)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 递归式光线追踪(Recursive Ray Tracing)
|
||||
|
@ -48,11 +48,11 @@ Recursiv Ray Tracing 又名 Whitted-Style Ray Tracing 由T.Whitted在1980年提
|
|||
|
||||
"An improved Illumination model for shaded display"
|
||||
|
||||

|
||||

|
||||
|
||||
总体计算流程
|
||||
|
||||

|
||||

|
||||
|
||||
-------------------------------------------
|
||||
|
||||
|
@ -143,14 +143,14 @@ $(p-p') * N = (o + td - p') * N = 0$
|
|||
|
||||
$t = \frac{(p'-o) * N }{d * N}$
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### Möller Trumbore Algorithm
|
||||
|
||||
一种更快地得出重心坐标的算法
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 光线追踪的性能瓶颈
|
||||
|
|
|
@ -10,7 +10,7 @@ date: 2022-05-18T14:07:33+08:00
|
|||
|
||||
需要对不同深度的物体进行分类来确定面与面的绘制顺序,复杂度为$O(n\log n)$,其中n为三角形的个数,也存在一个无法解决的问题,不能处理无法确定绘制顺序的物体,例如下图互相遮挡的情况
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### Z-Buffer
|
||||
|
@ -23,7 +23,7 @@ date: 2022-05-18T14:07:33+08:00
|
|||
|
||||
Z-Buffer会在生成渲染图的同时根据各采样点(像素)的深度值生成深度图,颜色越深代表距离越近,越浅则越远
|
||||
|
||||

|
||||

|
||||
|
||||
算法
|
||||
|
||||
|
@ -42,5 +42,5 @@ for (each triangle T)
|
|||
|
||||
整体算法流程会形成如下图效果,复杂度为O(n),n为三角形面的数量
|
||||
|
||||

|
||||

|
||||
|
||||
|
|
|
@ -12,11 +12,11 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
坐在房间的一侧往窗户的一侧看,三维和二维的情况是下面这样的
|
||||
|
||||

|
||||

|
||||
|
||||
如果加上一个幕布,显示上图图像,往往人们难以区别于现实世界,即为虚拟现实的原理
|
||||
|
||||

|
||||

|
||||
|
||||
### 全光函数(The Plenoptic Function)
|
||||
|
||||
|
@ -24,7 +24,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
统计往任意方向上的所见值,可定义一个函数,最后结果为一个数
|
||||
|
||||

|
||||

|
||||
|
||||
* 改进函数 Color snapshot
|
||||
|
||||
|
@ -32,19 +32,19 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
记录各个方向看到的不同方向上的光,就可以看到彩色场景
|
||||
|
||||

|
||||

|
||||
|
||||
* 扩展的全光函数 A movie
|
||||
|
||||
进一步将全光函数扩展一个时间t,那下面这个四维的函数就是电影,因为你可以往各个不同的方向看,看到各个不同方向来的信息都是彩色的,然后在不同时间显示的东西不一样
|
||||
|
||||

|
||||

|
||||
|
||||
* 进一步扩展 Holographic movie
|
||||
|
||||
现在考虑人/摄像机可以在三维空间中的任何地方移动,三维空间中的任何一个位置可以用x、y、z定义。那这也就是全息电影
|
||||
|
||||

|
||||

|
||||
|
||||
* 再改进一步 The Plenoptic Function
|
||||
|
||||
|
@ -62,7 +62,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
## 光场
|
||||
|
||||
|
@ -70,7 +70,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
* 通过一个起点和一个方向定义
|
||||
|
||||

|
||||

|
||||
|
||||
* 取光线上的任意两点定义整条光线(二维位置和方向)
|
||||
|
||||
|
@ -78,7 +78,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
已知包围盒上的点,观测位置的点,这两点确定一条光线,可以查询记录的函数,该函数记录了物体表面不同位置往各个不同方向的发光情况
|
||||
|
||||

|
||||

|
||||
|
||||
### 定义光场
|
||||
|
||||
|
@ -87,7 +87,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
如果有了一个物体的光场,如下图,任何一个位置往任何一个方向都可以发光。我们在任何一个位置往这个物体某个点看的时候,是可以知道这条光线带的能量是多少的,因为通过这2个点可以知道往这个点看的方向,就可以从4维的光场中查询到之前记录的光场的值,即光场可以给出任意观测方向看到的结果
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
### 记录光场
|
||||
|
||||
|
@ -97,7 +97,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 取一平面,平面右侧有有物体发出光线打到平面上
|
||||
|
||||
|
@ -111,11 +111,11 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
找到所有u、v和s、t的组合,可以描述所有的不同位置和不同方向出来的光线
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
光场本质上就是一个4维的函数,不同记录方法即为描述方式不同
|
||||
|
||||
|
@ -127,11 +127,11 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
很多摄像机从某一个角度看向世界,拍一张图,然后将所有图都组织到一块,就是整个光场。如下图,斯坦福做了一个摄像机的矩阵,相当于在不同的位置对场景拍不同的图,每个位置对应一个u、v,拍到的照片是s、t,相机本身二维,成像结果二维,综合为四维
|
||||
|
||||

|
||||

|
||||
|
||||
* 固定s、t平面上一个点,然后往u、v平面上看
|
||||
|
||||
|
@ -139,7 +139,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
通过这种方式,可以将像素上的Irradiance给展开成Radiance,可以看到打到任何一个像素上不同方向的光
|
||||
|
||||

|
||||

|
||||
|
||||
苍蝇的复眼成像原理就是成像一个光场,盯着原本拍出的一张照片来看,那照片上的任何一个像素记录的是Irradiance(平均各个方向的光)
|
||||
|
||||
|
@ -147,7 +147,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
此时看一个像素实际为穿过像素的不同方向的光
|
||||
|
||||

|
||||

|
||||
|
||||
## 光场相机
|
||||
|
||||
|
@ -157,7 +157,7 @@ date: 2022-07-30T16:49:52+08:00
|
|||
|
||||
Lytro相机有下图这个人创办
|
||||
|
||||

|
||||

|
||||
|
||||
* 原理:Microlens design(上面谈到的微透镜)。将一个像素替换成一个透镜,让这个透镜可以把来自于不同方向的光分开并记录下来
|
||||
|
||||
|
@ -165,19 +165,19 @@ Lytro相机有下图这个人创办
|
|||
|
||||
* 具体效果如下图:
|
||||
|
||||

|
||||

|
||||
|
||||
* 详细原理
|
||||
|
||||
将原本的像素换成了微透镜,这些微透镜可以把来自各方向的光分散到不同的方向上去,在后面再将它记录下来
|
||||
|
||||

|
||||

|
||||
|
||||
光场照相机照出来的最原始的图实际上是原本的一个像素变成了一个圆,任何一个圆内部平均起来就是以前普通的照相机得到的结果,在一个圆的内部各个像素其实就是记录了各个不同的方向
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 得到普通相机照片
|
||||
|
||||
|
@ -219,7 +219,7 @@ Lytro相机有下图这个人创办
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
#### 可见光谱
|
||||
|
||||
|
@ -227,7 +227,7 @@ Lytro相机有下图这个人创办
|
|||
|
||||
光谱是光线的能量在不同的波长上的分布。光谱是一个很长的范围,图形学中重要的是可见光的光谱,即分布在波长在400nm到700nm之间
|
||||
|
||||

|
||||

|
||||
|
||||
#### 谱功率密度(SPD)
|
||||
|
||||
|
@ -243,17 +243,16 @@ Lytro相机有下图这个人创办
|
|||
|
||||
阳光则是另一种SPD
|
||||
|
||||

|
||||
|
||||

|
||||
#### 不同光源的SPD
|
||||
|
||||

|
||||

|
||||
|
||||
* SPD的线性性质
|
||||
|
||||
用一种光照亮能记录光强度的东西能够得到右边的另一种分布;两种光同时照亮得到的分布就是它们两个对应的SPD之和
|
||||
|
||||

|
||||

|
||||
|
||||
### 颜色的生物学基础
|
||||
|
||||
|
@ -265,7 +264,7 @@ Lytro相机有下图这个人创办
|
|||
|
||||
人眼的瞳孔可调节大小,对应着光圈;晶状体对应透镜,可通过肌肉的拉扯调节焦距;视网膜进行成像
|
||||
|
||||

|
||||

|
||||
|
||||
#### 视网膜感光细胞
|
||||
|
||||
|
@ -284,11 +283,11 @@ Lytro相机有下图这个人创办
|
|||
三种响应类型的曲线:
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 三种细胞的分布和数量有个体差异,下图为12人锥形细胞分布差异
|
||||
|
||||

|
||||

|
||||
|
||||
### 颜色的三刺激理论
|
||||
|
||||
|
@ -299,7 +298,7 @@ Lytro相机有下图这个人创办
|
|||
三种不同的细胞自然会感应出三种颜色,对应下图的S、M、L
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
给定任意类型光线,人眼看到的是上面S、M、L这3个数,而不是光线本身的SPD
|
||||
|
||||
|
@ -307,7 +306,7 @@ Lytro相机有下图这个人创办
|
|||
|
||||
光线的光谱经过人的眼睛,反应到视网膜上,然后被三种不同的细胞感知到形成3个数,这3个数送到人的脑袋中,人就会认为看到了一个什么样的颜色
|
||||
|
||||

|
||||

|
||||
|
||||
#### 同色异谱
|
||||
|
||||
|
@ -324,13 +323,13 @@ Lytro相机有下图这个人创办
|
|||
下图中光谱的SPD完全不同,但被人感知后可得到三个相同的结果
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 应用
|
||||
|
||||
如图,可通过不同调节方式使两个颜色一致来表现显示器上太阳颜色,但混合后光谱可与之前的完全不同
|
||||
|
||||

|
||||

|
||||
|
||||
## 颜色复制/匹配
|
||||
|
||||
|
@ -346,7 +345,7 @@ Lytro相机有下图这个人创办
|
|||
|
||||
类似于调和不同颜料会越调越黑
|
||||
|
||||

|
||||

|
||||
|
||||
### 加色实验
|
||||
|
||||
|
@ -356,28 +355,28 @@ Lytro相机有下图这个人创办
|
|||
|
||||
如下图,给定任何一个颜色,希望用三种不同颜色混合匹配得到相同颜色
|
||||
|
||||

|
||||

|
||||
|
||||
左侧为给定颜色,右侧为混合颜色,每个颜色存在系数
|
||||
|
||||

|
||||

|
||||
|
||||
即找到三种颜色系数的值混合后得到左边颜色
|
||||
|
||||

|
||||

|
||||
|
||||
* 实验二
|
||||
|
||||
有时存在左边的颜色右边无法混合得到的情况
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
可在左边给定的颜色上加上一个颜色,类似于右边对应减去这个颜色
|
||||
|
||||
多个不同颜色混合得到一个颜色,存在负值可能
|
||||
|
||||

|
||||

|
||||
|
||||
#### CIE RGB配色实验
|
||||
|
||||
|
@ -387,7 +386,7 @@ CIE是一个组织,定义了RGB系统,给定的任何一个颜色是单波
|
|||
|
||||
使用三种单色的光
|
||||
|
||||

|
||||

|
||||
|
||||
#### 颜色匹配函数:
|
||||
|
||||
|
@ -395,7 +394,7 @@ CIE是一个组织,定义了RGB系统,给定的任何一个颜色是单波
|
|||
|
||||
做颜色匹配时,给定一个固定波长,需要将这3个颜色中相同波长的值混合起来
|
||||
|
||||

|
||||

|
||||
|
||||
* 实际光(多波长)
|
||||
|
||||
|
@ -403,7 +402,7 @@ CIE是一个组织,定义了RGB系统,给定的任何一个颜色是单波
|
|||
|
||||
这三个颜色每一个积分出来会得到三个数
|
||||
|
||||

|
||||

|
||||
|
||||
### 颜色空间
|
||||
|
||||
|
@ -424,7 +423,7 @@ CIE XYZ系统人为定义了一个颜色匹配函数,
|
|||
* 绿色曲线分布比较对称,对应的y函数匹配出来的数Y在一定程度上可以表示颜色的亮度
|
||||
* 红色有2个峰值,没有负数,这些函数都分布在可见光的范围内
|
||||
|
||||

|
||||

|
||||
|
||||
二维可视化XYZ
|
||||
|
||||
|
@ -440,7 +439,7 @@ $$z = \frac{Z}{X+Y+Z}$$
|
|||
|
||||
改变Y即为改变亮度
|
||||
|
||||

|
||||

|
||||
|
||||
* 色域
|
||||
|
||||
|
@ -448,13 +447,13 @@ $$z = \frac{Z}{X+Y+Z}$$
|
|||
|
||||
色域有一个白色中心,纯色都在边界上
|
||||
|
||||

|
||||

|
||||
|
||||
不同颜色空间表示的颜色范围不一样
|
||||
|
||||
下图sRGB只能表示很小的三角形部分的色域
|
||||
|
||||

|
||||

|
||||
|
||||
### Perceptually Organized Color Spaces
|
||||
|
||||
|
@ -482,7 +481,7 @@ b轴上蓝和黄在两端
|
|||
|
||||
LAB空间认为任何一个轴上两端都是互补色
|
||||
|
||||

|
||||

|
||||
|
||||
#### 互补色理论
|
||||
|
||||
|
@ -498,11 +497,11 @@ LAB空间认为任何一个轴上两端都是互补色
|
|||
|
||||
如下图A,你会觉得B比A亮
|
||||
|
||||

|
||||

|
||||
|
||||
挡住A、B以外区域,会发现A和B颜色相同
|
||||
|
||||

|
||||

|
||||
|
||||
## 减色系统(CMYK)
|
||||
|
||||
|
@ -514,10 +513,10 @@ Cyan(蓝绿色)、Magenta(品红色)、Yellow(黄色)、Key(黑色
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
C、M、Y可以通过混合得到各种不同的颜色,所以在打印上,可以通过混合各种各样不同墨水调出各种各样不同的颜色
|
||||
|
||||

|
||||

|
||||
|
||||
印刷上要考虑成本,正常情况下打印东西以黑色居多,而且黑色的墨水好制作,便宜,C、M、Y这三种带颜色的墨水不容易制作,那用这三种颜色混合得到黑色,成本就比直接用黑色高,因而需要黑色墨水
|
||||
|
|
|
@ -20,13 +20,13 @@ date: 2022-07-20T17:56:31+08:00
|
|||
Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
#### 射线与轴对称包围盒相交(Ray Intersection with Axis-Aligned Box)
|
||||
|
||||
以下2D例子在3D场景中同样适用
|
||||
|
||||

|
||||

|
||||
|
||||
如上图所示,我们分别计算射线与包围盒两个边界的相交时间点,求取到$t_{min}/t_{max}$的交集
|
||||
|
||||
|
@ -44,7 +44,7 @@ Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
|
|||
|
||||
选择轴对称的原因:计算量少
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 统一空间分区\网格(Uniform Spatial Partitions/Grids)
|
||||
|
@ -53,22 +53,22 @@ Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
|
|||
|
||||
找到包围盒
|
||||
|
||||

|
||||

|
||||
|
||||
创建网格
|
||||
|
||||

|
||||

|
||||
|
||||
在与相应物体重叠的网格中存储对应的物体
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
根据射线穿过的网格顺序来遍历网格
|
||||
|
||||
对于每一个被遍历的网格,需要检测其中存储的物体是否与射线相交
|
||||
|
||||

|
||||

|
||||
|
||||
------------------------
|
||||
|
||||
|
@ -76,11 +76,11 @@ Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
|
|||
|
||||
网格仅有一个时无法起到加速算法的效果
|
||||
|
||||

|
||||

|
||||
|
||||
网格过多时,因需要遍历过多无关网格而低效
|
||||
|
||||

|
||||

|
||||
|
||||
最佳的网格数量为:
|
||||
$$cells = C * objs$$
|
||||
|
@ -98,8 +98,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
|
|||
#### 八叉树(Oct-Tree)
|
||||
|
||||
将整个场景包围在盒中,再将包围盒切分为8份(三维情况下,每面四块),下图展示的是二维下的情况,将整个盒子分为四块,再将每块都分成四块,直到每个格子中无物体或物体数量足够少
|
||||
|
||||

|
||||

|
||||
|
||||
通过这种方式将空间切成了分块并组织成了树状结构(一维下为二叉树,二维下为四叉树,三维下为八叉树,$n维下为2^n叉树$)
|
||||
|
||||
|
@ -109,7 +108,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
|
|||
|
||||
该方法是对空间进行二分的方法,即每次都选择一个方向将节点划分开,与KD-Tree不同在于其并非横平竖直地划分,且计算难度随维度升高而增加
|
||||
|
||||

|
||||

|
||||
|
||||
二维下用一条线划分,三维下用一个平面划分,四维用‘超平面’划分,依次类推
|
||||
|
||||
|
@ -119,7 +118,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
|
|||
|
||||
与八叉树几乎相同,但每找到一个格子后总是沿着某一个轴分开使整个空间被划分成类似二叉树的结构,如下图所示,划分是水平竖直交替进行的
|
||||
|
||||

|
||||

|
||||
|
||||
三维下,划分轴在X,Y,Z轴间轮替就可以在保持二叉树性质的情况下进行划分
|
||||
|
||||
|
@ -127,7 +126,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
|
|||
|
||||
将整个场景包围在盒子A中,先沿着竖直方向划分,再将这两个部分横向划分开,之后一直交替向下划分,形成一棵树
|
||||
|
||||

|
||||

|
||||
|
||||
如果一个空间已经被划分成了KD-Tree结构,则中间节点(A,B,C,D)只需要记录被划分成的各自格子,叶子节点则存储和格子相交的几何形体
|
||||
|
||||
|
@ -147,31 +146,33 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
|
|||
|
||||
假设有一根光线,从左上到右下,穿过一个包围盒A
|
||||
|
||||

|
||||

|
||||
|
||||
第一次判断是否与A存在交点,光线有交点则可能与左右子节点产生交集
|
||||
|
||||

|
||||

|
||||
|
||||
检测是否与子节点存在交点,发现与左边蓝色区域存在交点,按图中划分,1不再划分的情况下则认为光线与该叶子节点(蓝色区域内)所有物体求交
|
||||
|
||||

|
||||

|
||||
|
||||
检查右子节点,发现与右边区域也有交点,则光线可能和B的子节点(2和C)相交
|
||||
|
||||

|
||||

|
||||
|
||||
再判定光线与2和C区域相交情况,发现与2存在交点,此处假设2不再细分,2即为一个叶子节点,光线需要和2中所有物体求交
|
||||
|
||||

|
||||

|
||||
|
||||
发现与C区域存在交点,那便要判断光线和C的子节点(D、3)是否有交点,发现和3存在交点,且3为叶子节点,则光线要和3中的所有物体求交,D同理,一直求到叶子节点(区域5与光线无交点,无需求交)
|
||||
|
||||

|
||||

|
||||
|
||||
在C中光线和所有物体求交就找到了交点
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
##### KD-Tree的问题
|
||||
|
@ -194,17 +195,18 @@ BVH无论在实时的光线追踪还是离线的结构都解决了KD-Tree的问
|
|||
|
||||
同样将场景用一个盒子包围,与KD-Tree不同在于后者将物体划分为2个部分
|
||||
|
||||

|
||||

|
||||
|
||||
将上图方框中所有三角形分割成两个部分再重新求它们的包围盒
|
||||
|
||||

|
||||

|
||||
|
||||
同样再继续划分,将上图蓝色节点划分为两堆三角形再重新求它们的包围盒,对应下图蓝绿节点
|
||||
|
||||

|
||||

|
||||
|
||||
划分终止条件自定义:如一个节点中只有5个三角形存在
|
||||

|
||||
|
||||
总结:
|
||||
1. 找到一个包围盒
|
||||
|
@ -269,7 +271,7 @@ BVH无论在实时的光线追踪还是离线的结构都解决了KD-Tree的问
|
|||
1. 节点本身为叶子节点,此时光线与叶子节点里所有物体求交,放回最近交点
|
||||
2. 节点本身不是叶子节点,此时光线可能与该节点的两个子节点都有交点,递归地求出它们的交点再返回最近的点
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### 空间/物体划分区别
|
||||
|
@ -278,13 +280,13 @@ BVH无论在实时的光线追踪还是离线的结构都解决了KD-Tree的问
|
|||
1. 划分空间,任何一个节点在空间和时间之间不会有交集
|
||||
2. 有些物体存在横跨边界的可能
|
||||
|
||||

|
||||

|
||||
|
||||
* 物体划分(Object partition)
|
||||
1. 划分物体,物体分为两部分后分别计算包围盒
|
||||
2. 包围盒存在交集的可能,但不产生影响且无需计算包围盒相交方式
|
||||
|
||||

|
||||

|
||||
|
||||
-----------------------------------------
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ $$f(x,y,z) = (2 - \sqrt{x^2 + y^2})^2 + z^2 - 1$$
|
|||
|
||||
对应的几何形状如下图
|
||||
|
||||

|
||||

|
||||
|
||||
###### 易于判断内外关系
|
||||
|
||||
|
@ -57,7 +57,7 @@ $$f(x,y,z) = (2 - \sqrt{x^2 + y^2})^2 + z^2 - 1$$
|
|||
|
||||
$$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
|
||||
|
||||

|
||||

|
||||
|
||||
对于点$(\frac{3}{4},\frac{1}{2},\frac{1}{4})$ 若要判定其是否在该几何体内部则只需计算$$f(x,y,z) = - \frac{1}{8} < 0$$ 即可判定其位于几何体内部
|
||||
|
||||
|
@ -67,14 +67,14 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
|
|||
|
||||
表面是x,y,z中多项式的零集
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 构造实体几何(Constructive Solid Geometry)
|
||||
|
||||
通过布尔计算组合构造隐式几何
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 距离函数(Distance Functions)
|
||||
|
@ -83,7 +83,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
|
|||
|
||||
使用距离函数将两个曲面混合在一起
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 水平集(Level Set Method)
|
||||
|
@ -92,7 +92,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
|
|||
|
||||
解决方案:存储值相似的函数网格
|
||||
|
||||

|
||||

|
||||
|
||||
插值为零的值的位置即为表面
|
||||
|
||||
|
@ -105,7 +105,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
|
|||
|
||||
该几何形状表现为所有尺度的细节都存在自相似性(一种描述自然现象的说法),往往难以控制形状
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
---------------------------------------
|
||||
|
@ -126,7 +126,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
|
|||
|
||||
$$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 易于采样
|
||||
|
@ -137,7 +137,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
|
|||
|
||||
若要判定点$f(u,v)$是否位于表面,则只需将$(u,v)$的值相加
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 难以判断内外关系
|
||||
|
@ -157,7 +157,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
|
|||
4. 通常转换为多边形网格
|
||||
5. 难以用于采样不足的区域
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 多边形网格(Polygon Mesh)
|
||||
|
@ -168,7 +168,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
|
|||
4. 图形中最常见的表示形式
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -176,7 +176,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
|
|||
|
||||
### 表现形式应根据目标几何模型选择最合适的类型,没有最好的表现形式
|
||||
|
||||

|
||||

|
||||
|
||||
------------------------------
|
||||
|
||||
|
@ -187,51 +187,51 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
|
|||
贝塞尔曲线完全由其控制点决定其形状,$n$个控制点对应着$n-1$阶的贝塞尔曲线,并且可以通过递归的方式来绘制.
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### de Casteljau Algorithm(图形)
|
||||
|
||||
假设存在三个点(quadratic Bezier)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
通过线性插值的方式插入一个点
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
在另一边也通过同样方式插入一个点
|
||||
|
||||

|
||||

|
||||
|
||||
递归重复
|
||||
|
||||

|
||||

|
||||
|
||||
对于在$[0,1]$区间的每个t点都使用相同算法进行计算
|
||||
|
||||

|
||||

|
||||
|
||||
构造一个三次方贝塞尔曲线需要总共四个输入,都递归使用线性插值
|
||||
|
||||

|
||||

|
||||
|
||||
可视化算法流程
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### de Casteljau Algorithm(数学公式)
|
||||
|
||||
de Casteljau 算法给出各点间金字塔型的变量关系
|
||||
|
||||

|
||||

|
||||
|
||||
##### 推导流程
|
||||
|
||||

|
||||

|
||||
|
||||
$$b_0^1(t) = (1 - t)b_0 + tb_1$$
|
||||
$$b_1^1(t) = (1 - t)b_1 + tb_2$$
|
||||
|
@ -264,7 +264,7 @@ $$b^n(t) = b_0(1 - t)^3 + b_1 3t(1 - t)^2 + b_2 3t^2(1 - t) + b_3 t^3$$
|
|||
|
||||
贝塞尔基本函数
|
||||
|
||||

|
||||

|
||||
|
||||
插值端点:$b(0) = b_0;b(1) = b_3$
|
||||
|
||||
|
@ -283,7 +283,7 @@ $$b^n(t) = b_0(1 - t)^3 + b_1 3t(1 - t)^2 + b_2 3t^2(1 - t) + b_3 t^3$$
|
|||
|
||||
样例:
|
||||
|
||||

|
||||

|
||||
|
||||
#### 组合计算
|
||||
|
||||
|
@ -292,15 +292,15 @@ $$b^n(t) = b_0(1 - t)^3 + b_1 3t(1 - t)^2 + b_2 3t^2(1 - t) + b_3 t^3$$
|
|||
$$a:[k,k+1] \rightarrow IR^N$$
|
||||
$$b:[k+1,k+2] \rightarrow IR^N$$
|
||||
|
||||

|
||||

|
||||
|
||||
$c^0$处的连续性:$a_n = b_0$
|
||||
|
||||

|
||||

|
||||
|
||||
$c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
||||
|
||||

|
||||

|
||||
|
||||
------------------------------------
|
||||
|
||||
|
@ -312,7 +312,7 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
|||
|
||||
输出:由$[0,1]^2$ 参数化的2D平面
|
||||
|
||||

|
||||

|
||||
|
||||
#### 计算方法
|
||||
|
||||
|
@ -321,11 +321,11 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
|||
1. 使用 de Casteljau 算法来计算四条贝塞尔曲线上各自的U,这将会为"移动"贝塞尔曲线提供4个有效的控制点
|
||||
2. 使用一阶 de Casteljau 算法来计算"移动"曲线上的点V
|
||||
|
||||

|
||||

|
||||
|
||||
可视化计算流程:
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -335,7 +335,7 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
|||
|
||||
目的:提高分辨率
|
||||
|
||||

|
||||

|
||||
|
||||
通常做法:
|
||||
|
||||
|
@ -350,20 +350,20 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
|||
|
||||
新顶点:
|
||||
|
||||

|
||||

|
||||
|
||||
白点即为新顶点,其位置为周围四个顶点的权重之和
|
||||
|
||||
旧顶点:
|
||||
|
||||

|
||||

|
||||
|
||||
白色旧顶点也是自身及邻接顶点的权重之和,权重的设置与旧顶点度数关联
|
||||
|
||||
|
||||
##### Catmull-Clark Subdivision
|
||||
|
||||

|
||||

|
||||
|
||||
定义:
|
||||
|
||||
|
@ -373,7 +373,7 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
|||
|
||||
第一次细分后结果:
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
特点:
|
||||
|
@ -384,28 +384,28 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
|
|||
|
||||
Catmull-Clark 顶点更新规则
|
||||
|
||||

|
||||

|
||||
|
||||
##### 收敛性:整体形状和折痕
|
||||
|
||||

|
||||

|
||||
|
||||
#### 曲面简化(Mesh Simplification)
|
||||
|
||||
目的:降低分辨率的同时尽量保持形状/外观
|
||||
|
||||

|
||||

|
||||
|
||||
##### 边坍缩
|
||||
|
||||
边坍缩是曲面简化的常用方法,如上图所示将一条边的两个顶点合成为一个顶点,出于尽量保持形状的目的,需要正确选择不影响或影响最小的边进行坍缩,由此引入二次误差度量(Quadric Error Metrics)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 二次误差度量(Quadric Error Metrics)
|
||||
|
||||

|
||||

|
||||
|
||||
坍缩之后蓝色新顶点所在位置与原来各个平面的垂直距离之和,如此误差最小则整个模型样貌修改一定程度也会较小
|
||||
|
||||
|
@ -418,7 +418,7 @@ Catmull-Clark 顶点更新规则
|
|||
|
||||
符合贪心算法标准,无法获得最优解,但效果依旧合适
|
||||
|
||||

|
||||

|
||||
|
||||
-------------------------------------------
|
||||
|
||||
|
@ -436,7 +436,7 @@ Shadow Mapping是一种基于图像的算法
|
|||
Pass1:render from light
|
||||
1. 获得从光源视角得到的深度图像
|
||||
|
||||

|
||||

|
||||
|
||||
Pass2:render from eye
|
||||
1. 从观看视角(相机视角)获得带有深度的标准图像
|
||||
|
@ -444,7 +444,7 @@ Pass2:render from eye
|
|||
1. 光源和观看视角的下的深度相同时为可见
|
||||
2. 光源和观看视角下的深度不相同则为被阻挡
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
----------------------------------------------
|
||||
|
|
|
@ -24,7 +24,7 @@ date: 2022-08-01T16:38:54+08:00
|
|||
|
||||
* 远古人类壁画
|
||||
|
||||

|
||||

|
||||
|
||||
* 圆盘转动
|
||||
|
||||
|
@ -32,14 +32,14 @@ date: 2022-08-01T16:38:54+08:00
|
|||
|
||||
最早起,有类似圆盘的物体,可固定在某处,可以旋转
|
||||
|
||||

|
||||

|
||||
|
||||
* 第一部电影
|
||||
|
||||
早期不用于娱乐,是一种科学研究的设备,如下图拍摄奔跑中的马可用于研究马匹运动时四肢动态
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 第一部与电影时长相当的动画
|
||||
|
||||
|
@ -47,28 +47,28 @@ date: 2022-08-01T16:38:54+08:00
|
|||
|
||||
每秒播放24帧,制作耗时极长
|
||||
|
||||

|
||||

|
||||
|
||||
* 第一部计算机生成的动画
|
||||
|
||||
可追溯至1963年
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 早期计算机动画
|
||||
|
||||
如下图为人脸的三维结构网格,已经可以做到人物面部表情
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 电子(计算机生成)恐龙(Digital Dinosaurs)
|
||||
|
||||
如下图,侏罗纪公园,真正将计算机生成的恐龙放入电影中
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 第一部计算机生成的电影时长动画
|
||||
|
||||
|
@ -78,21 +78,20 @@ date: 2022-08-01T16:38:54+08:00
|
|||
|
||||
采用光栅化的方式生成阴影效果
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 十年前的计算机动画
|
||||
|
||||
依旧缺少一些细节
|
||||
|
||||

|
||||

|
||||
|
||||
* 2019-冰雪奇缘2
|
||||
|
||||
充满各种细节
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
## 关键帧动画
|
||||
|
||||
|
@ -102,7 +101,7 @@ date: 2022-08-01T16:38:54+08:00
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
### 关键帧插值
|
||||
|
||||
|
@ -115,7 +114,7 @@ date: 2022-08-01T16:38:54+08:00
|
|||
最简单的是线性插值,但下图为非线性插值
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
线性插值:
|
||||
|
||||
|
@ -124,7 +123,7 @@ date: 2022-08-01T16:38:54+08:00
|
|||
有时需要更好的连续性,就需要用到曲线和样条,这说明几何和动画之间时存在联系的
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
-------------
|
||||
|
||||
|
@ -145,21 +144,21 @@ a:物体的加速度
|
|||
1. 小球在重力影响下抛出时会形成抛物线
|
||||
2. 衣服可认为由网格形成,任何一个顶点有一定质量,受重力影响,也受其他点作用的力的影响
|
||||
|
||||

|
||||

|
||||
|
||||
#### 案例
|
||||
|
||||
* 布料模拟
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 流体仿真
|
||||
|
||||
1. 模拟水的运动和水滴的形成位置
|
||||
2. 模拟了位置和形状后进行渲染得到样式
|
||||
|
||||

|
||||

|
||||
|
||||
### 质点弹簧系统
|
||||
|
||||
|
@ -169,25 +168,25 @@ a:物体的加速度
|
|||
|
||||
将一根绳子模拟成很多小的弹簧,允许其在重力作用下来回摆动
|
||||
|
||||

|
||||

|
||||
|
||||
* 头发
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 布料
|
||||
|
||||
布料是由网格描述的,可以使用各种不同的质点弹簧系统描述,还可使用一个点进行拖拽
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
建模足够好的情况下,模拟与仿真可以做到与现实几乎一致
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
上图受限于PDF,建议结合games101第21课
|
||||
|
||||
|
@ -197,7 +196,7 @@ a:物体的加速度
|
|||
|
||||
* 最基础的单元:一个弹簧两侧连着两个质点
|
||||
|
||||

|
||||

|
||||
|
||||
* 理想的弹簧(无长度,产生的力与被拉长的长度成比例)
|
||||
|
||||
|
@ -239,7 +238,7 @@ $$\ddot{x} = a$$
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
问题:
|
||||
|
||||
|
@ -253,7 +252,7 @@ $$\ddot{x} = a$$
|
|||
|
||||
大小:下图红框部分,a和b之间的相对速度投影在ab方向上的速度
|
||||
|
||||

|
||||

|
||||
|
||||
#### 弹簧结构
|
||||
|
||||
|
@ -262,20 +261,20 @@ $$\ddot{x} = a$$
|
|||
|
||||
如下图,可以每2根共用一个质量表示一张平面,也可以在三维空间中进行连接
|
||||
|
||||

|
||||

|
||||
|
||||
##### 使用各种弹簧模拟一块布
|
||||
|
||||
1. 问题1:切变会受影响
|
||||
2. 问题2:存在一种力让整个形状变得不是一个平面
|
||||
|
||||

|
||||

|
||||
|
||||
* 加入斜的对角线解决切边
|
||||
|
||||
在以上的形状中加入斜的对角线,发生切变时,新加的蓝线会被压缩,那弹簧就会向外抵抗它
|
||||
|
||||

|
||||

|
||||
|
||||
存在结构不对称问题,无法使模拟的布在任何一个方向拉它,它的行为保持一致
|
||||
|
||||
|
@ -283,7 +282,7 @@ $$\ddot{x} = a$$
|
|||
|
||||
不能抵抗非平面的弯曲(沿着竖的或横的线折叠)
|
||||
|
||||

|
||||

|
||||
|
||||
* 加上跳过相邻质点的连接线
|
||||
|
||||
|
@ -291,7 +290,7 @@ $$\ddot{x} = a$$
|
|||
|
||||
红线的连接是非常弱的,蓝线非常强
|
||||
|
||||

|
||||

|
||||
|
||||
* 例子
|
||||
|
||||
|
@ -300,15 +299,14 @@ $$\ddot{x} = a$$
|
|||
简化的表示,未表示纤维、股和线等之间的力的关系
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 拓展
|
||||
|
||||
除了质点弹簧系统,还有其他的方法,比如有限元方法(FEM (Finite Element Method)),这个方法被广泛应用于车辆碰撞,能够表现力之间的传导作用
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
### 粒子系统
|
||||
|
||||
用于描述一些很小很小移动的东西
|
||||
|
@ -320,8 +318,7 @@ $$\ddot{x} = a$$
|
|||
粒子越多模拟得越精细,但是越慢;越少,计算速度越快,但效果差一些
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
#### 存在问题
|
||||
|
||||
1. 粒子系统可以模拟流体,这样可能需要很多粒子
|
||||
|
@ -356,17 +353,17 @@ $$F_g = G\frac{m_1m_2}{d^2}$$
|
|||
|
||||
$$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
||||
|
||||

|
||||

|
||||
|
||||
* 银河模拟
|
||||
|
||||

|
||||

|
||||
|
||||
* 基于粒子的流体模拟
|
||||
|
||||
模拟的是粒子,渲染的是像玻璃、是否带白沫
|
||||
|
||||

|
||||

|
||||
|
||||
#### 粒子间相互作用
|
||||
|
||||
|
@ -382,16 +379,16 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
有了以上的属性就可以通过粒子的方法解出来
|
||||
|
||||

|
||||

|
||||
|
||||
* 分子结构
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 人群
|
||||
|
||||

|
||||

|
||||
|
||||
## 运动学
|
||||
|
||||
|
@ -403,13 +400,12 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
用于描述和人骨骼连接拓扑结构类似的结构,可定义不同的关节
|
||||
|
||||

|
||||
|
||||

|
||||
* Pin
|
||||
|
||||
钉子钉住后只能在钉住的平面内往一个方向旋转
|
||||
|
||||

|
||||

|
||||
|
||||
* Ball
|
||||
|
||||
|
@ -421,18 +417,18 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
可以拉长,也就是可以有一些移动
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 一个简单的关节
|
||||
|
||||
如下图,只能在平面内发生旋转,类似于肩和肘的旋转,假设第一段旋转$\theta_1$度,第二段旋转$\theta_2$度,如何确定尖端位置
|
||||
|
||||

|
||||

|
||||
|
||||
先算出上方黑点的位置,因为$\theta_2$是在$\theta_1$的基础上旋转的,可以用$\theta_1$加$\theta_2$计算
|
||||
|
||||

|
||||

|
||||
|
||||
因此,正向运动学需要定义好连接方式,定义好它们之间的各种位置,就可以找到各种点的位置
|
||||
|
||||
|
@ -440,7 +436,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
人类行走动作模拟
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -462,11 +458,11 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
逆运动学可以手里捏着尖端到处移动,它会自动的调整它的关节的位置,使得尖端就在你要的位置上
|
||||
|
||||

|
||||

|
||||
|
||||
如下图中,给出固定点P,它就会给出$\theta_1$和$\theta_2$,解出这两个角度的过程比较复杂
|
||||
|
||||

|
||||

|
||||
|
||||
#### 问题
|
||||
|
||||
|
@ -475,17 +471,16 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
如图,尖端位置确定,但存在两个解
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
* 存在无解的情况
|
||||
|
||||
最上面的关节点只可能出现在下图的虚线上,尖端通过旋转可以在一个圆上,从而尖端只有可能在外层的圈和内层的圈之间,其他位置到不了
|
||||
|
||||

|
||||
|
||||

|
||||
#### 问题优化
|
||||
|
||||
一般N维IK问题的数值求解
|
||||
|
@ -503,7 +498,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
例子:
|
||||
|
||||

|
||||

|
||||
|
||||
### 形状混合
|
||||
|
||||
|
@ -512,8 +507,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
实际为混合控制点及其影响区域
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 动作捕捉
|
||||
|
||||
|
@ -521,7 +515,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
#### 优缺点
|
||||
|
||||
|
@ -537,7 +531,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
捕捉出来的动作可能不符合艺术家的需求,需要调整(比如真人去演动画人物,动画人物的表情是很夸张的;或者有时捕捉不到好的数据,比如捕捉条件有限制,人在正面的时候看到的控制点,背面也有但正面看不到,那就要在背后加一个摄像机,这就需要成本,而且正常需要更多的摄像机;人物动作的时候还会遮挡)
|
||||
|
||||

|
||||

|
||||
|
||||
#### 其他捕捉方法
|
||||
|
||||
|
@ -545,21 +539,21 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
### 光学动作捕捉
|
||||
|
||||
应用最广泛的还是光学的捕捉方法,贴一些Maker(贴片或小球)贴在人身上,然后用很多很复杂的摄像机,将这些点的位置非常准确的测出来
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
#### 获取的动作数据
|
||||
|
||||
下图曲线就为一个控制点不同时间在三维空间中的位置
|
||||
|
||||

|
||||

|
||||
|
||||
#### 面部动画的问题
|
||||
|
||||
|
@ -568,21 +562,21 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
恐怖谷效应:人们会对生成的过于真实的人类感到害怕
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
#### 面部动作捕捉
|
||||
|
||||
阿凡达这部电影具有里程碑式的效应,就是因为使用了面部动作捕捉
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
#### 动画/电影的生成过程
|
||||
|
||||
分别为Pre-Production、Production、Post-Production三个部分,具体工作内容和职责可由下图所示
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
-----------------------------------
|
||||
|
||||
|
@ -595,7 +589,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
|
|||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
此时在任何一个位置x和时间t,都有一个速度
|
||||
|
||||
|
@ -613,7 +607,7 @@ $$\frac{dx}{dt} = \dot{x} = v(x,t)$$
|
|||
|
||||
已知速度和起始位置,求任意时刻位置
|
||||
|
||||

|
||||

|
||||
|
||||
将时间细分为很多的小块,不断计算$t+\Delta t$的位置
|
||||
|
||||
|
@ -631,7 +625,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t + \Delta t \ddot{x}^t$$
|
|||
|
||||
$\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路线偏离得越多
|
||||
|
||||

|
||||

|
||||
|
||||
* 不稳定性
|
||||
|
||||
|
@ -642,7 +636,7 @@ $\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路
|
|||
事实上,粒子在一个螺旋形的速度场,一定会按照严格的圆周运动
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
如下图速度场中,粒子运动轨迹与实际按一根曲线慢慢走到水平存在极大差别
|
||||
|
||||
|
@ -662,7 +656,7 @@ $\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路
|
|||
|
||||
如下图对应链接的视频,在绝地求生中,车辆撞上摩托后会出现奇怪的翻滚现象,这在许多存在物理引擎的游戏中普遍存在
|
||||
|
||||

|
||||

|
||||
|
||||
#### 解决办法
|
||||
|
||||
|
@ -674,7 +668,7 @@ $\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路
|
|||
2. 取原始点和a点之间的中点b,考虑它所在的速度
|
||||
3. 再回到原始的出发点,应用b点的速度来重新再算一遍欧拉方法,到达c点
|
||||
|
||||

|
||||

|
||||
|
||||
$$x_{mid} = x(t) + \Delta t/2 \cdot v(x(t),t)$$
|
||||
|
||||
|
@ -698,7 +692,7 @@ $$\dot{x}^{t+\Delta t} = x^t +\Delta t \dot{x}^t + \frac{(\Delta t)^2}{2}\ddot{x
|
|||
|
||||
将时间减半,得到2个$\Delta t$,计算2次,从原始点先用$\frac{\Delta t}{2}$ 算到一个位置,再使用$\frac{\Delta t}{2}$再算一次,到达$\frac{x_T}{2}$
|
||||
|
||||

|
||||

|
||||
|
||||
如果$x_T和\frac{x_T}{2}$这2个点差得挺远,这就意味着将$\Delta t$分成2部分分别考虑这样做会更准确,那就应该考虑$\frac{\Delta t}{2}$;如果差得不远,就没必要再分下去
|
||||
|
||||
|
@ -732,7 +726,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
|
|||
|
||||
下面的4个值是不同位置和不同时间在速度场中的值
|
||||
|
||||

|
||||

|
||||
|
||||
#### 非物理方法
|
||||
|
||||
|
@ -752,7 +746,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
|
|||
|
||||
如下图,一个刚体的位置、朝向、速度、角速度分别对时间求导后得到速度、角速度、加速度、角加速度
|
||||
|
||||

|
||||

|
||||
|
||||
## 流体模拟
|
||||
|
||||
|
@ -765,7 +759,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
|
|||
3. 给定任何一个时刻这些小球它们分布,都可以知道任何一个地方的密度。如果有任何一个地方的密度变得和水一开始平静的时候的密度不一样,那就需要通过移动小球的位置把这个密度修正
|
||||
4. 需要知道任何一个点它的密度对所有的小球位置的梯度(导数)
|
||||
|
||||

|
||||

|
||||
|
||||
### 欧拉方法和拉格朗日方法
|
||||
|
||||
|
@ -777,7 +771,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
|
|||
|
||||
如下图,如果模拟一群小鸟的移动,就只关注某一只
|
||||
|
||||

|
||||

|
||||
|
||||
* 欧拉方法俗称网格法
|
||||
|
||||
|
@ -785,7 +779,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
|
|||
|
||||
如下划分多个网格就知道时间t为黑色的鸟,t-1应显示蓝色的鸟
|
||||
|
||||

|
||||

|
||||
|
||||
### 物质点方法
|
||||
|
||||
|
@ -795,7 +789,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
|
|||
2. 融化的过程在网格中做
|
||||
3. 再将格子上的信息写回不同的粒子上去
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
-------------------------
|
||||
|
|
|
@ -17,7 +17,7 @@ date: 2022-07-23T15:05:33+08:00
|
|||
|
||||
从某个立体角($\omega$)来的Radiance会打在dA上,在dA上转换成能量,并以光的形式辐射到另一个方向上去(dLr),即表现为出去的Radiance
|
||||
|
||||

|
||||

|
||||
|
||||
对于dA来说,其接收到的能量只考虑某一方向下立体角的Radiance,在投影后就可以计算dA接收到的Irradiance,Irradiance又会转换成Radiance反射出去
|
||||
|
||||
|
@ -29,7 +29,7 @@ date: 2022-07-23T15:05:33+08:00
|
|||
|
||||
BRDF描述了dA表面是如何把一个方向收集到的能量反射到另一个方向去(定义收集到的能量如何如何往各个方向去分配(漫反射还是镜面反射))
|
||||
|
||||

|
||||

|
||||
|
||||
镜面反射下,反射出去的方向上分布了所有能量
|
||||
|
||||
|
@ -41,7 +41,7 @@ BRDF本质上描述了光线和物体是如何作用的,因而BRDF项也定义
|
|||
|
||||
反射方程定义的是任意着色点,在不同的光照下,我们考虑任意一个输入的光照的入射方向对出射方向的贡献,并累加所有入射方向的贡献
|
||||
|
||||

|
||||

|
||||
|
||||
公式解释:
|
||||
|
||||
|
@ -68,21 +68,21 @@ $$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)
|
|||
|
||||
* 对于一个点光源,反射方程描述Li进来经过BRDF反射到观察方向上去的能量
|
||||
|
||||

|
||||

|
||||
|
||||
* 如果有多个光源,就累加计算每个点光源光线到这个点反射到观测方向上的能量值
|
||||
|
||||

|
||||

|
||||
|
||||
* 如果有一个面光源(一堆点光源的集合),则将面光源上任意一个点的贡献积分起来
|
||||
|
||||

|
||||

|
||||
|
||||
渲染方程:
|
||||
|
||||
* 在考虑其他物体反射过来的光时,可以将反射面视为光源,由于渲染方程假设所有方向都是向外的,所以从x点指向反射面就要变成负的
|
||||
|
||||

|
||||

|
||||
|
||||
该点向某一观察方向辐射出去的Radiance是依赖于其他点辐射出去的Radiance,即为递归过程
|
||||
|
||||
|
@ -91,7 +91,7 @@ $$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)
|
|||
|
||||
在某个方向看向一点时,我们不知道看到的能量(Lr)、从其他反射到这一点的Radiance,但其他项都已知,可定义物体的不同材质(diffuse、gloss、specular)
|
||||
|
||||

|
||||

|
||||
|
||||
可利用数学上的一些简单表达式进行简化
|
||||
|
||||
|
@ -147,19 +147,18 @@ $$ L = E +KE+ K^2E +K^3E + \ldots $$
|
|||
|
||||
* 直接光照(光源能直接照射的地方有颜色,其余位置为黑的)
|
||||
|
||||

|
||||
|
||||

|
||||
* 一次间接光照(光弹射两次)
|
||||
|
||||

|
||||

|
||||
|
||||
* 两次间接光照(光弹射一次,两次,三次累积后的全局光照效果)
|
||||
|
||||

|
||||

|
||||
|
||||
* 四次间接光照(玻璃灯内部变亮,在弹射三次时,仅足够进入物体,不足以离开物体)(双层玻璃需要两次弹射进入,两次弹射离开)
|
||||
|
||||

|
||||

|
||||
|
||||
8次弹射和16次弹射只会提高暗处亮度,难以感知到
|
||||
|
||||
|
|
|
@ -48,12 +48,12 @@ $R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)R_y(\beta)R_z(\gamma)$
|
|||
|
||||
此时的三个旋转方向将被称为roll,pich,yaw
|
||||
|
||||

|
||||

|
||||
|
||||
-----------------------
|
||||
|
||||
对于围绕某一特定点进行旋转的行为,则将该点平移至原点处后视为绕特定轴旋转
|
||||

|
||||

|
||||
|
||||
|
||||
---------------------------
|
||||
|
@ -110,7 +110,7 @@ view = translate * view;//移动相机位置到顶点
|
|||
|
||||
图示
|
||||
|
||||

|
||||

|
||||
|
||||
--------------------
|
||||
|
||||
|
@ -126,12 +126,12 @@ view = translate * view;//移动相机位置到顶点
|
|||
|
||||
将远平面与近平面连线形成的梯形“挤压”到成为一个正方体
|
||||
|
||||
24R8DF[AB98E9]@1.png)
|
||||

|
||||
|
||||
挤压的过程对梯形做横切面可知,计算挤压后的坐标点值实质上为计算相似三角形
|
||||
|
||||
如下图,可知挤压后的坐标与之前的坐标存在的数学关系为
|
||||

|
||||

|
||||
|
||||
$$y^{'}=\frac{n}{z}y$$ $$x^{'}=\frac{n}{z}x$$
|
||||
|
||||
|
@ -193,10 +193,10 @@ $$\begin{pmatrix} n &0 &0 &0 \\\\ 0 &n &0 &0 \\\\ 0 &0 &n+f &-nf \\\\ 0 &0 &1 &0
|
|||
FovY表示视域,即摄像机在固定时能看到的最大角度或最低角度的范围
|
||||
|
||||
Aspect ratio 表示纵横比,投影平面的长宽比
|
||||

|
||||

|
||||
|
||||
对应的相似三角形关系不变,参数改变
|
||||

|
||||

|
||||
可得如下关系
|
||||
$$\tan{\frac{fovY}{2}}=\frac{t}{|n|}$$
|
||||
$$aspect=\frac{r}{t}$$
|
||||
|
|
|
@ -14,7 +14,7 @@ date: 2022-05-19T11:55:15+08:00
|
|||
3. 光线方向(许多光线中的一条),l
|
||||
4. 模型表面性质(如,颜色,粗糙度等)
|
||||
|
||||

|
||||

|
||||
|
||||
#### blinn-phong
|
||||
|
||||
|
@ -26,7 +26,7 @@ date: 2022-05-19T11:55:15+08:00
|
|||
2. 漫反射(diffuse reflection):来自于光在物体表面的散射现象
|
||||
3. 环境光(ambient lighting):光在物体之间弹射,最终在整个环境中形成的一个基本光
|
||||
|
||||

|
||||

|
||||
|
||||
由此可见,一个物体在渲染后体现的颜色是这三种光的总和,即每个位置的颜色就是specular+diffuse+ambient
|
||||
|
||||
|
@ -37,7 +37,7 @@ date: 2022-05-19T11:55:15+08:00
|
|||
|
||||
根据lambert's cosine law,反射点吸收能量的多少与反射点法线和光线的夹角有关,即如图中表现的$\cos{\theta}=l\cdot n$
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
由此我们可以将漫反射总结为如下公式(lambertian Shading)
|
||||
|
@ -54,7 +54,7 @@ $L_d=k_d(I/r^2)max(0,n\cdot l)$
|
|||
|
||||
高光(Specular)指的是视线在一定的角度区域观看模型表面时会产生一个类似镜面反射的效果
|
||||
|
||||

|
||||

|
||||
|
||||
如图中黄色区域为可见高光的视线范围
|
||||
|
||||
|
@ -65,7 +65,7 @@ $$ h=bisector(v,l) = \frac{v+l}{ || v+l || } $$
|
|||
$$L_s=k_s(I/r^2)max(0,\cos \alpha)^p$$
|
||||
$$\quad =k_s(I/r^2)max(0,n \cdot h)^p$$
|
||||
|
||||

|
||||

|
||||
|
||||
$ k_s $ : 镜面反射系数
|
||||
$ p $ : 高光的面积,P越大高光面积越小
|
||||
|
@ -73,7 +73,7 @@ $ L_s $ : 计算的高光效果光线
|
|||
|
||||
高光的效果和范围大小与$k_s$和p有关,下图展示了变化效果
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### ambient Term (环境光)
|
||||
|
@ -88,7 +88,7 @@ $k_a$ : 环境光系数,确定当前环境的底色
|
|||
|
||||
##### Blinn-phong Reflection Model
|
||||
|
||||

|
||||

|
||||
|
||||
$$L = L_a + L_d + L_s $$
|
||||
$$\quad = k_aI_a+k_d(I/r^2)max(0,n\cdot l)+k_s(I/r^2)max(0,n\cdot h)^p$$
|
||||
|
@ -105,19 +105,19 @@ $$\quad = k_aI_a+k_d(I/r^2)max(0,n\cdot l)+k_s(I/r^2)max(0,n\cdot h)^p$$
|
|||
1. 三角形面或一个法线向量视为是一个平面
|
||||
2. 对平滑表面的表现力不友好
|
||||
|
||||

|
||||

|
||||
|
||||
逐顶点渲染(Gouraud shading)
|
||||
1. 根据三角形顶点对颜色进行插值计算
|
||||
2. 每一个顶点都有一个法线向量
|
||||
|
||||

|
||||

|
||||
|
||||
1. 如何获取逐顶点的法线向量
|
||||
1. 对于标准的几何图形:顶点的法线向量就在顶点位置
|
||||
2. 对于非标准的几何图形:包含该顶点的周围几个表面的法线取平均值,可由计算公式$$ N_v=\frac{\sum_{i}N_i}{\lVert \sum_{i}N_i \rVert}$$ 得到
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
逐像素渲染(phong shading)
|
||||
|
@ -125,8 +125,7 @@ $$\quad = k_aI_a+k_d(I/r^2)max(0,n\cdot l)+k_s(I/r^2)max(0,n\cdot h)^p$$
|
|||
2. 对每一个像素计算完整的渲染模型
|
||||
3. 注意:非Blinn-Phong反射模型
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
------------------------------
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ date: 2022-07-25T15:23:18+08:00
|
|||
|
||||
用于描述光线和不同材质间的作用关系
|
||||
|
||||

|
||||

|
||||
|
||||
上图从左至右分别为三维空间中的网格模型,渲染出的两种不同结果
|
||||
|
||||
|
@ -20,8 +20,7 @@ date: 2022-07-25T15:23:18+08:00
|
|||
|
||||
漫反射:任何一根光线打到漫反射位置的点上会被均匀地分散到各个不同的方向上去
|
||||
|
||||

|
||||
|
||||

|
||||
* 漫反射材质可定义任何一个不同的点上不同的漫反射系数
|
||||
|
||||
经验定义:
|
||||
|
@ -35,7 +34,7 @@ date: 2022-07-25T15:23:18+08:00
|
|||
|
||||
因此如果如果这个点不发光也不吸收光(白的),那就意味着所有的光进来多少就发射出去多少。也就是进来多少Irradiance,就会出去多少Irradiance,因为Radiance是一致的的,所以入射和出射的Radiance也要是一样的
|
||||
|
||||

|
||||

|
||||
|
||||
要使Li等于Lo,所以BRDF为$1/\pi$,此时是完全不吸收能量的
|
||||
|
||||
|
@ -48,12 +47,12 @@ $$f_r = \rho/\pi$$
|
|||
|
||||
类似于镜面反射又有些粗糙
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### 类玻璃/水的通透材质
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
左图为玻璃球(水的性质),右图有颜色且来自于玻璃球壳内,说明折射光在玻璃里传播时会被部分吸收
|
||||
|
@ -65,7 +64,7 @@ $$f_r = \rho/\pi$$
|
|||
|
||||
镜面反射:入射角等于反射角
|
||||
|
||||

|
||||

|
||||
|
||||
##### 计算公式
|
||||
|
||||
|
@ -84,7 +83,7 @@ $$f_r = \rho/\pi$$
|
|||
|
||||
所以已知$\theta和\phi$,就可以计算出射方向
|
||||
|
||||

|
||||

|
||||
|
||||
镜面反射:
|
||||
|
||||
|
@ -127,7 +126,7 @@ $$f_r(p,\omega_0,\omega_i) = F_r(\omega_r)\frac{\delta(\omega_i - \omega_r)}{\co
|
|||
形成原因:光线打到的海水表面时,光线会往不同的方向去折射,对于海底的某一个点来说,有几率接收到来自不同方向打过来的光
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -135,7 +134,7 @@ $$f_r(p,\omega_0,\omega_i) = F_r(\omega_r)\frac{\delta(\omega_i - \omega_r)}{\co
|
|||
|
||||
不同材质拥有不同的额折射率,如真空认为是1,水为1.333,折射率越高说明光在穿过这个材质时会被折射得非常厉害,折射角会非常小,体现出不同波长的光被折射得不同程度
|
||||
|
||||

|
||||

|
||||
|
||||
方位角的朝向中,入射光和折射光也是正好相反的
|
||||
|
||||
|
@ -143,7 +142,7 @@ $$f_r(p,\omega_0,\omega_i) = F_r(\omega_r)\frac{\delta(\omega_i - \omega_r)}{\co
|
|||
|
||||
$$\eta_i \sin\theta_i = \eta_t \sin\theta_t$$
|
||||
|
||||

|
||||

|
||||
|
||||
由斯内尔定律可计算折射角的余弦
|
||||
|
||||
|
@ -173,8 +172,7 @@ $$\frac{\eta_i}{\eta_t} > 1$$
|
|||
人在水底,往各个不同的方向看,只能看到一个锥形的区域(97.2度)。如下图,最左边的一根光线的折射角就已经达到90度了,如果角度再大一点,所有能量都会反射到池子底部
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
#### BSDF = BRDF + BTDF
|
||||
|
||||
|
@ -184,7 +182,7 @@ BRDF中的R表示反射,折射是BTDF,其中的T是transmit。BRDF和BTDF加
|
|||
|
||||
反射率取决于入射角(和光的偏振)的现象
|
||||
|
||||

|
||||

|
||||
|
||||
如上图中,反射现象随着视角变化而明显
|
||||
|
||||
|
@ -194,7 +192,7 @@ BRDF中的R表示反射,折射是BTDF,其中的T是transmit。BRDF和BTDF加
|
|||
|
||||
下图的另外两根线表示的是极化现象,和光线的波动性有关,其实光线是沿着各个不同方向有振动的,极化就是只沿着某一个方向振动(S和P是两个方向的极化)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### 导体
|
||||
|
@ -203,14 +201,14 @@ BRDF中的R表示反射,折射是BTDF,其中的T是transmit。BRDF和BTDF加
|
|||
|
||||
导体的折射率是复数,需要一个N和一个K
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### 菲涅尔项的公式
|
||||
|
||||
一个0到1之间的数,有多少能量会被反射,2个不同的极化(polarization:S和P)会告诉你不同的反射率,如果考虑不极化的光,就将2项平均
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -247,7 +245,7 @@ $$R(\theta) = R_0 + (1 - R_0)(1 - \cos\theta)^5$$
|
|||
|
||||
漫反射将光反射到各个方向上就是认为所有的微表面都像一个很小的镜子,分布又各不规则,最后形成的分布就会把光打到各个不同的方向上去
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### 微表面法线分布
|
||||
|
@ -258,13 +256,12 @@ glossy材质:
|
|||
|
||||
如下图的表面,看起来很平,它们的分布法线差的不太远,基本都是朝上的。所以如果将它们的分布画出来,它们的法线会集中在宏观的表面法线的周围
|
||||
|
||||

|
||||
|
||||

|
||||
diffuse材质:
|
||||
|
||||
如下图,如果表面粗糙(意味着所有的微表面会沿着不同的方向),如果将法线画出来,那它的分布就会离中心离的特别远都会有分布的值
|
||||
|
||||

|
||||

|
||||
|
||||
* 微表面模型的BRDF公式
|
||||
|
||||
|
@ -284,13 +281,13 @@ diffuse材质:
|
|||
|
||||
光线近似平行于表面时更易发生自遮挡,这种入射方向为掠射角(Grazing Angle),阴影遮掩的提出正是用于修正掠影角
|
||||
|
||||

|
||||

|
||||
|
||||
-------------------
|
||||
|
||||
使用微表面材质渲染得到的图像质量很高,且微表面模型可描述的物体种类较多,金属、皮质、木头
|
||||
|
||||

|
||||

|
||||
|
||||
#### 各向同性/各向异性材质
|
||||
|
||||
|
@ -298,18 +295,17 @@ diffuse材质:
|
|||
|
||||
当金属为拉丝金属,就会产生如图现象
|
||||
|
||||

|
||||

|
||||
|
||||
* 各向同性:认为其微表面不存在一定的方向性,或方向性微弱
|
||||
|
||||
下图可见法线在各个方向上的分布是均匀的
|
||||
|
||||

|
||||

|
||||
|
||||
* 各向异性:认为其法线分布具有明确的方向性
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
* Anisotropic BRDFs
|
||||
|
||||
|
@ -321,13 +317,13 @@ $$f_r(\theta_i,\phi_i;\theta_r,\phi_r) \neq f_r(\theta_i,\phi_i;\theta_r, - \phi
|
|||
|
||||
正常尼龙做法为水平方向和竖直方向的一根压一根,其各向异性在对角线上有不同的表现
|
||||
|
||||

|
||||

|
||||
|
||||
* 天鹅绒
|
||||
|
||||
底层有很多伸出去的纤维,如果这些纤维往各个不同方向上分布是均匀的,就可认为是各向异性。但我们可将纤维拨到一边去,认为造出各向异性效果
|
||||
|
||||

|
||||

|
||||
|
||||
#### BRDF属性
|
||||
|
||||
|
@ -382,7 +378,7 @@ BRDF可以用各种各样不同的模型去描述,但这些模型都是基于
|
|||
|
||||
测量后可以不用推出一些模型,可以直接用测的数据
|
||||
|
||||

|
||||

|
||||
|
||||
##### 怎么测量
|
||||
|
||||
|
@ -390,13 +386,13 @@ BRDF可以用各种各样不同的模型去描述,但这些模型都是基于
|
|||
|
||||
BRDF是2个方向(一个入射方向,一个出射方向)的一个函数,如果盯着一个着色点看,并改变它的入射方向(比如拿一个灯从四面八方照它),相机从四面八方去拍它,这样就可以覆盖BRDF所有可能的输入方向和可能的输出方向对,这样就可以做测量
|
||||
|
||||

|
||||

|
||||
|
||||
* 实践仪器
|
||||
|
||||
这个器械有2个爪子,一个抓相机,一个抓光源,将样本放在正中间(球心),这2个爪子可以在球面上任意的旋转
|
||||
|
||||

|
||||

|
||||
|
||||
* 算法
|
||||
|
||||
|
@ -453,6 +449,6 @@ BRDF库存储了很多不同的材质,大多数是假设各向同性的
|
|||
|
||||
存储数据量大(未压缩)
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
|
|
@ -12,12 +12,11 @@ $$Image = Synthesis + Capture$$
|
|||
|
||||
当然还有很多种成像方法,最简单的捕捉成像方法是使用相机。当然现在还在研究很多别的更好成像技术(比如:光线的传播其实是有时间的,有一些研究会研究光在极短时间内的传播,就可以看到光线真正在空间中进行传播的过程,这个过程叫Transient image(瞬息图像))
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 相机
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
最早的相机起源子小孔成像
|
||||
|
@ -28,7 +27,7 @@ $$Image = Synthesis + Capture$$
|
|||
|
||||
生活中常见的则为带透镜的相机
|
||||
|
||||

|
||||

|
||||
|
||||
### 相机部件
|
||||
|
||||
|
@ -36,17 +35,17 @@ $$Image = Synthesis + Capture$$
|
|||
|
||||
下图为去掉了镜头后的相机快门部分,控制光在多少分之一秒内进入相机
|
||||
|
||||

|
||||

|
||||
|
||||
* 传感器
|
||||
|
||||
记录传感器上任何一个点(像素)的Irradiance
|
||||
|
||||

|
||||

|
||||
|
||||
如果一个相机没有透镜或针孔是无法拍出照片的,如果将一个感光元件直接放在一个人的面前,任何一个点上都可能收集到来自不同方向的光,而这个点作为传感器无法区分来自各个方向的光线,此时会将各个方向的能量都综合在这个点上,会导致所有东西都是模糊的
|
||||
|
||||

|
||||

|
||||
|
||||
前沿中存在传感器可通过方向性的光分开记录的研究,但目前依旧认为只能记录Irradiance而非Radianc
|
||||
|
||||
|
@ -54,15 +53,15 @@ $$Image = Synthesis + Capture$$
|
|||
|
||||
小孔成像现象在公元前就已经被发现和提出
|
||||
|
||||

|
||||

|
||||
|
||||
在今天,针孔摄像机拍摄依旧可行,大多数使用的相机都是带有透镜的,
|
||||
|
||||
真正做一个如下图的针孔(硬纸板中间有一个6mm直径能透光的地方),也能用这个小针孔拍摄某个场景,记录在胶片上。但拍出来的东西是没有深度可言的,任何地方都不会是虚的,都一定是清楚的
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
虚化正是来源于透镜。在计算光线追踪是,我们使用的就是针孔摄像机的模型,所以也得不出不同的地方会有不同的模糊
|
||||
|
||||
|
@ -70,7 +69,7 @@ $$Image = Synthesis + Capture$$
|
|||
|
||||
视场往往意味着能够看到多大的范围,对于广角镜头,通常意味着能够拍到更广的角度,可见的FOV更大,对于手机上的相机,视场就相对比较小
|
||||
|
||||

|
||||

|
||||
|
||||
#### 从小孔成像的针孔摄像机理解视场
|
||||
|
||||
|
@ -90,7 +89,7 @@ $$FOV = 2\arctan(\frac{h}{2f})$$
|
|||
|
||||
不同视场决定不同拍照结果。视场和传感器大小及焦距相关,所以人们通常定义视场(FOV)以35mm格式的胶片为基准,固定传感器的大小,再通过定义焦距的方式来定义FOV
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -110,13 +109,13 @@ $$FOV = 2\arctan(\frac{h}{2f})$$
|
|||
|
||||
当视场越窄,看到的东西越远
|
||||
|
||||

|
||||

|
||||
|
||||
#### 传感器(Sensor)大小和视场(FOV)
|
||||
|
||||
小一点的传感器会对应小一点的视场
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### 传感器与胶片
|
||||
|
@ -127,7 +126,7 @@ $$FOV = 2\arctan(\frac{h}{2f})$$
|
|||
|
||||
大相机有大的传感器也就有大的分辨率,所以不同相机价格各不相同,相机机身越大,镜头越大越长越好,价格也就越高
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 曝光
|
||||
|
@ -164,7 +163,7 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
|
|||
* 第二行参数使用分数表示快门速度(1/1000即为快门开放1/1000秒)
|
||||
* 第三行参数是ISO,不同ISO可简单理解为相乘
|
||||
|
||||

|
||||

|
||||
|
||||
#### ISO简单地放大信号会放大噪声
|
||||
|
||||
|
@ -176,7 +175,7 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
|
|||
|
||||
将光认为是光子,如果快门时间不足,那么进入感光元件的光子数就少,光子数少就会造成noisy
|
||||
|
||||

|
||||

|
||||
|
||||
#### 光圈与F数
|
||||
|
||||
|
@ -188,14 +187,14 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
|
|||
|
||||
* 如图,调光圈可以直接调出曝光度
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 快门曝光时间对结果的影响
|
||||
|
||||
快门
|
||||
|
||||

|
||||

|
||||
|
||||
* 调节曝光度
|
||||
|
||||
|
@ -205,11 +204,11 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
|
|||
|
||||
更长的快门时间会造成更严重的运动模糊,对于等长的快门时间,物体运动越快,越容易出现运动模糊
|
||||
|
||||

|
||||

|
||||
|
||||
但是更短的快门时间,曝光度也降低了,所以为了达到相同的亮度,就要调节ISO或光圈的大小
|
||||
|
||||

|
||||

|
||||
|
||||
运动模糊的好处
|
||||
|
||||
|
@ -220,13 +219,13 @@ rolling shutter问题
|
|||
|
||||
电子控制的快门可以认为是任何时刻任何位置同步打开,但机械快门则需要一个过程,如果物体运动比机械快门的速度快就会出现Rolling Shutter问题,因为图像上不同位置可能记录的是不同时间进来的光
|
||||
|
||||

|
||||

|
||||
|
||||
#### 均衡快门和光圈
|
||||
|
||||
快门的时间打开得短就会暗,那就可以提高光圈的大小,用更小的F数。以下的表格上下对应的参数基本可以达到相同的曝光度。但达到的效果并不会一模一样(因为大光圈会引起前景深的问题,快门时间又会引起运动模糊)
|
||||
|
||||

|
||||

|
||||
|
||||
-----
|
||||
|
||||
|
@ -236,17 +235,17 @@ rolling shutter问题
|
|||
|
||||
每秒拍摄更多帧数然后按正常帧数播放,每张照片的快门时间非常少又需要保证每张都清晰且有正常的曝光度,可以用更大的光圈和更高ISO
|
||||
|
||||

|
||||

|
||||
|
||||
#### 超低速(长曝光)摄影
|
||||
|
||||
用非常小的光圈慢慢拍,也就是所谓的延迟摄影,摄影界中称为拉丝,也就是长曝光造成的运动模糊
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
## 镜头
|
||||
|
||||
|
@ -256,13 +255,13 @@ rolling shutter问题
|
|||
|
||||
无论相机还是手机,都不使用单个透镜来成像,往往使用一个透镜组
|
||||
|
||||

|
||||

|
||||
|
||||
* 真正的镜头元素是不理想的
|
||||
|
||||
如下图,一面是凸的,一面是平的,这样就不可能将光聚在一起
|
||||
|
||||

|
||||

|
||||
|
||||
* 我们研究的是理想的薄透镜(忽略厚度)
|
||||
|
||||
|
@ -272,7 +271,7 @@ rolling shutter问题
|
|||
2. 光路有可逆性,如果光线穿过焦点,被透镜折射后会变成平行的一束光
|
||||
3. 假设薄透镜可以任意改变焦距(透镜焦距固定,相机能改是因为透镜组)
|
||||
|
||||

|
||||

|
||||
|
||||
* 透镜满足的物理规律
|
||||
|
||||
|
@ -296,19 +295,18 @@ $$\frac{1}{f} = \frac{1}{z_i}+\frac{1}{z_o}$$
|
|||
|
||||
平行光必定过焦点,过焦点的光会变成平行光
|
||||
|
||||

|
||||

|
||||
|
||||
忽略中间过透镜中心的光
|
||||
|
||||

|
||||

|
||||
|
||||
可见如下图的几何关系,左侧在光到达透镜前可形成两个相似三角形,右侧也相同
|
||||
|
||||

|
||||
|
||||

|
||||
将两组关系做运算
|
||||
|
||||

|
||||

|
||||
|
||||
### 散焦模糊(Defocus Blur)(景深)
|
||||
|
||||
|
@ -320,7 +318,7 @@ $$\frac{1}{f} = \frac{1}{z_i}+\frac{1}{z_o}$$
|
|||
|
||||
* 如果物体不在Focal Plane上会出现模糊
|
||||
|
||||

|
||||

|
||||
|
||||
* 模糊原因
|
||||
|
||||
|
@ -340,7 +338,7 @@ $$\frac{C}{A} = \frac{d'}{z_i} = \frac{|z_s - z_i|}{z_i}$$
|
|||
|
||||
下图光圈f数为1.4,为大光圈,可以看到更模糊的效果
|
||||
|
||||

|
||||

|
||||
|
||||
#### 光圈大小
|
||||
|
||||
|
@ -362,11 +360,11 @@ $$N = f/A$$
|
|||
|
||||
* 例子
|
||||
|
||||

|
||||

|
||||
|
||||
* CoC的大小和F数成反比
|
||||
|
||||

|
||||

|
||||
|
||||
$$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
|
||||
|
||||
|
@ -378,7 +376,7 @@ $$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
|
|||
|
||||
* 实例
|
||||
|
||||

|
||||

|
||||
|
||||
#### 具体实现
|
||||
|
||||
|
@ -390,7 +388,7 @@ $$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
|
|||
|
||||
根据物距$Z_o$和焦距,可计算像距$Z_i$
|
||||
|
||||

|
||||

|
||||
|
||||
* 使用光线追踪算法渲染
|
||||
|
||||
|
@ -401,7 +399,7 @@ $$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
|
|||
在透镜上另选X",两点连线便可知道其方向,且感光元件上的X'处会记录这条线上的Radiance
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
* 景深(Depth of Field)
|
||||
|
@ -410,11 +408,11 @@ $$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
|
|||
|
||||
过大的光圈对应大的CoC,一个点会变成更大的圆,所以就会更模糊,但总归在一些地方是不模糊的,即不同光圈大小会影响模糊范围
|
||||
|
||||

|
||||

|
||||
|
||||
如下图中,一个光经透镜会打到一个成像平面,该成像平面附近区域都认为CoC足够小
|
||||
|
||||

|
||||

|
||||
|
||||
景深:实际场景中有一段深度,该深度经透镜后会在成像平面附近形成一段区域,区域内认为CoC是足够小的
|
||||
|
||||
|
@ -426,11 +424,11 @@ $$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
|
|||
|
||||
如下图,考虑景深的最远和最近处,分别让它们穿过透镜,到某一地方可以得到右边的范围
|
||||
|
||||

|
||||

|
||||
|
||||
DOF参数效果
|
||||
|
||||

|
||||

|
||||
|
||||
* 修改焦距
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ date: 2022-07-09T21:49:09+08:00
|
|||
|
||||
###### 重心坐标定义
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
对于一个三角形的三点坐标A,B,C,平面内的一点(x,y)可以写成三点的线性组合式
|
||||
|
@ -24,7 +24,7 @@ $$(x,y)=\alpha A + \beta B + \gamma C = \alpha + \beta + \gamma = 1$$
|
|||
|
||||
###### 三角形的几何角度下求解
|
||||
|
||||

|
||||

|
||||
|
||||
将点与三个顶点相连,三个三角形的面积分别为$A_A,A_B,A_C$对应的重心坐标的计算式,
|
||||
|
||||
|
@ -57,8 +57,7 @@ $$\alpha = 1 - \beta - \gamma$$
|
|||
对于重心坐标系存在另一种等价视角:
|
||||
|
||||
以A点为原点,AB,AC分别为新的坐标系的单位向量构建坐标系,如图
|
||||
|
||||

|
||||

|
||||
|
||||
给定的任意点P的坐标可表示为$P(\beta , \gamma)$ ,可推出P点坐标满足以下关系
|
||||
|
||||
|
@ -92,8 +91,7 @@ $$
|
|||
###### 重心坐标的用处
|
||||
|
||||
对顶点处的值进行线性插值,如下图
|
||||
|
||||

|
||||

|
||||
|
||||
$$V = \alpha V_A + \beta V_B + \gamma V_C$$
|
||||
|
||||
|
@ -178,7 +176,7 @@ sample's color : 通常为漫反射率值 kd
|
|||
|
||||
此时我们会选取红点位置周围的四个采样点,同时计算其与周围四个采样点的偏移值(s,t)如下图
|
||||
|
||||

|
||||

|
||||
|
||||
可得相应的计算过程:
|
||||
|
||||
|
@ -199,7 +197,7 @@ $$f(x,y) = lerp(t,u_0,u_1)$$
|
|||
|
||||
此时在点采样下会产生摩尔纹和锯齿,如下图
|
||||
|
||||

|
||||

|
||||
|
||||
通常处理是进行超采样,同时也会有几个问题
|
||||
|
||||
|
@ -211,24 +209,24 @@ $$f(x,y) = lerp(t,u_0,u_1)$$
|
|||
|
||||
所以我们更倾向于使用范围序列而非点序列
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
###### Mipmap(支持 Range Query)
|
||||
|
||||
mipmap 可由下图表示
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
对应产生的mip层次结构也由下图表示
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
在计算对应层次的mipmap时,我们需要相邻采样点的纹理坐标来估计纹理内存
|
||||
|
||||

|
||||

|
||||
|
||||
如上图所示,我们能够得到两个值
|
||||
|
||||
|
@ -239,7 +237,7 @@ $$D = \log_2 L$$
|
|||
在使用时往往D值会四舍五入为整数,这会导致纹理的不连续,因此,我们还需要进行下图所示的Trilinear Interpolation 从而得到一个连续的D值
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
在插值处理后的纹理依旧会存在过度模糊(overblur)的现象,但相比于超采样的高性能开销依旧有很大的提升
|
||||
|
||||
|
@ -260,7 +258,7 @@ EWA filtering
|
|||
|
||||
Irregular Pixel Footprint in Texture的产生情况如下图
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 纹理的应用
|
||||
|
@ -285,23 +283,23 @@ Irregular Pixel Footprint in Texture的产生情况如下图
|
|||
|
||||
环境光贴图通常指在贴图上绘制模型周围环境光效,实现某些模型反射环境光的效果
|
||||
|
||||

|
||||

|
||||
|
||||
也用于一些镜面反射的物体实现真实光照
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
在一些球型表面贴图会存在形变问题,如下图的顶部和底部
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
立方体贴图则由球体上一个向量沿自身方向映射到立方体上的点获得
|
||||
|
||||

|
||||

|
||||
|
||||
一个立方体使用6个方形纹理贴图来生成纹理
|
||||
|
||||
|
@ -321,7 +319,7 @@ Irregular Pixel Footprint in Texture的产生情况如下图
|
|||
3. 扰动后的法线值为$$n(p) = (-dp,1).normalized()$$
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
扰动法线的计算(3D)
|
||||
|
@ -383,20 +381,20 @@ Displacement mapping
|
|||
2. 与Bump mapping 使用相同纹理贴图
|
||||
3. 会改变模型顶点坐标
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
3D程序化噪声和实体建模
|
||||
|
||||

|
||||

|
||||
|
||||
将部分着色效果提前绘制到贴图上
|
||||
|
||||

|
||||

|
||||
|
||||
3D图像纹理和体绘制
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ date: 2022-05-12T22:08:22+08:00
|
|||
|
||||
屏幕是由一个个像素组成,在光栅化时,只有中心被三角形覆盖的像素会被着色,而且被覆盖的像素点的分布往往是离散的,自然而然地形成如下图斜线形成的阶梯状的锯齿
|
||||
|
||||

|
||||

|
||||
|
||||
---------------
|
||||
|
||||
|
@ -20,15 +20,15 @@ date: 2022-05-12T22:08:22+08:00
|
|||
###### 采样(sample)
|
||||
采样就是将连续信号转换成离散信号(采样信号),经过滤波后会被恢复成重建信号
|
||||
|
||||

|
||||

|
||||
|
||||
如果采样的频率过低,则会发生走样或混叠(aliasing),如图中,蓝色的为原信号,红色为采样点,绿色虚线为重建后的信号
|
||||
|
||||
过低的采样频率会使重建的信号成为低频信号
|
||||

|
||||

|
||||
|
||||
若采样频率恰好是原信号的两倍,重建信号则表现为一条直线
|
||||

|
||||

|
||||
|
||||
采样理论(sampling theorem):采样频率必须为原信号频率的两倍以上,才能完整地重建原始信号,存在一个最大频率,因而采样频率有频带限制
|
||||
<br>奎斯特率(Nyquist rate): 频率为原信号频率两倍的采样频率<br>
|
||||
|
@ -37,28 +37,28 @@ date: 2022-05-12T22:08:22+08:00
|
|||
|
||||
重建时需要采样信号进行滤波,通常使用下图中的三种滤波器(box filter,tent filter,sinc filter),且滤波器的面积必须为1以确保恢复的信号不会被放大或缩小
|
||||
|
||||

|
||||

|
||||
|
||||
box filter 对信号进行滤波并重建信号的过程如下图
|
||||
<br>直接将采样点位置替换为box filter波形的方式会因 box filter 本身的不连续使重建信号产生不平滑的现象<br>
|
||||
但仍然因其易于实现的特性被用于重建
|
||||
|
||||

|
||||

|
||||
|
||||
-----------
|
||||
tent filter 在滤波时会对每个相邻的采样点之间使用线性插值,一次重建的信号更加平滑,但采样点位置会发生斜率突变,所以tent filter 并不完美
|
||||
|
||||

|
||||

|
||||
|
||||
-------------
|
||||
出于让重建信号保持平滑的目的,我们必须使用一个理想低通滤波器
|
||||
|
||||
基于傅立叶变换理论的解释:理想低通滤波器在频域中的表现类似于box filter,在频域中相乘时会过滤掉所有超过这个滤波器宽度的频率,在频域的box fliter 转换到空域的时候会是一个sinc filter ,在频域相乘也等价于在空域中进行卷积,卷积即为滤波
|
||||

|
||||

|
||||
|
||||
例如sinc filter就能够实现过滤高频信号,保留低频信号的理想低通滤波器效果
|
||||
|
||||

|
||||

|
||||
|
||||
对于sinc filter 在假设采样频率为$f_s$,采样点间隔为$\frac{1}{f_S}$的情况下,它会过滤掉超过$\frac{f_S}{2}$的所有高频信息,因此,sinc filter 在采样频率为1.0会是一个理想低通滤波器,此时采样信号的最大频率应当小于$\frac{1}{2}$,但是由于sinc filter 有无限的滤波范围,所以它会在某些范围内出现负值
|
||||
|
||||
|
@ -73,17 +73,17 @@ tent filter 在滤波时会对每个相邻的采样点之间使用线性插值
|
|||
设采样信号灯的采样间隔为整数列,间隔为1,则我们可以通过重采样来将采样点间隔变为a,当$a>1$时会缩小信号(downsampling),$a<1$时会放大信号(upsampling)
|
||||
|
||||
如图,对重建信号使用双倍采样率进行重采样便实现了信号放大
|
||||

|
||||

|
||||
|
||||
这种方法不适用于信号缩小,易使信号过于高频
|
||||
|
||||
对于信号缩小的情况,我们需要先对1间隔采样信号使用$sinc(\frac{x}{2})$ filter 滤波产生一个连续信号,再重采样2间隔,由于频谱范围更大的低通滤波器才能过滤更多的高频信号,类似于对图像进行第一次模糊再重采样产生一个低分辨率图像
|
||||
|
||||

|
||||

|
||||
|
||||
由下图可见,滤波可以对三角形的边缘产生模糊,进而产生一定的反走样效果
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### 反走样
|
||||
|
||||
|
@ -93,7 +93,7 @@ tent filter 在滤波时会对每个相邻的采样点之间使用线性插值
|
|||
|
||||
对于我们之前提到的采样,我们只对像素正方形的中心进行是否在三角形内部的判断,这意味着对于边缘的像素正方形,无论覆盖面积有多大,只要不包含中心点都会被判定在三角形外,从而不被渲染,当采样率提升,如下图的4spp(sample per pixel)以某种方式混合计算获得更好的像素效果
|
||||
|
||||

|
||||

|
||||
|
||||
Screen-Based Antialiasing 通常在屏幕空间区域使用采样图案来采样从而对颜色进行如下的加权计算
|
||||
|
||||
|
@ -129,7 +129,7 @@ SSAA又被称为全屏幕抗锯齿(full-screen antialiasing,FSAA),也叫超采
|
|||
实现方式简单,只需要一个高分辨率图像和box filter就可以实现
|
||||
|
||||
下图是采样点在像素点内位置类型
|
||||

|
||||

|
||||
|
||||
案例:NAVIDIA's DSR(dynamic super resolution)
|
||||
|
||||
|
@ -142,11 +142,11 @@ SSAA又被称为全屏幕抗锯齿(full-screen antialiasing,FSAA),也叫超采
|
|||
MSAA同样在一个像素中设置多个采样点,在光栅化时计算三角形在像素内对采样点的覆盖率,之后只计算每个片元的像素着色器,采样中心点的位置计算颜色信息再乘上覆盖率,最后输出这个像素的颜色
|
||||
|
||||
颜色计算与深度判断
|
||||

|
||||

|
||||
|
||||
总体流程如下
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
与SSAA不同的是,MSAA只对每个像素计算一次采样,而非对整个图像进行渲染,但计算量依旧倍增
|
||||
|
||||
|
@ -159,6 +159,6 @@ MSAA同样在一个像素中设置多个采样点,在光栅化时计算三角
|
|||
|
||||
例如,EQAA在2f4x模式下,会对每四个采样点计算并通过表的形式存储颜色和深度值(如下图),这使得四个采样点只需1bit空间就可以确认像素位置的着色颜色值
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ $$\sum_{i = 1}^n p_i = 1$$
|
|||
|
||||
如图,对于这四个可供选择的长方形,每一个选择有一个值为$X_i$,每一个选择都对应一个概率为$p_i$,那么期望则为将所有值乘以其对应的概率后累加得到的数值
|
||||
|
||||

|
||||

|
||||
|
||||
可见上图的期望值为
|
||||
|
||||
|
@ -47,7 +47,7 @@ $$E[X] = \sum_{i=1}^n \frac{i}{6} = (1+2+3+4+5+6)/6 = 3.5$$
|
|||
|
||||
随机变量的取值可以是一些固定的值(离散型),也可以是下图所示一些连续的值(连续型)
|
||||
|
||||

|
||||

|
||||
|
||||
某一位置的概率为其周围一小段微元与曲线相连线形成的梯形面积
|
||||
|
||||
|
@ -88,7 +88,7 @@ $$E[Y] = E[f(X)] = \int f(x)p(x)dx$$
|
|||
|
||||
若函数较为复杂,如下图所示,不便于使用解析方法,就要使用数值的方法计算(蒙特卡洛积分)
|
||||
|
||||

|
||||

|
||||
|
||||
#### 大致流程
|
||||
|
||||
|
@ -122,7 +122,7 @@ $$F_N = \frac{1}{N} \sum_{i = 1}^N {\frac{f(X_i)}{p(X_i)}}$$
|
|||
|
||||
* 在a到b之间均匀采样时,我们使用的概率密度函数(PDF)在各处的值相等,即为一个常数,又已知PDF在积分域上的积分值为1,此PDF可解出值为$\frac{1}{(b-a)}$
|
||||
|
||||

|
||||

|
||||
|
||||
* 采用蒙特卡洛积分计算时,需要知道f(Xi)和p(Xi),随机采样得到的值为Xi,蒙特卡洛积分只需计算f(Xi)除以p(Xi)的平均值,p(Xi)的值始终为$\frac{1}{(b-a)}$
|
||||
|
||||
|
@ -150,7 +150,7 @@ Specular材质:光线在物体表面能发生镜面反射则称为此材质,
|
|||
|
||||
Glossy材质:有镜面反射的样子,但又有些许模糊,类似毛玻璃效果,有一定粗糙度但能产生高光
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
* whitted-style ray tracing 在遇到漫反射时会停止光线弹射直接做相应的shading
|
||||
|
@ -159,7 +159,7 @@ Glossy材质:有镜面反射的样子,但又有些许模糊,类似毛玻
|
|||
|
||||
两个示例中左侧为直接光照,右侧为全局光照,都采用路径追踪的方式计算得到
|
||||
|
||||

|
||||

|
||||
|
||||
可见在场景中只有上面一个光源的情况下,在直接光照里,天花板为黑色,但实际上光线会发生多次弹射,天花板应是亮的,右侧才是我们想要的效果
|
||||
|
||||
|
@ -186,7 +186,7 @@ $$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)
|
|||
|
||||
假设存在下图场景,我们认为各个方向进来的光$\omega i$ 均匀分布在球面上
|
||||
|
||||

|
||||

|
||||
|
||||
* 假设该点不发光,因而直接光照强度结果来自于四面八方入射来的光照强度
|
||||
|
||||
|
@ -263,8 +263,7 @@ shade(p, wo)
|
|||
##### 全局光照
|
||||
|
||||
全局光照下,我们需要考虑反射面反射过来的光,计算从Q反射到P点反射了多少辐射能
|
||||
|
||||

|
||||

|
||||
|
||||
只需在直接光照的算法中添加分支便可支持全局光照
|
||||
|
||||
|
@ -311,7 +310,7 @@ Return Lo
|
|||
|
||||
如下图,打到第一个物体上后反射出N根光线,打到第二个物体后会再发出N个光线,即变成$N^2$条光线,会超出处理能力
|
||||
|
||||

|
||||

|
||||
|
||||
解决方法:
|
||||
|
||||
|
@ -389,12 +388,12 @@ low SPP下,计算速度快,图片噪声多
|
|||
|
||||
High SPP下,计算速度慢,图片噪声少
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
##### 算法依旧不高效的原因
|
||||
|
||||

|
||||

|
||||
|
||||
光线能否打到光源上取决于运气,当光源小时往往会浪费过多光线,需要改用更好的PDF用来采样,而非简单的均匀采样
|
||||
|
||||
|
@ -402,7 +401,7 @@ High SPP下,计算速度慢,图片噪声少
|
|||
|
||||
蒙特卡洛允许许多采样方法,我们可以直接在光源上采样
|
||||
|
||||

|
||||

|
||||
|
||||
n'为光源本身朝向,在与着色点连线后可得$\theta$(连线和着色点法线的夹角) $\theta$'(连线和光源法线的夹角),此时若在视为二维平面的光源上均匀采样,则PDF为$\frac{1}{A}$
|
||||
|
||||
|
@ -464,7 +463,7 @@ shade(p, wo)
|
|||
|
||||
发生下图蓝色物体遮挡在光源和着色点之间时,需要判断光源能否贡献到着色点
|
||||
|
||||

|
||||

|
||||
|
||||
判断方式:
|
||||
|
||||
|
@ -495,7 +494,7 @@ shade(p, wo)
|
|||
|
||||
最终path tracing的出的效果
|
||||
|
||||

|
||||

|
||||
|
||||
可见,path tracing 与照片相比能够做到几乎百分百相似
|
||||
|
||||
|
|
|
@ -36,13 +36,13 @@ $$\Phi \equiv \frac{d_Q}{d_t} [W = Watt] [lm = lumen]$$
|
|||
|
||||
辐射通量同时可以表示为在单位时间内通过一个感光平面的光子数量
|
||||
|
||||

|
||||

|
||||
|
||||
#### 辐射强度(Radiant Intensity)
|
||||
|
||||
定义:单位时间内,单位立体角辐射的能量
|
||||
|
||||

|
||||

|
||||
|
||||
坎德拉(Candela): 发光强度的SI单位。一坎德拉是光源在给定方向上的发光强度,该光源发出540 $\times $1012Hz的单色辐射,并且在该方向上的辐射强度为1/683瓦/球面度
|
||||
|
||||
|
@ -56,7 +56,7 @@ $$\Phi \equiv \frac{d_Q}{d_t} [W = Watt] [lm = lumen]$$
|
|||
|
||||
微分立体角:球面上当立体角的方向与Z轴的夹角($\theta$)、绕着Z轴旋转的角($\phi$)发生改变时,会在对应方向的球面上框出一片区域,该区域对应的立体角即为微分立体角
|
||||
|
||||

|
||||

|
||||
|
||||
对于球体$S^2$:
|
||||
$$\Omega = \int_{S^2} {d\omega} = \int_0^{2\pi} \int_0^{\pi} {\sin\theta d{\theta} d{\phi}} = 4\pi$$
|
||||
|
@ -64,8 +64,7 @@ $$\Omega = \int_{S^2} {d\omega} = \int_0^{2\pi} \int_0^{\pi} {\sin\theta d{\thet
|
|||
|
||||
在辐射度量中,我们也会用$\omega$表示三维空间中的一个方向,可以使用$\theta和\phi$的方式来定义其位置,并利用$\sin \theta d_{\theta} d_{\phi}$来计算微分立体角
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
#### 光强(Intensity)
|
||||
|
||||
|
@ -79,7 +78,7 @@ $$\Phi = \int_{S^2} {Id\omega} = 4\pi I$$
|
|||
|
||||
$$I = \frac{\Phi}{4\pi}$$
|
||||
|
||||

|
||||

|
||||
|
||||
#### 现代LED灯实例
|
||||
|
||||
|
@ -91,20 +90,19 @@ $$I = \frac{\Phi}{4\pi}$$
|
|||
|
||||
Itensity = 815 lumens / 4pi sr = 65 candelas
|
||||
|
||||

|
||||

|
||||
|
||||
#### 辐照度(Irradiance)
|
||||
|
||||
定义:单位面积内的能量
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
单位面积需与入射光线垂直才算是接收到的范围,否则要将其投影到垂直的方向
|
||||
|
||||
例如Lambert's Cosine Law中平行光打到单位面上如果垂直则可以接收到6根光线,平面若倾斜则只能接收到三个光线,接收到的能量要乘以$\cos \theta$
|
||||
|
||||

|
||||

|
||||
|
||||
--------------------------
|
||||
|
||||
|
@ -116,7 +114,7 @@ Itensity = 815 lumens / 4pi sr = 65 candelas
|
|||
|
||||
采用辐照度则认为对于最中间的球壳来说,其半径为1,则下图中该点出的辐照度为$E = \phi / (4\pi 1^2 )$,球壳半径为r时,辐照度为$\phi / (4 \pi r^2)$,也就等于$E/r^2$
|
||||
|
||||

|
||||

|
||||
|
||||
由此可得出并非Idensity在衰减,而是Irradiance在衰减
|
||||
|
||||
|
@ -125,7 +123,7 @@ Itensity = 815 lumens / 4pi sr = 65 candelas
|
|||
|
||||
定义:单位立体角下每单位面积下的power
|
||||
|
||||

|
||||

|
||||
|
||||
由此可知power需要进行两次微分,一次立体角,一次投影后单位面积
|
||||
|
||||
|
@ -144,7 +142,7 @@ Radiance: 每单位角的Irradiance
|
|||
|
||||
从一个方向打到一个很小的面上的能量,即为入射辐射
|
||||
|
||||

|
||||

|
||||
|
||||
是沿着给定光线到达表面的光(给定表面上的点和入射方向)
|
||||
|
||||
|
@ -152,7 +150,7 @@ Radiance: 每单位角的Irradiance
|
|||
|
||||
王某一个方向(立体角)辐射的能量即为出射辐射
|
||||
|
||||

|
||||

|
||||
|
||||
是沿着给定光线到达表面的光(给定表面上的点和出射方向)
|
||||
|
||||
|
@ -165,6 +163,6 @@ radiance: dA从某一个方向收到的能量
|
|||
|
||||
E(p)即为irradiance,等于所有方向上的Radiance的和
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ date: 2022-05-12T09:10:25+08:00
|
|||
#### 屏幕空间
|
||||
屏幕空间可以被看做是由一组像素点构成,每个像素点可以被视为中心为$(x+0.5,y+0.5)$的一个正方形,
|
||||
|
||||

|
||||

|
||||
|
||||
--------------
|
||||
|
||||
|
@ -32,8 +32,7 @@ for(int x = 0 ; x < xmax; ++x)
|
|||
|
||||
可视化过程如图
|
||||
|
||||

|
||||
|
||||

|
||||
----------------
|
||||
|
||||
#### 判断像素点在三角形内部
|
||||
|
@ -94,7 +93,7 @@ static bool insideTriangle(int x, int y, const Vector3f* _v)
|
|||
|
||||
使用包围盒将三角形包围后,只判断包围盒内的像素点是否在三角形内能够减少这种情况的出现
|
||||
|
||||

|
||||

|
||||
|
||||
代码实例
|
||||
|
||||
|
@ -110,5 +109,5 @@ static bool insideTriangle(int x, int y, const Vector3f* _v)
|
|||
##### incremental triangle Traversal
|
||||
对于每一行像素点,只遍历三角形最左到最右的像素点,只适用于较窄的且经过旋转的三角形
|
||||
|
||||

|
||||

|
||||
|
||||
|
|
|
@ -12,13 +12,13 @@ date: 2022-07-27T22:55:53+08:00
|
|||
|
||||
从光源打出一些sub-path,从摄像机出发也可以生成另外一系列的子路径。双向路径追踪会将这些子路径的端点连接起来形成一条完整的路径
|
||||
|
||||

|
||||

|
||||
|
||||
### BDPT适用的场景
|
||||
|
||||
图例中,左图为路径追踪,右图为双向路径追踪,适用的都是每个像素32个采样点,但可见双向路径追踪能产生更好的效果
|
||||
|
||||

|
||||

|
||||
|
||||
原因:
|
||||
|
||||
|
@ -50,7 +50,7 @@ date: 2022-07-27T22:55:53+08:00
|
|||
|
||||
不断在一个path周围产生更多path就可以找到所有的path
|
||||
|
||||

|
||||

|
||||
|
||||
#### MLT方法与BDPT的效果对比
|
||||
|
||||
|
@ -58,7 +58,7 @@ date: 2022-07-27T22:55:53+08:00
|
|||
|
||||
在下图中类似的场景下MLT的效果很好,其适合做复杂、困难的光线传播
|
||||
|
||||

|
||||

|
||||
|
||||
Caustics是光线经过聚焦打在游泳池底,然后被人眼看见。光线要穿过水的表面(凹凸不平,还有浪),会被聚焦到一系列的地方(水面有办法将光线聚焦到一系列的线上)。这种情况渲染起来非常困难,因为假设游泳池底是diffuse的,光线会先经过一个specular的水面,游泳池底被我们看见也要经过一个specular(这种路径简称SDS(specular-diffuse-specular))
|
||||
|
||||
|
@ -69,7 +69,7 @@ MLT难以在理论上预估最后收敛的速度(path tracing中使用的蒙特
|
|||
|
||||
所有操作都是局部的,有些像素收敛快,有的像素收敛慢,使渲染出来的结果图像看上去比较脏
|
||||
|
||||

|
||||

|
||||
|
||||
不适用于渲染动画,因为不同连续帧的收敛速度不同,画面会产生严重抖动
|
||||
|
||||
|
@ -82,13 +82,13 @@ MLT难以在理论上预估最后收敛的速度(path tracing中使用的蒙特
|
|||
尤其适用于渲染Caustics和Specular-Diffuse-Specular(SDS)
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
#### 实现方法
|
||||
|
||||
* 从光源出发,光子碰到物体后计算所有反射和折射,直到光子打到diffuse的物体上停止,此时整理所有光子即可得到光子位置信息
|
||||
|
||||

|
||||

|
||||
|
||||
* 从眼睛或相机开始,往各个不同方向打出各种各样的子路径,计算反射和折射直到打在diffuse的物体上
|
||||
|
||||
|
@ -102,15 +102,14 @@ MLT难以在理论上预估最后收敛的速度(path tracing中使用的蒙特
|
|||
* 计算N个光子所占的面的面积
|
||||
* 计算密度:用光子的数量N除以它们占的面积
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### N的取值
|
||||
|
||||
如果用很少的光子的数量,就会得到一个很有噪声的图,如果用更多的光子,结果虽然会好一些,但是得到的结果会糊
|
||||
|
||||

|
||||
|
||||

|
||||
##### 产生取值问题的原因(有偏的原因)
|
||||
|
||||
* 计算密度时,我们认为密度时当前这个点的周围取一个微小的面积dA,它里面有多少个光子
|
||||
|
@ -146,7 +145,7 @@ BDPT中,生成两个sub-path再将端点连起来,如果有的path满足下
|
|||
|
||||
往往用于电影行业渲染
|
||||
|
||||

|
||||

|
||||
|
||||
### 实时辐射度算法(Instant Radiosity(IR))
|
||||
|
||||
|
@ -160,7 +159,7 @@ BDPT中,生成两个sub-path再将端点连起来,如果有的path满足下
|
|||
|
||||
* 看到如下图中的着色点后就用新的光源来照亮(相当于实际考虑光线弹射两次)
|
||||
|
||||

|
||||

|
||||
|
||||
#### 优缺点
|
||||
|
||||
|
@ -176,7 +175,7 @@ VPL不能做glossy的物体
|
|||
|
||||
窄缝发光问题与距离平方向有关,在计算light sampling时,更改立体角的采样为对面积的采样,所以产生了面积乘以cos除以两个点之间的距离的值,当两个点距离极近时就会得到一个非常大的结果
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## 高级外观建模
|
||||
|
@ -187,11 +186,11 @@ VPL不能做glossy的物体
|
|||
|
||||
雾
|
||||
|
||||

|
||||

|
||||
|
||||
云
|
||||
|
||||

|
||||

|
||||
|
||||
--------------------
|
||||
|
||||
|
@ -201,7 +200,7 @@ VPL不能做glossy的物体
|
|||
2. 光线路径上如果有很多小的晶体则会把光线随机反射到其他方向上去
|
||||
3. 传播的过程中也可能会接收到从其他方向反射过来的光
|
||||
|
||||

|
||||

|
||||
|
||||
#### 散射计算
|
||||
|
||||
|
@ -209,7 +208,7 @@ VPL不能做glossy的物体
|
|||
|
||||
下图相位函数决定了散射的方式和方向(与BRDF类似,BRDF决定如何反射,相位函数决定如何散射)
|
||||
|
||||

|
||||

|
||||
|
||||
#### 散射介质渲染
|
||||
|
||||
|
@ -219,15 +218,15 @@ VPL不能做glossy的物体
|
|||
|
||||
超能特工队
|
||||
|
||||

|
||||

|
||||
|
||||
游戏:刺客信条
|
||||
|
||||

|
||||

|
||||
|
||||
巧克力(流体模拟)
|
||||
|
||||

|
||||

|
||||
|
||||
### 毛发建模(Hair/fur/fiber)缩写:BCSDF
|
||||
|
||||
|
@ -235,7 +234,7 @@ VPL不能做glossy的物体
|
|||
|
||||
可见头发会有两种高光,一种无色发白,一种有色
|
||||
|
||||

|
||||

|
||||
|
||||
#### 高光计算
|
||||
|
||||
|
@ -243,11 +242,11 @@ VPL不能做glossy的物体
|
|||
|
||||
* kajiya-Kay Model
|
||||
|
||||

|
||||

|
||||
|
||||
但表现却不太符合现实,与Blinn-Phong类似
|
||||
|
||||

|
||||

|
||||
|
||||
* Marschner Model
|
||||
|
||||
|
@ -257,19 +256,19 @@ VPL不能做glossy的物体
|
|||
2. 一部分会穿透到头发里发生折射,可记为T,一根光线要穿透一根头发需要穿透两次,因而产生TT的光线传播方式
|
||||
3. 光线发生一次穿透进入头发内部,在头发内壁上发生一次反射后返回,返回时再发生一次穿透,记为TRT
|
||||
|
||||

|
||||

|
||||
|
||||
在这一模型中(下图左),我们会将头发认为是一个玻璃的圆柱(总体可认为是扭曲,但局部必定是直的),包含两种结构,外层cuticle(表层),内层cortex(皮层)
|
||||
|
||||
头发内部存在有色素,光线穿透后会有部分被吸收再向外传播
|
||||
|
||||

|
||||

|
||||
|
||||
该模型也考虑了三种光线和模型之间的相互作用(上图右)
|
||||
|
||||
将计算结果综合后可得到一个十分拟真的效果
|
||||
|
||||

|
||||

|
||||
|
||||
当然上述过程只定义了单根头发与光线的相互作用,与多根头发作用时需要额外计算多次散射
|
||||
|
||||
|
@ -279,11 +278,11 @@ VPL不能做glossy的物体
|
|||
|
||||
最终幻想15(ff15)
|
||||
|
||||

|
||||

|
||||
|
||||
疯狂动物城
|
||||
|
||||

|
||||

|
||||
|
||||
-------------------------
|
||||
|
||||
|
@ -291,7 +290,7 @@ VPL不能做glossy的物体
|
|||
|
||||
人的毛发计算模型往往不能用于动物毛发计算,如下图,左侧为人的毛发模型计算结果,可见其不足以描述光线与动物毛发的相互作用
|
||||
|
||||

|
||||

|
||||
|
||||
* 生物结构
|
||||
|
||||
|
@ -303,62 +302,61 @@ VPL不能做glossy的物体
|
|||
|
||||
动物毛发中的髓质更大,光线进入后更容易发生反射
|
||||
|
||||

|
||||

|
||||
|
||||
由此可见,Marschner Model中忽略髓质在动物毛发计算中并不适用
|
||||
|
||||

|
||||
|
||||

|
||||
有无髓质的对比
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 双层圆柱模型(Double Cylinder Model)
|
||||
|
||||
该模型中加入了对髓质的精确描述
|
||||
|
||||

|
||||

|
||||
|
||||
光线在打到表面后依旧会发生反射,穿过结构后也可能无法到达髓质或是到达后没有发生反射,与Marschner Model中一样,存在R、TT、TRT
|
||||
|
||||
同样会有部分光穿过髓质的时候发散到各个方向上去(TTs),TRT也相同,在穿过髓质的过程中,两次都有可能被散射,形成TRTs
|
||||
|
||||

|
||||

|
||||
|
||||
可以使用5个不同的分量,在原来的3个模型上加上2个散射的结果
|
||||
|
||||

|
||||

|
||||
|
||||
##### 应用
|
||||
|
||||
下图中的仓鼠,由60万根毛发组成,在每像素中有1024个采样点的采样率下,每帧需要渲染36.9分钟
|
||||
|
||||

|
||||

|
||||
|
||||
猩球崛起
|
||||
|
||||

|
||||

|
||||
|
||||
狮子王
|
||||
|
||||

|
||||

|
||||
|
||||
#### 颗粒材质(Granular Material)
|
||||
|
||||
如香料、盐、糖等等
|
||||
|
||||

|
||||

|
||||
|
||||
计算量很大,但可以做些简化
|
||||
|
||||
比如一个沙子城堡,每一单元上由不同石子构成,各自成分占比也可得出,渲染结果在离得近的时候可以看到一粒一粒的,离得远的情况下就会是一个沙丘
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
--------------------
|
||||
|
||||
|
@ -372,13 +370,13 @@ VPL不能做glossy的物体
|
|||
|
||||
即并非沿着一个方向传播并被吸收,可以被传导到其他方向上去
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
在物理上,常常认为光线在某一个点进入某一个表面,在里面发生了大量散射,从另一个点钻出
|
||||
|
||||

|
||||

|
||||
|
||||
#### 次表面散射(Subsurface Scattering)
|
||||
|
||||
|
@ -390,7 +388,7 @@ BRDF: 光线打到这个点,并从这个点出来,所有作用都发生在
|
|||
|
||||
BSSRDF:可理解为吧BRDF的概念延伸到从一个点以任意方向进来再从任意一个其他的地方以任意方向出去
|
||||
|
||||

|
||||

|
||||
|
||||
* 定义
|
||||
|
||||
|
@ -411,27 +409,27 @@ $$L(x_o,\omega_o) = \int_A\int_{H^2} {S(x_i,\omega_i,x_o,\omega_o)L_i(x_i,\omega
|
|||
|
||||
光线打到物体上与物体底部出现光源类似,会从底部照亮着色点周围的一片,为了物理上的真实,推出一个光源不够,还要对应上方有一个光源,还要对应上方存在一个光源,相当于有两个光源照亮周围着色点的一块
|
||||
|
||||

|
||||

|
||||
|
||||
* 效果
|
||||
|
||||
BRDF,类石膏材质效果
|
||||
|
||||

|
||||

|
||||
|
||||
BSSRDF,类大理石
|
||||
|
||||

|
||||

|
||||
|
||||
如图,BRDF渲染的皮肤效果显得干燥,BSSRDF则能有很好的效果
|
||||
|
||||

|
||||

|
||||
|
||||
* 应用
|
||||
|
||||
人脸渲染
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 布料(cloth)
|
||||
|
@ -442,7 +440,7 @@ BSSRDF,类大理石
|
|||
|
||||
纤维(fiber)是最基础的,纤维可以缠绕成不同的股(ply),不同的股再经过不同的缠绕形成线(yarn)
|
||||
|
||||

|
||||

|
||||
|
||||
Woven or Knitted(编织或针织)
|
||||
|
||||
|
@ -458,7 +456,7 @@ Woven or Knitted(编织或针织)
|
|||
|
||||
布料模型大多数并非在一个表面上,难以使用BRDF来表示
|
||||
|
||||

|
||||

|
||||
|
||||
* 解决方案1
|
||||
|
||||
|
@ -466,114 +464,112 @@ Woven or Knitted(编织或针织)
|
|||
|
||||
计算量庞大,计算时间长
|
||||
|
||||

|
||||

|
||||
|
||||
* 解决方案2
|
||||
|
||||
布料本身是纤维,渲染每一根纤维也能产生很好的效果,计算量同样惊人
|
||||
|
||||

|
||||

|
||||
|
||||
* 应用
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 有细节的材质(Detailed Appearance)
|
||||
|
||||
如下图,渲染结果不错但并不真实,因为结果过于完美
|
||||
|
||||

|
||||

|
||||
|
||||
真实情况下车上会有高光,高光周围会有类似于蜘蛛网结构的划痕。鼠标上则会有由很多小的凸起形成的高光
|
||||
|
||||

|
||||

|
||||
|
||||
下图由微表面模型渲染得出,结果完美但不真实
|
||||
|
||||

|
||||

|
||||
|
||||
加入了实际可能产生不完美的地方
|
||||
|
||||

|
||||

|
||||
|
||||
模拟被同方向刷出的各项异性材质
|
||||
|
||||

|
||||

|
||||
|
||||
* 微表面模型中的法线分布
|
||||
|
||||
微表面模型中重要的是微表面的法线分布,描述分布时,往往使用非常简单的模型(正态分布、高斯),得到的自然是没有什么细节的结果(法线分布没有体现各种各样的变化和细节)
|
||||
|
||||

|
||||

|
||||
|
||||
在蜗牛壳上贴了一个大的法线贴图,每个面都可以产生高光,所有高光形成一起就可以变成一个大高光
|
||||
|
||||

|
||||

|
||||
|
||||
Metallic flakes:可替换别的模型,例如很多人在车漆中添加的亮片,亮片会形成很多不同的方向,不同方向会形成不同的反光
|
||||
|
||||

|
||||

|
||||
|
||||
虽然能够定义各种细节,但渲染十分困难,需要渲染接近一个月才能得到这个结果
|
||||
|
||||

|
||||

|
||||
|
||||
* 渲染困难的原因:
|
||||
|
||||
认为每一个微表面是一个镜面,如下图场景中有一个针孔摄像机和一个点光源,那从摄像机打根光线过去,打到哪个表面,就可以知道它的法线,也就可以知道它的镜面反射方向,所以也就很难通过反射的方式让光线打到光源上。从光源打过来也是同理,打到一个微表面,并且知道如何反射,但就是反射不到摄像机上去
|
||||
|
||||

|
||||

|
||||
|
||||
解决:
|
||||
由于一个像素会覆盖很多的微表面,如果将一个小的范围内的微表面的法线分布计算出来便可代替原本光滑的分布并用在微表面模型里
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
* P-NDF的形状:
|
||||
|
||||
如果考虑像素覆盖的范围,就可以得到各种各样神奇的法线分布(NDF)。可以想象一个像素覆盖了非常多的微表面,那这些微表面自然会显示出一些统计学的规律,那如果覆盖的范围小,就会显示出一些很独特的性质,法线分布就会看上去很有特点
|
||||
|
||||

|
||||

|
||||
|
||||
不同类型的法线贴图会引起不同的法线分布
|
||||
|
||||

|
||||

|
||||
|
||||
* 例子和应用
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
游戏中的应用-古墓丽影中的雪地
|
||||
|
||||

|
||||

|
||||
|
||||
#### 波动光学
|
||||
|
||||
引入细节后,还用几何光学解释就不对,物理上当物体非常小,小到和光的波长相当时,就不能假设光线是沿直线传播的,而必须假设这个光是一个波,这就会涉及到衍射和干涉现象的发生
|
||||
|
||||

|
||||

|
||||
|
||||
比如在黑屋里,用点光源照亮一个金属片,会在本身只有一个颜色的金属片上看到各种各样的颜色
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
白光照射后反射出来的便为白光,如果不是白的就一定有波动光学(Wave Optics)
|
||||
|
||||
波动光学得出的BRDF与几何光学的BRDF很像但具有不连续的特点(光会发生干涉,会引起部分区域加强或减弱)
|
||||
|
||||

|
||||

|
||||
|
||||
以下为波动关系渲染的结果
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
--------------------
|
||||
|
||||
|
@ -583,33 +579,32 @@ Metallic flakes:可替换别的模型,例如很多人在车漆中添加的亮
|
|||
|
||||
如下图可定义各种各样的花纹,花瓶打碎后可见花瓶内部纹理,可定义一个三维纹理
|
||||
|
||||

|
||||

|
||||
|
||||
存储量在三维下会变得很大,可利用noise函数(x,y,z),给定任何x,y,z可得到对应的值,这样可以实现什么时候用就什么时候去查
|
||||
|
||||

|
||||
|
||||

|
||||
procedural更多意味着不生成,需要时再查询
|
||||
|
||||
* 车上的锈
|
||||
|
||||
可生成一系列噪声,可对噪声做出一系列操作(二值化(binary noise));铁锈往往是不同区域有不同分布,这个噪声如果为0到1,当函数值大于0.8时认为是1,小于0.8就认为是0
|
||||
|
||||

|
||||

|
||||
|
||||
应用最广泛的是柏林(Perlin)噪声
|
||||
|
||||
* 生成地形
|
||||
|
||||

|
||||

|
||||
|
||||
* 生成海浪
|
||||
|
||||

|
||||

|
||||
|
||||
* 生成木头纹理
|
||||
|
||||

|
||||

|
||||
|
||||
常用Houdini来做程序化材质,且是先程序化生成再拿去使用
|
||||
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: "Hello World"
|
||||
date: 2022-05-10T09:01:33+08:00
|
||||
draft: true
|
||||
---
|
||||
this is a test post
|
|
@ -12,7 +12,7 @@ date: 2023-08-07T19:09:08+08:00
|
|||
|
||||
首先需要在gitea上创建OAth2应用令牌并设置应用的重定向URL
|
||||
|
||||

|
||||

|
||||
|
||||
重定向URL必须为http(s)://域名/login形式,视ssl情况是否有s
|
||||
|
||||
|
@ -103,18 +103,18 @@ docker-compose中环境变量设置在等于号后面不要输入空格再接参
|
|||
|
||||
实在不懂可以找一个github授权的网页查看URL结构,就可以模仿github授权的URL结构在404页面的URL中截取
|
||||
|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
一切正常地部署完成后,便可以在drone的首页看到自己在gitea上的所有项目,可以查看build情况和设置对应的选项
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
这里展示的是这个便是这个博客在我的drone上的设置
|
||||
|
||||

|
||||

|
||||
|
||||
单有流水线设置还不够,流水线流程的定义还需要在项目中使用yaml文件来定义,对应的文件就在drone上设置
|
||||
|
||||
|
@ -126,7 +126,7 @@ webhook在完成drone的集成时就由drone在对应gitea项目下自动创建
|
|||
|
||||
如图,我只选择了一些会导致博客内容发生改变的选项
|
||||
|
||||

|
||||

|
||||
|
||||
既然drone是在容器内执行任务,那么容器镜像则十分重要,为了确保足够轻量(内存溢出的教训印象深刻),我选择了自行配置一个镜像,使用alpine + git + hugo + rsync来配置,尽可能减少容器占用
|
||||
|
||||
|
@ -180,4 +180,6 @@ volumes: #声明数据卷
|
|||
|
||||
流水线配置依旧存在一些问题,每次build都需要clone一遍,导致耗时比较长(尤其大型项目),下一步考虑引入drone-volume-cache,缓存项目来加快速度
|
||||
|
||||
注(2024):现在已经改成了自部署lychee作为图床并全面转入webp格式图片,缓存将在下次编译有大量依赖的项目时使用
|
||||
|
||||
整体下来轻量化十分明显,原来溢出的内存现在只占用了1GB(不止nginx + gitea + drone三项服务),也节省了不少服务器的开支,毕竟云服务对于我这种学生党还是比较贵的
|
|
@ -5,6 +5,7 @@ date: 2022-08-22T21:53:27+08:00
|
|||
|
||||
---
|
||||
|
||||
由于王道停止在bilibili更新每日一题,随之停更
|
||||
|
||||
该题更新于:2022-09-02 18:45:36
|
||||
|
||||
|
|
Before Width: | Height: | Size: 155 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 208 KiB |
Before Width: | Height: | Size: 319 KiB |
Before Width: | Height: | Size: 371 KiB |
Before Width: | Height: | Size: 437 KiB |
Before Width: | Height: | Size: 285 KiB |
Before Width: | Height: | Size: 364 KiB |
Before Width: | Height: | Size: 312 KiB |
Before Width: | Height: | Size: 269 KiB |
Before Width: | Height: | Size: 425 KiB |
Before Width: | Height: | Size: 531 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 301 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 782 KiB |
Before Width: | Height: | Size: 472 KiB |
Before Width: | Height: | Size: 549 KiB |
Before Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 394 KiB |
Before Width: | Height: | Size: 552 KiB |
Before Width: | Height: | Size: 440 KiB |
Before Width: | Height: | Size: 588 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 124 KiB |
Before Width: | Height: | Size: 225 KiB |
Before Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 144 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 386 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 368 KiB |
Before Width: | Height: | Size: 189 KiB |
Before Width: | Height: | Size: 386 KiB |
Before Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 209 KiB |
Before Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 196 KiB |
Before Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 50 KiB |