Compare commits

...

5 Commits

Author SHA1 Message Date
InkSoul fe05a1acfe 完成计算机基础和图形学的webp图片替换和删除
continuous-integration/drone/push Build is passing Details
2024-01-19 23:00:30 +08:00
InkSoul 871a2a082b 完成基础栏目的图片webp更换 2024-01-19 15:28:06 +08:00
InkSoul eef89cb99e 完成计算机网络的图片webp替换
continuous-integration/drone/push Build is passing Details
2024-01-17 23:07:51 +08:00
InkSoul 811fcd8916 完成基础下的操作系统内容的图片webp格式更换
continuous-integration/drone/push Build encountered an error Details
预备添加基础下剩余内容的webp图片
2024-01-17 16:24:05 +08:00
InkSoul 609e48888d 合理化408命名,初步测试webp格式及图床
continuous-integration/drone/push Build is passing Details
2024-01-16 23:45:10 +08:00
1061 changed files with 983 additions and 1011 deletions

View File

@ -238,8 +238,8 @@ uglyURLs = false
identifier = "mathematics"
[[menu.main]]
pageref = "/408/"
name = "408"
pageref = "/ComputerBasics/"
name = "基础"
weight = 4
pre = "internal"
post = "cubes"

View File

@ -113,7 +113,7 @@ date: 2023-07-05T14:13:34+08:00
* 根据CPU的命令对相应设备发送命令
* 用于实现设备控制功能
* 组成图
* ![](../../images/408/《操作系统》IO管理/设备控制器组成图.png)
* ![](https://lychee.inksoul.top/uploads/original/27/43/c11160ee9f28865c3eb334988c91.webp)
### 设备控制器的三种寄存器可被CPU直接访问的寄存器也叫IO端口
@ -173,7 +173,7 @@ date: 2023-07-05T14:13:34+08:00
* 每个DMA控制器对应一台设备与内存传递数据
* DMA方式主要用于块设备磁盘尤其是典型的块设备
* 示例图
* ![](../../images/408/《操作系统》IO管理/DMA工作原理.png)
* ![](https://lychee.inksoul.top/uploads/original/6c/03/f773b60ca05a2cb8f7cc60d3a6bb.webp)
### 通道控制方式
@ -189,7 +189,7 @@ date: 2023-07-05T14:13:34+08:00
* 通常包含许多非分配型字通道数量可以达到几十到几百个每个通道连接一台IO设备并控制该设备的IO操作
* 常用于连接大量低速或中速IO设备
* 示例图
* ![](../../images/408/《操作系统》IO管理/通道控制方式流程图.png)
* ![](https://lychee.inksoul.top/uploads/original/f7/43/029203b2d6e455c455a730974d31.webp)
### 四种方式比较
@ -247,22 +247,22 @@ date: 2023-07-05T14:13:34+08:00
### 设备分配依据的数据结构
* 设备、控制器、通道间的关系
* ![](../../images/408/《操作系统》IO管理/设备控制器组成图.png)
* ![](https://lychee.inksoul.top/uploads/original/27/43/c11160ee9f28865c3eb334988c91.webp)
* 设备控制表DCT
* 系统为每个设备配置一张DCT
* 用于记录设备情况
* ![](../../images/408/《操作系统》IO管理/设备控制表.png)
* ![](https://lychee.inksoul.top/uploads/original/c3/02/3e2798fcb153d946531079d9dd92.webp)
* 控制器控制表COCT
* 每个设备控制器都会对应一张COCT
* 操作系统会根据COCT的信息对控制器进行操作管理
* ![](../../images/408/《操作系统》IO管理/控制器控制表.png)
* ![](https://lychee.inksoul.top/uploads/original/75/30/dd8508704dcc8f3d67c22b7cfc83.webp)
* 通道控制表CHCT
* 每个通道都会对应一张CHCT
* 操作系统会根据CHCT的信息对通道进行操作管理
* ![](../../images/408/《操作系统》IO管理/通道控制表.png)
* ![](https://lychee.inksoul.top/uploads/original/64/d5/c56c3ce0f0fb18858734b1e9596d.webp)
* 系统设备表SDT
* 记录了系统中全部设备的情况,每个设备对应一个表目
* ![](../../images/408/《操作系统》IO管理/系统设备表.png)
* ![](https://lychee.inksoul.top/uploads/original/34/80/f230f2640fac89147128cbe3bc4b.webp)
### 逻辑设备名到物理设备名的映射
@ -311,25 +311,25 @@ date: 2023-07-05T14:13:34+08:00
* 单缓冲
* 流程
* Max(C,T) + M
* ![](../../images/408/《操作系统》IO管理/单缓冲流程图.png)
* ![](https://lychee.inksoul.top/uploads/original/bc/de/74644bf29707fbb46c62f8c5e82b.webp)
* T > C 时处理一块数据需要T + M
* ![](../../images/408/《操作系统》IO管理/单缓冲T大于C.png)
* ![](https://lychee.inksoul.top/uploads/original/f8/79/2182afa85837c7f60e7dfadc1894.webp)
* T < C C + M
* ![](../../images/408/《操作系统》IO管理/单缓冲T小于C.png)
* ![](https://lychee.inksoul.top/uploads/original/70/cc/47c780ffa35684cf6ffbe1080e4d.webp)
* 双缓冲
* 流程
* Max(T,C + M)
* ![](../../images/408/《操作系统》IO管理/双缓冲流程图.png)
* ![](https://lychee.inksoul.top/uploads/original/c9/41/39106528cd38fad66670ebda09cf.webp)
* T > C + M 时平均处理一个数据块需要时间T
* ![](../../images/408/《操作系统》IO管理/双缓冲T大于C+M.png)
* ![](https://lychee.inksoul.top/uploads/original/c0/4c/5bdb95aa0b00aae9c57fe353c572.webp)
* T < C + M (C + M)
* ![](../../images/408/《操作系统》IO管理/双缓冲T小于C+M.png)
* ![](https://lychee.inksoul.top/uploads/original/ac/23/066dfc2a705e7824e63e315a41fc.webp)
* 循环缓冲
* 将多个大小相等的缓冲区连接成一个循环队列
* 下图中橙色表示已充满数据的缓冲区,绿色表示空缓冲区
* 当需要向缓冲区中充入数据时只要找到in指针指向的空缓冲区向其中充入数据然后再把in指针指向下一个空缓冲区
* 当需要取出满缓冲区的内容时找到out指针执行的满缓冲区读取完数据后将指针指向下一个满缓冲区
* ![](../../images/408/《操作系统》IO管理/循环缓冲流程图.png)
* ![](https://lychee.inksoul.top/uploads/original/61/b0/8081e7d506e41a75d67a80aff71c.webp)
* 缓冲池
* 缓冲池由系统中共用的存放在主存中的缓冲区组成,被认为是最好的方法
* 缓冲区根据使用情况分为
@ -341,7 +341,7 @@ date: 2023-07-05T14:13:34+08:00
* 用于提取输入数据的工作缓冲区sin
* 用于收容输出数据的工作缓冲区hout
* 用于提取输出数据的工作缓冲区sout
* ![](../../images/408/《操作系统》IO管理/缓冲池流程图.png)
* ![](https://lychee.inksoul.top/uploads/original/64/fb/95ef428992c16ee7fe1ff3866a70.webp)
## SPOOLing技术假脱机技术
@ -371,7 +371,7 @@ date: 2023-07-05T14:13:34+08:00
* 输入缓冲区用于暂存从输入设备输入的数据,之后再转存到输入井中
* 输出缓冲区用于暂存从输出井传送的数据,之后再传送到输出设备上
* 流程图
* ![](../../images/408/《操作系统》IO管理/SPOOLing系统的运行过程.png)
* ![](https://lychee.inksoul.top/uploads/original/e2/cb/d011a4a724c9256aba7b5cab0220.webp)
### SPOOLing系统的优特点
@ -397,7 +397,7 @@ date: 2023-07-05T14:13:34+08:00
### 基本概念和结构
![](../../images/408/《操作系统》IO管理/磁盘结构示例图.jpg)
![](https://lychee.inksoul.top/uploads/medium/f6/02/3a8e76155755af00c49f8b9c5cd1.webp)
* 基本结构
* 磁盘
@ -509,7 +509,7 @@ date: 2023-07-05T14:13:34+08:00
* 处理顺序
* 98,183,37,122,14,124,65,67
* 寻道示例图
* ![](../../images/408/《操作系统》IO管理/磁盘调度-先来先服务.png)
* ![](https://lychee.inksoul.top/uploads/original/5b/43/b8be7813907cd2bfcd508fa398db.webp)
* 最短寻找时间优先SSTF
* 思想
* 优先选择从当前磁头位置所需寻道时间最短的请求
@ -522,7 +522,7 @@ date: 2023-07-05T14:13:34+08:00
* 处理顺序
* 65,67,37,14,98,122,124,183
* 寻道示例图
* ![](../../images/408/《操作系统》IO管理/磁盘调度-最短寻道时间优先.png)
* ![](https://lychee.inksoul.top/uploads/original/55/57/064d927f543dea7f214575ce0956.webp)
* 扫描/电梯算法SCAN
* 思想
* 磁头在一个方向上移动,访问所有未完成的请求,直到磁头到达该方向上的最后的磁道,才调换方向
@ -536,7 +536,7 @@ date: 2023-07-05T14:13:34+08:00
* 磁头先响应左边的请求,到达最左端后才开始反向移动,响应右边的请求
* 37,14,0,65,67,98,122,124,183
* 寻道示例图
* ![](../../images/408/《操作系统》IO管理/磁盘调度-扫描算法.png)
* ![](https://lychee.inksoul.top/uploads/original/39/66/ac470363b7d89d3f03927225982c.webp)
* C-SCAN算法
* 思想
* 只有磁头朝某个特定方向移动时,才处理磁道访问请求
@ -553,7 +553,7 @@ date: 2023-07-05T14:13:34+08:00
* 直到到达最开始的磁道后,才继续顺序响应右边的请求
* 65,67,98,122,124,183,199,0,14,37
* 寻道示例图
* ![](../../images/408/《操作系统》IO管理/磁盘调度-C-SCAN算法.png)
* ![](https://lychee.inksoul.top/uploads/original/66/f6/29c00355469ea4dec47daba8690b.webp)

View File

@ -45,7 +45,7 @@ date: 2023-07-03T20:39:49+08:00
过程图
![](../../images/408/《操作系统》内存管理/程序链接与接入过程图.jpg)
![](https://lychee.inksoul.top/uploads/original/54/11/97d9b0ea12b94ea78ab84ec026b1.webp)
* 编译
* 由编译程序将用户源代码编译程若干目标模块
@ -62,7 +62,7 @@ date: 2023-07-03T20:39:49+08:00
* 可重定位装入:装入时把逻辑地址转换为物理地址,但装入后不能改变
* 动态重定位装入:执行时再决定装入的地址并装入,装入后有可能会换出
![](../../images/408/《操作系统》内存管理/重装入类别例图.jpg)
![](https://lychee.inksoul.top/uploads/medium/1c/ce/b6e9dba57d889e30e534c2f9cf9e.webp)
### 逻辑地址与物理地址
@ -91,7 +91,7 @@ date: 2023-07-03T20:39:49+08:00
* 堆:用来存放动态分配的变量【动态的】
* 栈:用来实现函数调用的【动态的】
![](../../images/408/《操作系统》内存管理/内存映像的例图.jpg)
![](https://lychee.inksoul.top/uploads/medium/2e/7e/d2ba153083a733e9be4aa30b8847.webp)
### 内存保护
@ -105,7 +105,7 @@ date: 2023-07-03T20:39:49+08:00
* 界地址寄存器含逻辑机制的最大值【用于比】
* 逻辑地址+重定位寄存器的值 = 物理地址
![](../../images/408/《操作系统》内存管理/重定位寄存器和界地址寄存器的硬件支持.jpg)
![](https://lychee.inksoul.top/uploads/original/05/49/4869cf02db361330c3f124413dd1.webp)
### 内存共享
@ -274,11 +274,11 @@ date: 2023-07-03T20:39:49+08:00
利用段表实现物理内存区映射
![](../../images/408/《操作系统》内存管理/利用段表实现物理内存区映射.jpg)
![](https://lychee.inksoul.top/uploads/original/d0/d3/e53f784dc6b2866f6c0a8be89a1c.webp)
分段系统的地址变换过程
![](../../images/408/《操作系统》内存管理/分段系统的地址变换过程.jpg)
![](https://lychee.inksoul.top/uploads/medium/83/ae/3e11e38fa42704c70ebd98f6af02.webp)
### 分页
@ -333,7 +333,7 @@ date: 2023-07-03T20:39:49+08:00
* 分页产生的页表过大,使用多级页表来解决空间上的问题
![](../../images/408/《操作系统》内存管理/基本地址变换结构图.png)
![](https://lychee.inksoul.top/uploads/original/38/24/d666c6b3db887d6c214536372a3f.webp)
* 两级页表地址变换
* 一级页表覆盖到全部虚拟地址空间,二级页表在需要时创建
@ -341,7 +341,7 @@ date: 2023-07-03T20:39:49+08:00
* 页表寄存器存放的是一级页表起始物理地址
* 多层参与时间上开销大加入TLB提高地址的转换速度
![](../../images/408/《操作系统》内存管理/两级页表地址变化结构图.png)
![](https://lychee.inksoul.top/uploads/medium/df/5d/96551021cbb78e0532d3825aff1d.webp)
* 具有快表的地址变换
* 快表是相联存储器TLB
@ -351,7 +351,7 @@ date: 2023-07-03T20:39:49+08:00
* CPU芯片中封装了MMU内存管理单元
* MMU用来完成地址转换和TBL的访问与交互
![](../../images/408/《操作系统》内存管理/具有快表的地址变换结构图.png)
![](https://lychee.inksoul.top/uploads/original/21/80/bb05899161040a2fefd4155a35a6.webp)
### 段页
@ -364,9 +364,9 @@ date: 2023-07-03T20:39:49+08:00
* 对内存的管理以存储块为单位,地址空间是二维的
* 演示图例
![](../../images/408/《操作系统》内存管理/段页式系统的地址变换机构图.jpg)
![](https://lychee.inksoul.top/uploads/original/fb/79/93a67e5e95084988d59345778f2b.webp)
![](../../images/408/《操作系统》内存管理/段页式系统的逻辑地址结构图.jpg)
![](https://lychee.inksoul.top/uploads/medium/f0/fa/cdb041b48c9c5e17ca7964595fc1.webp)
* 得到物理地址的3次内存访问
@ -470,7 +470,7 @@ date: 2023-07-03T20:39:49+08:00
* 从内存中换出一页
* 地址变换过程
![](../../images/408/《操作系统》内存管理/地址变换过程演示图.jpg)
![](https://lychee.inksoul.top/uploads/medium/4e/b9/cb1740726f181da5c99283319096.webp)
### 页框分配进程准备执行时由OS决定给特定进程分配几个页框
@ -591,5 +591,5 @@ date: 2023-07-03T20:39:49+08:00
使用页表的地址翻译
![](../../images/408/《操作系统》内存管理/使用页表的地址翻译流程图.png)
![](https://lychee.inksoul.top/uploads/medium/9b/e1/745706d0a61322386e63ae8b3e62.webp)

View File

@ -22,7 +22,8 @@ date: 2023-07-06T11:24:18+08:00
----
![](../../images/408/《操作系统》大题总结/生产者消费者问题一.png)
![](https://lychee.inksoul.top/uploads/original/ab/ec/6ab00f9e1ca414581c4cea758dd4.webp)
``` C
Semaphore mutex1 = 1 //互斥访问F1
@ -75,7 +76,7 @@ F_C(){
```
![](../../images/408/《操作系统》大题总结/生产者消费者问题三.png)
![](https://lychee.inksoul.top/uploads/original/6a/7a/7be0bf2eb19ccfb5cd3b2f7d4b18.webp)
```C
@ -156,7 +157,7 @@ while(1){
```
![](../../images/408/《操作系统》大题总结/理发师问题一.png)
![](https://lychee.inksoul.top/uploads/original/3d/72/d1067d172a895094998eff135ee0.webp)
```C
Semaphore empty = 10;//空座位的数目
@ -236,7 +237,7 @@ process(){
```
![](../../images/408/《操作系统》大题总结/哲学家问题一.png)
![](https://lychee.inksoul.top/uploads/original/db/e1/ed22be998422081aae2e57ca1d0d.webp)
通常解
@ -352,7 +353,7 @@ solo(){
```
![](../../images/408/《操作系统》大题总结/读者写者问题一.png)
![](https://lychee.inksoul.top/uploads/original/a6/d4/74e8e2b6e6fc6f4a922b4666debc.webp)
1
```C
@ -407,7 +408,7 @@ NtoS(){//北到南
}
```
![](../../images/408/《操作系统》大题总结/读者写者问题二.png)
![](https://lychee.inksoul.top/uploads/original/75/8a/fa213f171a2a7285840dedd68768.webp)
```C
Semaphore room = 1;
@ -497,21 +498,21 @@ P3(){
* 一级页表+虚拟内存+TLB
* 二级页表+虚拟内存+TLB
![](../../images/408/《操作系统》大题总结/内存管理知识体系.jpg)
![](https://lychee.inksoul.top/uploads/medium/c7/b6/3d42bb2a3eb23a3f623b5625b072.webp)
TLB+二级页表+Cache(全相联映射)
![](../../images/408/《操作系统》大题总结/TLB全相联映射.jpg)
![](https://lychee.inksoul.top/uploads/medium2x/62/62/afdde2594f9c51f47eb670eb3954.webp)
TLB+二级页表+Cache(2路组相联映射)
![](../../images/408/《操作系统》大题总结/TLB2路组相联映射.jpg)
![](https://lychee.inksoul.top/uploads/medium2x/61/61/67c696778a1bcb6345fd983486e2.webp)
TLB + 二级页表 + Cache(直接映射)
![](../../images/408/《操作系统》大题总结/TLB直接映射.jpg)
![](https://lychee.inksoul.top/uploads/medium2x/f4/b4/ff5fea0be661df57e0729b223676.webp)
---
![](../../images/408/《操作系统》大题总结/内存管理真题一.png)
![](https://lychee.inksoul.top/uploads/original/e9/22/9df2db6e4946fccab35619260a03.webp)
1
<br>
@ -539,7 +540,7 @@ TLB + 二级页表 + Cache(直接映射)
<br>
代码2起始物理地址 = 00901000H
![](../../images/408/《操作系统》大题总结/内存管理真题二.png)
![](https://lychee.inksoul.top/uploads/original/e9/22/9df2db6e4946fccab35619260a03.webp)
页的大小 = 4KB = $2^{12}$B页面位移比虚拟地址低12位
@ -570,7 +571,7 @@ TLB + 二级页表 + Cache(直接映射)
物理地址 = 101565H
![](../../images/408/《操作系统》大题总结/内存管理真题三.png)
![](https://lychee.inksoul.top/uploads/original/22/38/c4c268827942286cdd5a8e80356e.webp)
1
@ -594,7 +595,7 @@ TLB + 二级页表 + Cache(直接映射)
物理地址为 0000 1011 1100 1010 = 0BCAH
![](../../images/408/《操作系统》大题总结/内存管理真题四.png)
![](https://lychee.inksoul.top/uploads/original/e5/55/98c0c031454ed358a64dd7fe1a8d.webp)
1
@ -617,7 +618,7 @@ TLB + 二级页表 + Cache(直接映射)
适合,程序的时间局部性越好,从空闲页框链表中重新取回的机会越大,该策略优势越明显
![](../../images/408/《操作系统》大题总结/内存管理真题五.png)
![](https://lychee.inksoul.top/uploads/original/aa/89/6febeebd56da7e5b3e3bee31ca09.webp)
1
@ -644,7 +645,7 @@ TLB + 二级页表 + Cache(直接映射)
访问的是同一个二级页表,即供访问一个二级页表
![](../../images/408/《操作系统》大题总结/内存管理真题六.png)
![](https://lychee.inksoul.top/uploads/original/cb/d8/ca81273904bee3769a1123fca589.webp)
1
@ -668,7 +669,7 @@ TLB + 二级页表 + Cache(直接映射)
修改位$\rightarrow$修改字段
![](../../images/408/《操作系统》大题总结/内存管理真题七.png)
![](https://lychee.inksoul.top/uploads/original/ae/5e/22026fc03008e1b0638eedef21cd.webp)
1
@ -706,16 +707,16 @@ a[1][2]的虚拟地址为 10801000H + 4 $\times$ 2 = 10801008H
显式链表分配法FAT文件系统即DOS
![](../../images/408/《操作系统》大题总结/FAT文件系统示意图.png)
![](https://lychee.inksoul.top/uploads/medium2x/dd/d0/e4a8e02445c47d55158e49119375.webp)
混合索引法Unix文件系统
![](../../images/408/《操作系统》大题总结/UFS文件系统示意图.png)
![](https://lychee.inksoul.top/uploads/medium2x/b6/df/eb222d51132aa6a759e64aab4239.webp)
### 考题
![](../../images/408/《操作系统》大题总结/文件管理真题一.png)
![](https://lychee.inksoul.top/uploads/original/69/7e/ec3dd430b748a6df97713adae363.webp)
1
@ -729,7 +730,7 @@ FCB集中存放文件数据集中存放
这样在随机查找文件名时只需访问FCB对应的块可减少磁头移动和磁盘IO访问次数
![](../../images/408/《操作系统》大题总结/文件管理真题二.png)
![](https://lychee.inksoul.top/uploads/original/e1/6c/b74b2eee0e6075aa78ecab6e550a.webp)
1
@ -753,7 +754,7 @@ FCB集中存放文件数据集中存放
块数可表示$2^{32}$个块共4TB
![](../../images/408/《操作系统》大题总结/文件管理真题三.png)
![](https://lychee.inksoul.top/uploads/original/34/47/928c9f9dce3b68f1a51e263ad5c5.webp)
1
@ -794,7 +795,7 @@ FAT最大长度 = $2^{16} \times 2B = 128KB$
即访问48号簇106号簇
![](../../images/408/《操作系统》大题总结/文件管理真题四.png)
![](https://lychee.inksoul.top/uploads/original/3a/b0/c094beafcdec6b3351bdbb8d9e5d.webp)
1
@ -820,7 +821,7 @@ F的文件控制区的起始块号和文件长度内容会发生改变
文件长度为$1020B \times 4G = 4080GB$
![](../../images/408/《操作系统》大题总结/文件管理真题五.png)
![](https://lychee.inksoul.top/uploads/original/1d/f8/0c2436c145b300cf1f31d7927296.webp)
1
@ -860,7 +861,7 @@ $F_2$采用一级索引$\rightarrow$ 还需读一级索引表
### 大题
![](../../images/408/《操作系统》大题总结/磁盘管理真题一.png)
![](https://lychee.inksoul.top/uploads/original/12/9a/317bd0a10b1d1615ede07d640e90.webp)
1
@ -893,7 +894,7 @@ Flash半导体存储器不需要考虑寻道时间和旋转延迟
可直接按IO请求的先后顺序服务
![](../../images/408/《操作系统》大题总结/磁盘管理真题二.png)
![](https://lychee.inksoul.top/uploads/original/01/69/aa1c7ae2651f40889cfd3026c1ca.webp)
1
@ -922,7 +923,7 @@ $30 \times 2 = 60$
将簇号转换成磁盘物理地址的过程由磁盘驱动程序完成
![](../../images/408/《操作系统》大题总结/磁盘管理真题三.png)
![](https://lychee.inksoul.top/uploads/original/4a/da/e177d677686800a6d4340a53b1b0.webp)
1

View File

@ -85,7 +85,7 @@ date: 2023-07-04T16:56:55+08:00
* 新增内容:索引节点编号;状态;访问计数;逻辑设备号;链接指针
![](../../images/408/《操作系统》文件管理/书目录和计算机目录对比举例.jpg)
![](https://lychee.inksoul.top/uploads/medium/3b/52/0d19d61c49c2ed8e16d8e9101539.webp)
### 文件操作
@ -206,7 +206,7 @@ close(fd);//关闭文件
* 缺点
* 要求连续的存储空间,会产生外部碎片,不利于文件的动态扩充
* 例图
* ![](../../images/408/《操作系统》文件管理/顺序分配例图.png)
* ![](https://lychee.inksoul.top/uploads/original/8c/b0/eb0fe9bfa64672e9553fe84dea71.webp)
* 链表分配
* 特点
* 存放是离散的,不用连续的,于是就可以消除磁盘碎片
@ -222,7 +222,7 @@ close(fd);//关闭文件
* 缺点
* 只能按照文件的指针链顺序访问,查找效率低,指针信息存放消耗内存或磁盘空间
* 例图
* ![](../../images/408/《操作系统》文件管理/非连续空间存放方式-链表方式.png)
* ![](https://lychee.inksoul.top/uploads/original/de/f5/1147f9177cb7ea4796e01a45c2ee.webp)
* 索引分配
* 特点
* 为每个文件创建一个索引数据块存放指向文件数据块的指针列表
@ -234,12 +234,12 @@ close(fd);//关闭文件
* 缺点
* 索引表增加存储空间的开销,索引表的查找策略对文件系统效率影响较大
* 例图
* ![](../../images/408/《操作系统》文件管理/非连续空间存放方式-索引方式.png)
* ![](https://lychee.inksoul.top/uploads/original/af/c6/53200b3a295538efb4b35f7f7a1d.webp)
* 链表 + 索引
* 特点
* 索引数据块留出一个存放下一个索引数据块的指针
* 例图
* ![](../../images/408/《操作系统》文件管理/链式索引块.png)
* ![](https://lychee.inksoul.top/uploads/original/39/90/c6903f2f8e86df775a65136c4842.webp)
* 索引 + 索引(多级索引)
* 特点
* 通过一个索引块来存放多个索引数据块
@ -265,12 +265,12 @@ close(fd);//关闭文件
* 为所有空闲空间建立一张表
* 表内容包括空闲区的第一个块号和该空闲区的块个数
* 例图
* ![](../../images/408/《操作系统》文件管理/空闲表法.png)
* ![](https://lychee.inksoul.top/uploads/original/b0/b8/241f96662aa6babf6c9a40655aa3.webp)
* 空闲链表法
* 每一个空闲块里有一个指针指向下一个空闲块
* 这样能够很方便地找到空闲块并管理起来
* 例图
* ![](../../images/408/《操作系统》文件管理/空闲块链表.png)
* ![](https://lychee.inksoul.top/uploads/original/c5/4b/7dae46b384bc4c13f3bd2ea9c787.webp)
* 位图法
* 位图时利用二进制的一位来表示磁盘中一个盘块的使用情况
* 磁盘上所有的盘块都有一个二进制与之对应
@ -328,7 +328,7 @@ close(fd);//关闭文件
* 在磁盘中的结构
* 例图
* ![](../../images/408/《操作系统》文件管理/块组.png)
* ![](https://lychee.inksoul.top/uploads/original/e1/0c/97c0fa24db5c7451f1d62bacb1f0.webp)
* 引导块
* 在系统启动时用于启用引导
* 块组
@ -371,7 +371,7 @@ close(fd);//关闭文件
### 用户空间、系统调用、虚拟文件系统、缓存、文件系统和存储之间的关系
![](../../images/408/《操作系统》文件管理/虚拟文件系统.png)
![](https://lychee.inksoul.top/uploads/medium/33/0d/00893d08c49606eb0d2039281bc3.webp)
### 分区和安装
@ -415,7 +415,7 @@ close(fd);//关闭文件
* 不便于文件共享
* 不适合多用户的OS
* 结构图
* ![](../../images/408/《操作系统》文件管理/单级目录结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/98/75/8072452cfa354a436e12d25611d8.webp)
* 两级目录结构
* 定义
* 文件目录分为主文件目录MDF和用户文件目录UFD
@ -427,7 +427,7 @@ close(fd);//关闭文件
* 缺点
* 缺乏灵活性,不能对文件分类
* 结构图
* ![](../../images/408/《操作系统》文件管理/两级目录结构.png)
* ![](https://lychee.inksoul.top/uploads/original/6e/69/fcafe831e9b3096daec59ce79414.webp)
* 树型目录结构
* 定义
* 使用绝对路径,相对路径,当前路径的结构
@ -440,7 +440,7 @@ close(fd);//关闭文件
* 利于文件共享
* 查找文件增加了磁盘访问次数,会影响查询速度
* 例图
* ![](../../images/408/《操作系统》文件管理/树型目录结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/db/ce/faef6ae7cd83dea33f82b14b8a53.webp)
* 无环图目录结构
* 定义
* 在树型目录结构上
@ -450,7 +450,7 @@ close(fd);//关闭文件
* 缺点
* 使系统的管理变得更加复杂
* 例图
* ![](../../images/无环图目录结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/89/56/eabf857b6bfbd20cdcc46d67c92a.webp)
### 目录的查询/检索
@ -494,7 +494,7 @@ close(fd);//关闭文件
* 若得到的值不为0则不能删除此文件
* 即只要还有一个指针在,索引节点就不会被删除
* 例图
* ![](../../images/408/《操作系统》文件管理/基于索引结点的共享方式.jpg)
* ![](https://lychee.inksoul.top/uploads/original/f4/cd/49dd3cf3de0acebe0a70b14bf213.webp)
* 基于符号链实现文件共享【软链接】
* 定义
* 软链接相当于重新创建一个文件

View File

@ -301,7 +301,7 @@ date: 2022-08-18T15:53:40+08:00
![](../../images/408/《操作系统》计算机系统概述/system_boot_pic.jpg)
![](https://lychee.inksoul.top/uploads/original/aa/b6/dd60b007959187b3c7f5b066b100.webp)
* 启动过程
1. CPU加电CS:IP指向FFFF0H

View File

@ -332,7 +332,7 @@ date: 2023-07-01T15:59:00+08:00
* 克服了多对一模型的并发度不高的缺点
* 克服了一对一模型的一个用户进程占用太多内核线程而开销打的缺点
![](../../images/408/《操作系统》进程与线程/muti-thread_model.jpg)
![](https://lychee.inksoul.top/uploads/original/55/1b/4301b742f9da2710e3372576f79e.webp)
## 处理机调度
@ -348,7 +348,7 @@ date: 2023-07-01T15:59:00+08:00
* 调度是多道程序OS的基础调度是OS设计的核心问题
* 层次分类模型图
![](../../images/408/《操作系统》进程与线程/调度层次分类模型图.jpg)
![](https://lychee.inksoul.top/uploads/original/73/f4/f278b5759ce6d4c59811230fec88.webp)
* 高级调度、作业调度
* 是内存与辅存的调度,从后备队列中调度作业
@ -371,7 +371,7 @@ date: 2023-07-01T15:59:00+08:00
* 调度程序结构图
![](../../images/408/《操作系统》进程与线程/调度程序结构图.jpg)
![](https://lychee.inksoul.top/uploads/original/e6/68/fbb0e00bfa16e66f382572917a19.webp)
* 调度器的组成
* 用于调度和分派CPU的组件
@ -949,16 +949,16 @@ do{
#### 安全性算法和银行家算法例题举例
![](../../images/408/《操作系统》进程与线程/安全性算法和银行家算法举例.jpg)
![](https://lychee.inksoul.top/uploads/medium/76/f2/dc5c769dc8aca10080713acbc556.webp)
安全性算法解法
![](../../images/408/《操作系统》进程与线程/安全性算法和银行家算法举例安全性算法解法.jpg)
![](https://lychee.inksoul.top/uploads/medium/d7/c7/1e7b70fe44ca83f931b64be59038.webp)
银行家算法解法
![](../../images/408/《操作系统》进程与线程/安全性算法和银行家算法举例银行家算法解法.jpg)
![](https://lychee.inksoul.top/uploads/medium2x/1b/43/50826d649f36e4e0210eb8c5c532.webp)

View File

@ -66,7 +66,7 @@ typedef struct
时间复杂度为O(mn)
![](../../images/408/《数据结构》栈、队列和数组/暴力匹配算法.jpg)
![](https://lychee.inksoul.top/uploads/medium/18/b5/f500351c7d0ba7458d819dba5da2.webp)
```c
@ -101,7 +101,7 @@ int Index_BF(string s, string t)
时间复杂度为O(m + n)
![](../../images/408/《数据结构》栈、队列和数组/模式匹配算法.jpg)
![](https://lychee.inksoul.top/uploads/medium/c0/f8/645da91bde5614ec0d33cce0ee6f.webp)
```c

View File

@ -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)}
* ![](../../images/408/《数据结构》图/无向图实例.png)
* ![](https://lychee.inksoul.top/uploads/original/77/b9/283696a390f9c052b5fa0c68faa1.webp)
### 常考结论
* 无向图边数*2 = 各顶点度数之和
@ -49,22 +48,22 @@ date: 2023-08-01T11:26:56+08:00
* 无向图
* 全部由无向边构成的图
* ![](../../images/408/《数据结构》图/无向图.png)
* ![](https://lychee.inksoul.top/uploads/original/6b/8b/7e1765ce9a59df2ebbae314d57c5.webp)
* 有向图
* 全部由有向边构成的图
* ![](../../images/408/《数据结构》图/有向图.png)
* ![](https://lychee.inksoul.top/uploads/original/66/0e/61b3ddab0122a96a925d4f46f2b0.webp)
* 简单图、多重图
* 简单图:不存在重复边,不存在顶点到自身的边
* 多重图两个顶点之间的边数大于1
* 完全图(简单完全图)
* 完全无向图:边数$\frac{n(n-1)}{2}$
* 完全有向图:边数为$n(n-1)$
* ![](../../images/408/《数据结构》图/完全无向图.png)
* ![](../../images/408/《数据结构》图/完全有向图.png)
* ![](https://lychee.inksoul.top/uploads/original/ef/f5/c44c4f84ea1bd9d8e7a9a1092626.webp)
* ![](https://lychee.inksoul.top/uploads/original/4f/04/fa6e340c91aa6e18d40e96150279.webp)
* 子图、生成子图
* G的子图所有顶点和边
* G的生成子图含有G的所有顶点
* ![](../../images/408/《数据结构》图/生成子图.png)
* ![](https://lychee.inksoul.top/uploads/original/3a/87/875dce9272a99f310ad4496e81db.webp)
* 连通、连通图、连通分量【无向图】
* V和W连通无向图中V到W的路径存在
* 连通图:图中任意两个顶点都是连通的
@ -79,15 +78,15 @@ date: 2023-08-01T11:26:56+08:00
* 出度:从该顶点出去的边的数目
* 顶点的度 = 出度 + 入度
* 对于具有n个顶点e条边的有向图出度和 = 入度和 = e对于具有n个顶点e条边的无向图度和 = 2e
* ![](../../images/408/《数据结构》图/顶点的度.png)
* ![](https://lychee.inksoul.top/uploads/original/8d/77/25346c33c718549c7a308f13bb44.webp)
* 边的权和网
* 权Weight:边上的数值
* 网Network边上标识权的图
* ![](../../images/408/《数据结构》图/边的权和网.png)
* ![](https://lychee.inksoul.top/uploads/original/15/9f/e06ebcd1e871f4968b873fac60c6.webp)
* 稠密图,稀疏图
* 稠密图:边多
* 稀疏图:边少
* ![](../../images/408/《数据结构》图/稠密图.png)
* ![](https://lychee.inksoul.top/uploads/original/4f/39/00f7bb124924ea56a50451281312.webp)
* 路径、路径长度和回路
* 路径Path在一个图中路径是从顶点u到顶点v所经过的顶点序列
* 路径长度:该路径上边的数目
@ -113,7 +112,7 @@ date: 2023-08-01T11:26:56+08:00
* 用两个数组来表示图
* 一个一位数组存储图中顶点信息
* 一个二维数组存储图中的边或弧的信息
* ![](../../images/408/《数据结构》图/邻接矩阵.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/08/22/e84787d27169f0eff573258b36fa.webp)
* 邻接表
* 邻接表是由两部分组成
* 顶点用一个一维数组存储
@ -121,17 +120,17 @@ date: 2023-08-01T11:26:56+08:00
* 由于邻接点的个数不定,所以用单链表存储
* 无向图称为顶点Vi的边表
* 有向图则称为顶点Vi作为弧边的出边表
* ![](../../images/408/《数据结构》图/邻接表.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/0b/54/6df8e89c0870597808a455927803.webp)
* 十字链表【针对有向图】
* 把邻接表和逆邻接表整合在了一起
* 既容易找到以Vi为尾的弧也容易找到以Vi为头的弧
* 容易求得顶点的出度和入度
* 创建图算法的时间复杂度和邻接表相同
* ![](../../images/408/《数据结构》图/十字链表.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/b8/67/d55424e7749adb7a853423e70cc0.webp)
* 邻接多重表【针对无向图】
* 仿照十字链表的方式,对边表结点的结构进行一些改造
* 同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点
* ![](../../images/408/《数据结构》图/邻接多重表.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/21/39/9402e8d84fa1f436e980c10bbf30.webp)
### 图的基本操作
@ -163,11 +162,11 @@ date: 2023-08-01T11:26:56+08:00
* 最好情况O(1)
* 最坏情况O(n)
* 遍历过程
* ![](../../images/408/《数据结构》图/DFS遍历过程.jpg)
* ![](https://lychee.inksoul.top/uploads/original/a7/a3/616882c6e2d97d797a6418daa51b.webp)
* 生成树
* ![](../../images/408/《数据结构》图/DFS生成树.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/52/15/76241f6590ff16ca7d460cc56719.webp)
* 生成森林
* ![](../../images/408/《数据结构》图/DFS生成森林.jpg)
* ![](https://lychee.inksoul.top/uploads/original/42/f7/ad6128ac9bc4b166de89e8eadeb5.webp)
### 广度优先搜索BFS
@ -180,11 +179,11 @@ date: 2023-08-01T11:26:56+08:00
* 空间复杂度
* O(n)
* 遍历过程
* ![](../../images/408/《数据结构》图/BFS遍历过程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/88/d6/3165fb392db9222ddcf2a851a833.webp)
* 生成树
* ![](../../images/408/《数据结构》图/BFS生成树.jpg)
* ![](https://lychee.inksoul.top/uploads/original/70/3e/5b9f3e24824154384e2aaec1cea4.webp)
* 生成森林
* ![](../../images/408/《数据结构》图/BFS生成森林.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/aa/64/09d3d114c24f1bd10556b4e5f096.webp)
### 遍历次数
@ -217,34 +216,34 @@ date: 2023-08-01T11:26:56+08:00
* 算法1Prim算法
* 类似于寻找图的最短路径的Dijkstra算法【以自我为中心】
* 当带权连通图的任意一个环中所包含的边权值不同时,最小生成树是唯一的
* ![](../../images/408/《数据结构》图/Prim算法.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/69/d4/8ed8e09ec6926743c503e5824eab.webp)
* 算法2Kruskal算法
* 按权值的递增次序选择合适的边来构造最小生成树【不以自我为中心】
* ![](../../images/408/《数据结构》图/Kruskal算法.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/5f/8a/72eaae800232716c687e79b68fbb.webp)
### 最短路径
* BFS
* 求无权图的单源最短路径问题
* ![](../../images/408/《数据结构》图/求无权图的单源最短路径问题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/57/c9/73c810c4f3175ae2fa5d11b7aa3f.webp)
* Dijkstra
* 求有向图的单源最短路径问题
* ![](../../images/408/《数据结构》图/求有向图的单源最短路径问题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/f5/aa/eb516c0e8598b7092aea72984680.webp)
* Floyd算法
* 求任意两顶点的最短路径
* ![](../../images/408/《数据结构》图/求任意两顶点间的最短路径.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/4c/31/238fce29679f324dd7437d332bfc.webp)
### 有向无环图描述表达式
* 有向无环图定义
* 若一个有向图中不存在环则称为有向无环图简称DAG图
* 利用有向无环图描述表达式【顶点中不能出现重复操作数】
* ![](../../images/408/《数据结构》图/利用有向无环图描述表达式.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/22/61/41fba34d2216231ea63fa3a44d89.webp)
### 拓扑排序优先入度为0
* 核心算法
* ![](../../images/408/《数据结构》图/拓扑排序.jpg)
* ![](https://lychee.inksoul.top/uploads/original/73/d0/4dd761f97a5933755b0e6457afec.webp)
* 时间复杂度
* 采用邻接矩阵存储,时间复杂度为$O(|V|^2)$
* 采用邻接表存储时间复杂度为O(|V|+|E|)
@ -252,7 +251,7 @@ date: 2023-08-01T11:26:56+08:00
### 逆拓扑排序优先出度为0
* 核心算法
* ![](../../images/408/《数据结构》图/逆拓扑排序.jpg)
* ![](https://lychee.inksoul.top/uploads/original/a5/8f/e41d4fa8dc4b3a4adc166d15bcad.webp)
### 关键路径
@ -264,10 +263,10 @@ date: 2023-08-01T11:26:56+08:00
* 有多条关键路径的时候,减少关键活动的时间不一定会缩短工程的工期
* 求关键路径的快速方法:找起点到终点的最长路径
* AOE网
* ![](../../images/408/《数据结构》图/AOE网.jpg)
* ![](https://lychee.inksoul.top/uploads/original/68/bd/0bc4e7c1cf02bb82afe47aa82b2a.webp)
* 计算过程
![](../../images/408/《数据结构》图/计算过程.jpg)
![](https://lychee.inksoul.top/uploads/original/a2/12/0fe30c94b2e605792005f105d378.webp)
1. 求所有事件的最早发生事件Ve()

View File

@ -4,7 +4,7 @@ date: 2023-08-03T19:21:43+08:00
---
![](../../images/408/《数据结构》大题/大题1.jpg)
![](https://lychee.inksoul.top/uploads/original/0f/a6/5c2c2be56ba35074ec35e9f1e910.webp)
1
@ -12,7 +12,7 @@ date: 2023-08-03T19:21:43+08:00
2
![](../../images/408/《数据结构》大题/大题1图1.png)
![](https://lychee.inksoul.top/uploads/original/55/73/2c1a3a2102f46457b32ea7522f41.webp)
front为队首指针rear为队尾指针
@ -26,7 +26,7 @@ frontrear均指向空闲结点
3
![](../../images/408/《数据结构》大题/大题1图2.png)
![](https://lychee.inksoul.top/uploads/original/0f/fe/54022ec9a15f65bffd26fc9832af.webp)
4
@ -53,7 +53,7 @@ front = front -> next;
---
![](../../images/408/《数据结构》大题/大题2.jpg)
![](https://lychee.inksoul.top/uploads/original/c8/ed/783b99dace3f08544cfbda5e9499.webp)
1
@ -80,7 +80,7 @@ $01011010\cdots$
---
![](../../images/408/《数据结构》大题/大题3.jpg)
![](https://lychee.inksoul.top/uploads/original/4e/9b/a33f6529a002a422fd84f90d94f4.webp)
1
@ -101,7 +101,7 @@ $01011010\cdots$
---
![](../../images/408/《数据结构》大题/大题4.jpg)
![](https://lychee.inksoul.top/uploads/medium/41/56/06759881b450f2b119712a9d3a93.webp)
1
@ -124,7 +124,7 @@ $01011010\cdots$
---
![](../../images/408/《数据结构》大题/大题5.jpg)
![](https://lychee.inksoul.top/uploads/original/36/38/3eabd76e81f215b28a09c7e33b73.webp)
2
@ -137,7 +137,7 @@ $01011010\cdots$
---
![](../../images/408/《数据结构》大题/大题6.jpg)
![](https://lychee.inksoul.top/uploads/original/2b/ce/02c26da04e858259100b90a0f131.webp)
1
@ -184,7 +184,7 @@ $$
---
![](../../images/408/《数据结构》大题/大题7.jpg)
![](https://lychee.inksoul.top/uploads/original/1f/38/14a70faa16bf16537045584e6d12.webp)
1
@ -261,7 +261,7 @@ typedef struct hNode
(3)
![](../../images/408/《数据结构》大题/大题7图1.jpg)
![](https://lychee.inksoul.top/uploads/original/2d/14/48cc62c6082fde50901c1fc2eb05.webp)
|目的网络|路径|代价|
|:---:|:---:|:---:|
@ -273,7 +273,7 @@ typedef struct hNode
---
![](../../images/408/《数据结构》大题/大题8.jpg)
![](https://lychee.inksoul.top/uploads/original/bc/48/ed7f65b184de1b65e9f97a1c9ef0.webp)
不一定能求得最短路径
@ -283,7 +283,7 @@ typedef struct hNode
---
![](../../images/408/《数据结构》大题/大题9.jpg)
![](https://lychee.inksoul.top/uploads/original/06/c8/a3d7a41c55e71530e2d1e76ef94f.webp)
1
@ -300,7 +300,7 @@ $$
2
![](../../images/408/《数据结构》大题/大题9图1.png)
![](https://lychee.inksoul.top/uploads/original/68/e7/3c650de926eeb42589fbe667450a.webp)
3
@ -311,7 +311,7 @@ $$
---
![](../../images/408/《数据结构》大题/大题10.jpg)
![](https://lychee.inksoul.top/uploads/medium/80/a4/8d293a584a291378e1b43bef3be3.webp)
总费用均为16
@ -330,7 +330,7 @@ TTL = 5=>IP分组的最大传递距离 = 5
---
![](../../images/408/《数据结构》大题/大题11.jpg)
![](https://lychee.inksoul.top/uploads/original/09/bf/04d26ad3c3821e12fe79987babb9.webp)
1
@ -381,7 +381,7 @@ $ASL_{失败} = \frac{3+2+1+2+1+5+4}{7} = \frac{18}{7}$
---
![](../../images/408/《数据结构》大题/大题12.jpg)
![](https://lychee.inksoul.top/uploads/original/49/46/73af136cfe355173414bf9ab1549.webp)
1
@ -409,7 +409,7 @@ $ASL=0.15\times1 + 0.35\times2 + 0.35\times2 + 0.15\times3 = 2.0$
---
![](../../images/408/《数据结构》大题/大题13.jpg)
![](https://lychee.inksoul.top/uploads/original/df/08/dbf667549d533781bf390ad24b4a.webp)
1

View File

@ -16,7 +16,7 @@ date: 2023-08-02T21:25:52+08:00
* 稳定性
* 稳定
* 例图
* ![](../../images/408/《数据结构》排序/直接插入排序.png)
* ![](https://lychee.inksoul.top/uploads/medium/b1/02/fcc30a48182ba9b9a6f09104b11a.webp)
* 代码
```c
@ -48,7 +48,7 @@ void insertion_sort(int arr[],int len)
* 常考点
* 计算希尔排序的增量大小
* 例图
* ![](../../images/408/《数据结构》排序/希尔排序.png)
* ![](https://lychee.inksoul.top/uploads/medium/2c/66/f4299334fdee0cb73dfa03ee49da.webp)
* 代码
```c
@ -104,7 +104,7 @@ void shell_sort(int arr[],int len)
* 元素从小到大时 = 最坏情况比较次数 = $\frac{n\times(n-1)}{2}$
* 元素从小到大时 = 最好情况比较次数 = n-1
* 例图
* ![](../../images/408/《数据结构》排序/冒泡排序.png)
* ![](https://lychee.inksoul.top/uploads/original/ea/2d/4e67479ef086f0bd9793377364e2.webp)
代码
@ -161,10 +161,10 @@ int main()
* 最小递归深度 = 枢纽值每次都是子表的最大值或最小值 = 单链表 = 树高为n
* 例图
* 三位取中【通常取最左边的元素为枢纽值】
* ![](../../images/408/《数据结构》排序/三位取中.png)
* ![](https://lychee.inksoul.top/uploads/original/06/0c/9a32cd20a3bc619f77d55c130fef.webp)
* 根据枢纽值进行分割【通常先从右到左交换比枢纽值小的,再从左到右交换比枢纽值大的
* ![](../../images/408/《数据结构》排序/根据枢纽值进行分割1.png)
* ![](../../images/408/《数据结构》排序/根据枢纽值进行分割2.png)
* ![](https://lychee.inksoul.top/uploads/medium/0d/ff/285a7cae710440f3f8d349f8f724.webp)
* ![](https://lychee.inksoul.top/uploads/original/76/dc/333065784345f9547c5a630cb51f.webp)
* 代码
```c
@ -212,7 +212,7 @@ void Qsort(int A[],L,R)//a数组保存数据L和R是边界
* 常考点
* 比较次数数量级与序列初始状态无关
* 例图
* ![](../../images/408/《数据结构》排序/简单选择排序.jpg)
* ![](https://lychee.inksoul.top/uploads/original/41/65/cbb276279f127a0317504d7e5aff.webp)
* 代码
```c
@ -310,15 +310,15 @@ void heapSort(int A[],int n)
### 建堆过程
![](../../images/408/《数据结构》排序/掌握建堆的过程.jpg)
![](https://lychee.inksoul.top/uploads/medium/6d/9a/ce72c8eef75846451d074277bde3.webp)
### 掌握堆增加一个元素的过程
### 堆增加一个元素的过程
![](../../images/408/《数据结构》排序/掌握堆增加一个元素的过程.jpg)
![](https://lychee.inksoul.top/uploads/medium/83/30/4955cd60251cbb88ea3df48217c5.webp)
### 掌握大顶堆和小顶堆的概念
![](../../images/408/《数据结构》排序/掌握大顶堆和小顶堆的概念.jpg)
![](https://lychee.inksoul.top/uploads/medium/c2/12/d14667418b386b3292d187c8d9ee.webp)
## 归并排序和基数排序
@ -340,7 +340,7 @@ void heapSort(int A[],int n)
* 比较次数数量级与序列初始状态无关
* 对于N个元素进行k路归并排序的趟数满足$k^m = N$
* 例图
* ![](../../images/408/《数据结构》排序/归并排序.png)
* ![](https://lychee.inksoul.top/uploads/medium/61/0b/034ee4f6564660e05184f9958f35.webp)
* 代码
```c
@ -404,7 +404,7 @@ void mergeSort(vector<int>& arr,int l,int r)
* MSD是最高位优先LSD是最低位优先
* 基数排序不能对float和double类型的实数进行排序
* 例题
* ![](../../images/408/《数据结构》排序/基数排序.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/1e/37/86dc8105114e46b9bad7fbed5c8b.webp)
* 代码
```c
@ -488,7 +488,7 @@ void radixSort(int data[],int n)
* 将整个文件等分为10个临时文件每个文件有1000个记录
* 然后将这10个文件依次进入内存采取适当的内存排序算法对其中的记录进行排序将得到的有序文件初始归并段移至内存
* 对得到的10个初始归并段进行如图的两两归并直到得到一个完整的有序文件
* ![](../../images/408/《数据结构》排序/外部排序举例.png)
* ![](https://lychee.inksoul.top/uploads/original/3f/ad/b87c271d2c291da5e39dfba85a75.webp)
* 如图有10个初始归并段到一个有序文件共进行了4次归并每次都由m个归并段得到[m/2]个归并段这种归并方式被称为2-路平衡归并
* 效率分析
* 影响整体排序效率的因素主要取决于读写外存的次数,即访问外存的次数越多,算法花费的时间越多,效率就越低

View File

@ -72,7 +72,7 @@ int Search.Seq(SSTable ST,ElemType key){
查找判定树
![](../../images/408/《数据结构》查找/顺序查找的优化.jpg)
![](https://lychee.inksoul.top/uploads/original/6a/fb/77ca033e6fa21a74e72894e180a9.webp)
性质:
@ -119,7 +119,7 @@ int Binary_Search(SSTable L,ElemType ket){
### 查找效率分析
![](../../images/408/《数据结构》查找/查找效率分析.jpg)
![](https://lychee.inksoul.top/uploads/original/59/d5/64fb4d2d77d60268a6ee80da8b24.webp)
$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
* 折半查找判定树可以用二叉排序树来判别,其中序序列是一个有序序列
* 还有可能要判断取整方向是否一致
* ![](../../images/408/《数据结构》查找/折半查找判定树.jpeg)
* ![](https://lychee.inksoul.top/uploads/original/b7/1e/00c04636e392bd5a5bf9b6cb797f.webp)
### 常考结论
@ -144,7 +144,7 @@ $ASL_{失败} = (4\cdot 3+8\cdot 4)/12 = \frac{11}{3}$(叶子结点)
### 定义
![](../../images/408/《数据结构》查找/分块查找.jpg)
![](https://lychee.inksoul.top/uploads/original/3f/91/f7f27551e5adb0b088d5b2fc20ba.webp)
```c
//索引表
@ -158,7 +158,7 @@ ElemType List[100];
### 效率分析
![](../../images/408/《数据结构》查找/效率分析.jpg)
![](https://lychee.inksoul.top/uploads/original/f1/fe/4b844745aae42046059548a534d5.webp)
设长度为n的查找表被均匀低分为6块每个块包含s个元素
@ -212,7 +212,7 @@ $ASL = [\log_2(b+1)]+\frac{s+1}{2}$
#### 查找
![](../../images/408/《数据结构》查找/BST查找.png)
![](https://lychee.inksoul.top/uploads/original/6f/f5/fc3575e26a663e7db33af5d7feb4.webp)
```c
typedef Struct BSTNode{
@ -251,7 +251,7 @@ BSTNode *BSTSearch(BSTTree T,int key){
#### 插入
![](../../images/408/《数据结构》查找/BST插入.jpg.png)
![](https://lychee.inksoul.top/uploads/original/5a/15/7635dbb009a75feae70bc2785eee.webp)
```c
//在二叉排序树中插入关键字为key的新结点递归
@ -276,7 +276,7 @@ int BST_Insert(BSTTree &T,int k){
按{50,66,60,26,21,30,70,68}建立BST
![](../../images/408/《数据结构》查找/BST构造.png)
![](https://lychee.inksoul.top/uploads/original/71/0e/e707bc9c6cd61ca9b40dc5bbf653.webp)
```c
//按照str[]中的关键字序列建立二叉排序树
@ -292,18 +292,18 @@ void Create_BST(BSTTree &T,int str[],int n){
#### 删除
![](../../images/408/《数据结构》查找/BST删除.png)
![](https://lychee.inksoul.top/uploads/medium/58/e9/3bf53790cbc080ce876605b49b6e.webp)
#### 查找效率分析
![](../../images/408/《数据结构》查找/BST效率分析1.png)
![](https://lychee.inksoul.top/uploads/original/72/82/e0d94f12dfe68feee9006862b00a.webp)
$ASL_{成功} = \frac{(1\times1 + 2\times2 + 3\times4 +4\times1)}{8} = \frac{21}{8}$
$ASL_{失败} = \frac{(3\times7+2\times4)}{9} = \frac{29}{9}$
![](../../images/408/《数据结构》查找/BST效率分析2.png)
![](https://lychee.inksoul.top/uploads/original/5a/06/6b8b38bf1f02dbc4a3a32591ab94.webp)
$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
#### 调整最小平衡子树
![](../../images/408/《数据结构》查找/调整最小不平衡子树.jpg)
![](https://lychee.inksoul.top/uploads/medium2x/34/15/1304aa2f6bc9eecebc2cbd99e414.webp)
#### 平衡二叉树生成案例
{15,3,7,10,9,8}生成平衡二叉树的过程
![](../../images/408/《数据结构》查找/平衡二叉树生成例子.png)
![](https://lychee.inksoul.top/uploads/original/30/ce/dcffccf906a5538b2503db0619dc.webp)
#### 平衡二叉树的查找
@ -335,7 +335,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
#### 平衡二叉树的删除
![](../../images/408/《数据结构》查找/BST删除.png)
![](https://lychee.inksoul.top/uploads/medium/58/e9/3bf53790cbc080ce876605b49b6e.webp)
1. 删除结点(二叉排序树)
2. 向上寻找最小不平衡子树
@ -343,9 +343,9 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
4. 依孙子位置调节平衡(LL/RR/LR/RL)
5. 调整后不平衡向上传导,重复第二步
![](../../images/408/《数据结构》查找/平衡二叉树生成例题1.jpg)
![](https://lychee.inksoul.top/uploads/medium/77/c0/58231d773d2a56fb7426ab7a3565.webp)
![](../../images/408/《数据结构》查找/平衡二叉树生成例题2.jpg)
![](https://lychee.inksoul.top/uploads/medium/da/26/1c3d127702df22ab7aaede914538.webp)
### 红黑树
@ -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}
![](../../images/408/《数据结构》查找/红黑树.jpg)
![](https://lychee.inksoul.top/uploads/medium/a0/db/1c379d7e63ac700ea28bc6963607.webp)
## B树B-tree
@ -380,7 +380,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
* 所有叶节点都在同一层次上
* 概念图
* B树中一个节点的子节点数目的最大值用m表示假如最大值为4则为4阶
* ![](../../images/408/《数据结构》查找/B树概念图.png)
* ![](https://lychee.inksoul.top/uploads/original/36/af/8d729c22e1057f85aeca8d356a8c.webp)
## B+树
@ -391,7 +391,7 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
* 叶子结点本身依关键字的大小自小而大的顺序链接
* 所有的非终端节点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字
* 概念图
* ![](../../images/408/《数据结构》查找/B+树概念图.png)
* ![](https://lychee.inksoul.top/uploads/medium/ef/c7/29bd05654427328e90b88701dd81.webp)
* B树和B+树的对比
||m阶B树|m阶B+树|
@ -437,12 +437,12 @@ $n_0 = 0,n_1 = 1,n_2 = 2,n_3 = 4$
* 一旦产生了冲突,就按某种规则去寻找另一空地址
* 发生聚集的原因主要是解决冲突的方法选择不当
* 线性探测
* ![](../../images/408/《数据结构》查找/线性探测.png)
* ![](../../images/408/《数据结构》查找/散列表查找性能分析.png)
* ![](https://lychee.inksoul.top/uploads/original/13/21/fa10dfcec15e9bcadba17a6ee487.webp)
* ![](https://lychee.inksoul.top/uploads/original/bb/93/711a5c3ea743c2d3ad6a5583847a.webp)
* 平方探测
* ![](../../images/408/《数据结构》查找/平方探测.png)
* ![](https://lychee.inksoul.top/uploads/original/05/e6/cdcea9aad80962426f9f27c210dc.webp)
* 有定理显示如果散列表长度TableSize是某个4k+3(k是正整数)形式的素数时,平方探测就可以探查到整个散列表空间
* 链地址法
* 将相应位置上冲突的所有关键词存储在同一单链表中
* ![](../../images/408/《数据结构》查找/链地址法.png)
* ![](https://lychee.inksoul.top/uploads/original/b3/e9/60062f095c80bae66165ff02449e.webp)

View File

@ -129,7 +129,7 @@ bool GetTop(SqStack S,ElemType x)
* 利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间
* 将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
* 特点
* ![](../../images/408/《数据结构》栈、队列和数组/共享栈特点.jpg)
* ![](https://lychee.inksoul.top/uploads/original/21/84/4019169d03f65b6dcead496028bf.webp)
* 目的
* 更有效地利用存储空间
* 两个栈的空间相互调节,只有在整个存储空间都被占满时才发生上溢
@ -180,13 +180,13 @@ typedef struct Linknode
后缀表达式和正常表达式的相互转换
![](../../images/408/《数据结构》栈、队列和数组/后缀表达式和正常表达式的相互转换.jpg)
![](https://lychee.inksoul.top/uploads/medium/6e/d8/a5d11c72762137d57d26730d7fc1.webp)
---
中缀到后缀表达式转换的过程
![](../../images/408/《数据结构》栈、队列和数组/中缀到后缀表达式转换的过程.jpg)
![](https://lychee.inksoul.top/uploads/medium/7a/b6/dd98458478aa785b79610bbd0e3a.webp)
#### 递归
@ -219,7 +219,7 @@ typedef struct Linknode
##### 顺序队列的实现
![](../../images/408/《数据结构》栈、队列和数组/顺序队列的实现.jpg)
![](https://lychee.inksoul.top/uploads/original/9a/9a/975843b998eab5bc7b4455e5a05e.webp)
```c
@ -244,7 +244,7 @@ typedef struct
##### 循环队列的实现
![](../../images/408/《数据结构》栈、队列和数组/循环队列的实现.jpg)
![](https://lychee.inksoul.top/uploads/medium/16/b5/1d5351019ea1fc9ad5717ab3ddab.webp)
##### 区分循环队列队空还是队满
@ -439,12 +439,10 @@ bool DeEmpty(LinkQueue &Q,ElemType &x)
### 队列的应用
#### 层遍历
#### 层遍历
使用队列是为了保存下一步的处理顺序
![](../../images/408/《计网》应用层/层次域名空间.png)
#### 计算机系统中的应用
* 解决主机与外部设备之间速度不匹配的问题

View File

@ -16,7 +16,7 @@ date: 2023-07-31T14:08:42+08:00
* 每一个非根节点有且只有一个父节点
* 除了根节点外,每个子节点可以分为多个不相交的子树
* 结构图
* ![](../../images/408/《数据结构》树与二叉树/树的定义.jpg)
* ![](https://lychee.inksoul.top/uploads/original/88/84/4e693e032ccf0406228a5740e84b.webp)
* 树的高度、深度、层
* 节点的高度 = 节点到叶子节点的最长路径
* 节点的深度 = 根节点到这个节点所经历的边的个数
@ -47,10 +47,10 @@ date: 2023-07-31T14:08:42+08:00
* 采用一组连续空间来存储每个节点
* 在每个节点中设置一个伪指针
* 尾指针指示器双亲节点在数组中的位置
* ![](../../images/408/《数据结构》树与二叉树/双亲表示法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/69/ce/bea153fece732ece822e3d219e5c.webp)
* 孩子表示法
* 将每个节点的孩子节点用单链表连接
* ![](../../images/408/《数据结构》树与二叉树/孩子表示法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/c3/6e/2a3fbd85f8c9689a1dd2ea811cb4.webp)
* 孩子兄弟表示法
* 又叫二叉树表示法
* 以二叉链表作为树的存储结构
@ -58,7 +58,7 @@ date: 2023-07-31T14:08:42+08:00
* 孩子节点
* 数据
* 兄弟节点
* ![](../../images/408/《数据结构》树与二叉树/孩子兄弟表示法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e3/ad/d0fc5e3cd2ace3ba230d15d50393.webp)
### 树林和二叉树的转换
@ -66,12 +66,12 @@ date: 2023-07-31T14:08:42+08:00
* 在兄弟节点之间加一连线
* 对每个节点,只保留它与第一个孩子的连线
* 以树根为轴心顺时针旋转45度
* ![](../../images/408/《数据结构》树与二叉树/树与二叉树.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/0d/ee/3b21614c120705475c23a44cd731.webp)
* 树、树林与二叉树
* 将森林中的每棵树转换成相应的二叉树
* 每棵树的根也可以视为兄弟关系,在每棵树之间加一根连线
* 以第一棵树的根为轴心旋转45
* ![](../../images/408/《数据结构》树与二叉树/树,树林与二叉树.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e1/3a/cc44e46f435034b17ca1132c47e6.webp)
### 树和森林的遍历对应关系
@ -91,7 +91,7 @@ date: 2023-07-31T14:08:42+08:00
* 二叉树可以是空集
* 根可以有空的左子树或右子树
* 左、右子树皆为空
* ![](../../images/408/《数据结构》树与二叉树/二叉树的定义.jpg)
* ![](https://lychee.inksoul.top/uploads/original/ba/93/c7a691a7ef221ee5e8eb49ec1180.webp)
* 性质
* 二叉树第i层上的节点数目最多为$2^{i-1}$
* 深度为k的二叉树最多有$2^k-1$个节点(满二叉树)
@ -104,21 +104,21 @@ date: 2023-07-31T14:08:42+08:00
* 满二叉树
* 高度为h并且有$2^h -1$个结点的二叉树
* ![](../../images/408/《数据结构》树与二叉树/满二叉树.jpg)
* ![](https://lychee.inksoul.top/uploads/original/0e/ba/bf466277fb23d6c59e6cddb964fe.webp)
* 完全二叉树
* 叶子结点只能出现在最下层和次下层,最下层的叶子结点集中在树的左部
* 一棵满二叉树必定是一棵完全二叉树
* 完全二叉树未必是满二叉树
* 完全二叉树中度为1的节点数 = 0个或者1个
* ![](../../images/408/《数据结构》树与二叉树/完全二叉树.jpg)
* ![](https://lychee.inksoul.top/uploads/original/26/df/340425bb85ff94708f25a089ba24.webp)
* 二叉查找树
* 左子树节点比根节点值小
* 右子树节点比根节点值大
* 没有剑指相等的节点
* ![](../../images/408/《数据结构》树与二叉树/二叉查找树.jpg)
* 左右子树页分别为二叉查找树
* ![](https://lychee.inksoul.top/uploads/original/a4/bf/c4b66ba00d38b9ef66e3bdc96b7c.webp)
* 平衡二叉树
* 树上任一结点的左子树和右子树的深度值差不超过1
* ![](../../images/408/《数据结构》树与二叉树/平衡二叉树.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/30/f1/e2ab79c78644f72386e4dd08f223.webp)
### 二叉树的存储结构
@ -136,7 +136,7 @@ date: 2023-07-31T14:08:42+08:00
* 完全二叉树
* 满二叉树
* 结构图
* ![](../../images/408/《数据结构》树与二叉树/顺序存储结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/fb/e8/c6b21fa396cec3e09719b1b80894.webp)
* 链式存储结构
* 定义
* 只要知道根节点,就可以通过左右子节点的指针把整棵二叉树串起来
@ -148,7 +148,7 @@ date: 2023-07-31T14:08:42+08:00
* 适用于
* 二叉树
* 结构图
* ![](../../images/408/《数据结构》树与二叉树/链式存储结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/49/e4/b464d3916110bc449d0320435ca1.webp)
## 二叉树的实现
@ -172,7 +172,7 @@ struct TreeNode
根节点->左节点->右节点
![](../../images/408/《数据结构》树与二叉树/前序.jpg)
![](https://lychee.inksoul.top/uploads/original/a9/16/bd301c821224c25867d4943a6360.webp)
递归代码
@ -219,7 +219,7 @@ void PreOrderTraversal(BinTree BT)
左节点->根节点->右节点
![](../../images/408/《数据结构》树与二叉树/中序.jpg)
![](https://lychee.inksoul.top/uploads/original/9a/b4/c41371da1fce66bfcde980c09970.webp)
递归代码
@ -269,7 +269,7 @@ void InOrderTraversal(BinTree BT)
左节点->右节点->根节点
![](../../images/408/《数据结构》树与二叉树/后序.jpg)
![](https://lychee.inksoul.top/uploads/original/af/f5/891ccc67009a6a8cdd02caa6ab48.webp)
递归方式
@ -350,7 +350,7 @@ void LevelOrderTraversal(BinTree BT)
#### 三种遍历示例
![](../../images/408/《数据结构》树与二叉树/三种遍历实例.jpg)
![](https://lychee.inksoul.top/uploads/original/45/68/04be9ea2280cd71d4fc4d83b3de8.webp)
(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的祖先
* 根据两个序列确定二叉树的方法
* ![](../../images/408/《数据结构》树与二叉树/例题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/18/95/477d72bbb91fc63ec3de6f044673.webp)
### 线索二叉树
@ -395,7 +395,7 @@ void LevelOrderTraversal(BinTree BT)
2. 节点右子节点为空的指针域指向它的后继节点
3. 节点左子节点为空的指针域指向它的前驱节点
![](../../images/408/《数据结构》树与二叉树/中序遍历.png)
![](https://lychee.inksoul.top/uploads/original/b1/b9/460dbe13a61e073457079a07f73c.webp)
## 树和二叉树的应用
@ -413,7 +413,7 @@ void LevelOrderTraversal(BinTree BT)
* 构造
* 每次把队列中值最小的合并,合并后的值加入队列中再继续比较
* 例题
* ![](../../images/408/《数据结构》树与二叉树/哈夫曼树例题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/53/cd/9fb7bcaf2a7bf6a97f0bd5228325.webp)
### 哈夫曼编码
@ -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空间
![](../../images/408/《数据结构》树与二叉树/哈夫曼树.jpg)
![](https://lychee.inksoul.top/uploads/original/e9/32/fd3d40ca4f7f068207be6b0fed5a.webp)
![](../../images/408/《数据结构》树与二叉树/对应的哈夫曼编码.jpg)
![](https://lychee.inksoul.top/uploads/original/bc/57/95a890b5003e0144734dac9fd605.webp)
最终编码表
@ -444,7 +444,7 @@ void LevelOrderTraversal(BinTree BT)
* 并查集是一种简单的集合表示支持3种操作
* 并查集的存储结构是双亲表示法存储的树,主要是为了方便两个主要的操作
* 例题
* ![](../../images/408/《数据结构》树与二叉树/并查集例题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/5f/8f/00eaa07d3886d137f10b4463dc7d.webp)
#### 并查集操作
@ -461,7 +461,7 @@ void Initial(int S[])
```
![](../../images/408/《数据结构》树与二叉树/并查集初始化.jpg)
![](https://lychee.inksoul.top/uploads/original/b5/6a/06925a22f7f1ed3f9f7e89e95dc4.webp)
##### Union(S,Root1,Root2)
@ -476,7 +476,7 @@ void Union(int S[],int Root1,int Root2)
```
![](../../images/408/《数据结构》树与二叉树/并查集表示方法.jpg)
![](https://lychee.inksoul.top/uploads/original/40/71/d80b17f82c702036bd674d8d08c7.webp)
##### Find(S,x)
@ -491,4 +491,4 @@ int Find(int S[],int x)
}
```
![](../../images/408/《数据结构》树与二叉树/用树表示并查集.jpg)
![](https://lychee.inksoul.top/uploads/original/80/2c/5392c8def7250529f38325db1581.webp)

View File

@ -104,7 +104,7 @@ date: 2023-07-20T09:56:49+08:00
### 控制器结构和功能
* 结构
* ![](../../images/408/《计组》中央处理器/控制器结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e2/29/0047ac3cdf7f6e9e1b8f83e3f2c5.webp)
* 连接关系
* 运算器
* 运算器部件通过数据总线与内存储器、输入设备和输出设备传送数据
@ -134,7 +134,7 @@ date: 2023-07-20T09:56:49+08:00
* 时序系统产生的机器周期信号和节拍信号
* 来自执行单元的反馈信号,即标志
* 微操作控制信号的形成主要与指令译码信号和时钟信号有关
* ![](../../images/408/《计组》中央处理器/带指令译码器和节拍输入的控制单元.jpg)
* ![](https://lychee.inksoul.top/uploads/original/ec/1e/29de8afec66c9c964b7562f59ed7.webp)
* 时序系统及微操作
* 时钟周期:用时钟信号控制节拍发生器,可产生节拍,每个节拍的宽度正好对应一个时钟周期
* 机器周期:视为所有指令执行过程中的一个基准时间
@ -215,7 +215,7 @@ date: 2023-07-20T09:56:49+08:00
* 用于产生初始微地址和后继微地址,以保证微指令的连续执行
* 微地址寄存器
* 接收微地址形成部件送来的微地址为在CM中读取微指令做准备
* ![](../../images/408/《计组》中央处理器/微程序控制器结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/06/5b/a200b1e6727af3f3fe896c15be1d.webp)
* 工作过程
* 执行取微指令公共操作
* 由机器指令的操作码字段通过微地址形成部件产生该及其指令所对应的微程序的入口地址并送入CMAR
@ -356,7 +356,7 @@ date: 2023-07-20T09:56:49+08:00
* 主存$\rightarrow$数据总线MDR$\rightarrow$IR存放指令
* CU发出控制信号$\rightarrow$PC内容加1
* 流程图
* ![](../../images/408/《计组》中央处理器/取指周期的数据流.jpg)
* ![](https://lychee.inksoul.top/uploads/original/b0/e6/709eb07d5caa687b6db89400771a.webp)
* 间址周期
* 取操作数的有效地址
* 数据流向
@ -366,7 +366,7 @@ date: 2023-07-20T09:56:49+08:00
* 主存$\rightarrow$数据总线$\rightarrow$MDR存放有限地址
* AdIR表示取出IR中存放点饿指令字的地址字段
* 流程图
* ![](../../images/408/《计组》中央处理器/一次间址周期的数据流.png)
* ![](https://lychee.inksoul.top/uploads/original/26/69/42d67ce529c586442840d57790a9.webp)
* 执行周期
* 取操作数并根据IR中的指令字的操作码通过ALU操作产生执行结果
* 无统一的数据流向
@ -379,7 +379,7 @@ date: 2023-07-20T09:56:49+08:00
* PC$\rightarrow$MDR$\rightarrow$数据总线$\rightarrow$主存(程序断电存入主存)
* CU中断服务程序的入口$\rightarrow$PC
* 流程图
* ![](../../images/408/《计组》中央处理器/中断周期的数据流.jpg)
* ![](https://lychee.inksoul.top/uploads/original/8a/12/2b8f4412214c7566634c897b2cf2.webp)
### 指令的执行方案
@ -448,13 +448,13 @@ date: 2023-07-20T09:56:49+08:00
* 性能高
* 基本不存在数据冲突
* 示例图
* ![](../../images/408/《计组》中央处理器/CPU内部总线的数据通路和控制信号.jpg)
* ![](https://lychee.inksoul.top/uploads/original/86/57/577da23cb27b797c350f427a2e52.webp)
* in表示该部件的允许输入控制信号OUT表示该部件的允许输出控制信号
* ALU只能有一个输入端与总线相连另一个输入端要通过暂存器与总线相连
### 数据传输举例
![](../../images/408/《计组》中央处理器/CPU内部总线的数据通路和控制信号.jpg)
![](https://lychee.inksoul.top/uploads/original/86/57/577da23cb27b797c350f427a2e52.webp)
* 寄存器间的数据传输
* 寄存器之间的数据传送可以通过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{指令条数}{流水线执行时间}$
* ![](../../images/408/《计组》中央处理器/流水线吞吐量计算.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/da/84/2dd85a66706b6d6d43640cd6a1f6.webp)
### 流水线的基本概念
@ -707,7 +707,7 @@ date: 2023-07-20T09:56:49+08:00
* 数据和指令在存储器中对齐存放,有利于减少访存次数,使所需数据在一个流水段内就可以从存储器中找到
* 流水线的表示方法
* 采用时空图描述流水线的执行情况
* ![](../../images/408/《计组》中央处理器/一个5段流水线数据通路.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/fa/9b/3e5b56ff0a13351f3e00e5fb2c6b.webp)
### 流水线的性能指标
@ -725,7 +725,7 @@ date: 2023-07-20T09:56:49+08:00
### 流水线的分类
* 超标量流水线技术
* ![](../../images/408/《计组》中央处理器/超标量水线技术.jpg)
* ![](https://lychee.inksoul.top/uploads/original/80/7c/e37801461f94c62dd37093265931.webp)
* 特点
* 一个时钟周期内一条流水线可执行一条以上的指令
* 不影响流水线功能段的处理时间
@ -740,7 +740,7 @@ date: 2023-07-20T09:56:49+08:00
* 静态流水线上下段连接方式固定
* 超流水线技术
* 提高主频来提高流水线性能
* ![](../../images/408/《计组》中央处理器/超流水线技术.jpg)
* ![](https://lychee.inksoul.top/uploads/original/6a/96/f83448337822648631191559018b.webp)
* 特点
* 流水线划分的段数越多,流水寄存器的开销越大
@ -752,9 +752,9 @@ date: 2023-07-20T09:56:49+08:00
* 包括数据通路上流经的部件如PCALU通用寄存器状态寄存器异常和中断处理逻辑
* 数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号
* 数据通路不包含生成控制信号的控制部件
* ![](../../images/408/《计组》中央处理器/一个5段流水线数据通路.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/fa/9b/3e5b56ff0a13351f3e00e5fb2c6b.webp)
* 流水线的控制信号
* ![](../../images/408/《计组》中央处理器/控制信号分类.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/b7/58/e746009d44edbc9820f3a1c3443b.webp)
* 流水线寄存器保存的信息
* 后续流水段要用到的所有数据信息
* 包括PC+4、指令、立即数、目的寄存器、ALU运算结果、标志信息等

View File

@ -33,7 +33,7 @@ date: 2023-07-23T11:15:49+08:00
## 历年真题
![](../../images/408/《计组》大题/历年真题1.jpg)
![](https://lychee.inksoul.top/uploads/original/7a/29/d8f56894075ce243bb9aa7ea8e9d.webp)
1
@ -63,7 +63,7 @@ CPU用于B输入输出时间 = $40000\times500 = 2\times10^7$个时钟周期
---
![](../../images/408/《计组》大题/历年真题2.jpg)
![](https://lychee.inksoul.top/uploads/original/4e/34/cb5da298695a6180b1483d960937.webp)
1
@ -87,7 +87,7 @@ CPU的时间 = $1000\times(10+20\times4) = 90000$个时钟周期
---
![](../../images/408/《计组》大题/历年真题3.jpg)
![](https://lychee.inksoul.top/uploads/original/5d/71/45abe02773839b6a7c9aa410c8df.webp)
1
@ -109,7 +109,7 @@ DMA的开销 = $1000\times500 = 0.5M$个时钟周期
## 存储系统相关
![](../../images/408/《计组》大题/存储系统1.jpg)
![](https://lychee.inksoul.top/uploads/original/41/bf/9680b76c5d024aba55906577dce6.webp)
1
@ -146,7 +146,7 @@ Cache初始为空Cache行有效位为0Cache访问缺失
---
![](../../images/408/《计组》大题/存储系统2.jpg)
![](https://lychee.inksoul.top/uploads/original/48/c2/92e1c8254ecba7da53be36d3b316.webp)
1
@ -177,7 +177,7 @@ Cache缺失的额外开销 = 平均访存次数 $\times$Cache缺失率$\times$1
---
![](../../images/408/《计组》大题/存储系统3.jpg)
![](https://lychee.inksoul.top/uploads/original/c7/4a/4033e07b038cc451a8e45e9076c4.webp)
1
@ -213,7 +213,7 @@ TLB表位数增加2位
---
![](../../images/408/《计组》大题/存储系统4.jpg)
![](https://lychee.inksoul.top/uploads/medium/8f/9a/3c5a340bcc1fcd458a7ca9e73b34.webp)
1
@ -246,7 +246,7 @@ Cache总容量 = $2^3\times2(20+1b+1b+1b+23B) = 4464b = 558B$
---
![](../../images/408/《计组》大题/存储系统5.jpg)
![](https://lychee.inksoul.top/uploads/medium/ef/c1/dd8666682e3217cde4ea7c0e323b.webp)
1
@ -293,7 +293,7 @@ TLB有2个组 = 高11位为TLB标记最低1位为TLB组号
---
![](../../images/408/《计组》大题/存储系统6.jpg)
![](https://lychee.inksoul.top/uploads/medium/5f/d8/a0e39035ff24fd4061960d3fe575.webp)
1
@ -330,7 +330,7 @@ cache组号 = 0 0000 0011 = 3
---
![](../../images/408/《计组》大题/存储系统7.jpg)
![](https://lychee.inksoul.top/uploads/medium/d3/be/2cd37fd1c733133f066a44ddc002.webp)
1
@ -368,7 +368,7 @@ a[1][1]地址 = $320+256\times4+1\times4 = 1348 = 10101000100_B$=>Cache行号为
---
![](../../images/408/《计组》大题/存储系统8.jpg)
![](https://lychee.inksoul.top/uploads/medium/bc/7b/593b3ea3468b63cf98371c037bee.webp)
1
@ -400,7 +400,7 @@ Cache有$\frac{64}{4} = 16组 $=>组号占4位
## 数据运算相关
![](../../images/408/《计组》大题/数据运算1.jpg)
![](https://lychee.inksoul.top/uploads/original/28/60/fc401fc522cd6815e196676cdf25.webp)
1
@ -431,7 +431,7 @@ $ n = 1111 0110_{[补]} = 1000 1010_{[原]} = -10$
---
![](../../images/408/《计组》大题/数据运算2.jpg)
![](https://lychee.inksoul.top/uploads/medium/a1/d9/4b811e89101396be998aa13693f0.webp)
1
@ -452,7 +452,7 @@ a最长c最短
## 指令执行相关
![](../../images/408/《计组》大题/指令执行1.jpg)
![](https://lychee.inksoul.top/uploads/medium/80/3b/1460a64b07483d2fa24a3e72f247.webp)
1
@ -483,8 +483,7 @@ f(13) > $2^{32} - 1$,发生了溢出的错误结果,可将$f_1$的返回值
---
![](../../images/408/《计组》大题/指令执行2.jpg)
![](https://lychee.inksoul.top/uploads/medium/5a/40/38d9e1688a2a07424e53ecb89ec3.webp)
1
CISCM的指令长短不一不符合RISC的指令系统的特点
@ -500,7 +499,7 @@ CISCM的指令长短不一不符合RISC的指令系统的特点
---
![](../../images/408/《计组》大题/指令执行3.jpg)
![](https://lychee.inksoul.top/uploads/original/05/37/247b27d2b5b5d97bf4c316128e25.webp)
1
@ -538,7 +537,7 @@ I、J型2^6 -1 = 63种操作
---
![](../../images/408/《计组》大题/指令执行4.jpg)
![](https://lychee.inksoul.top/uploads/medium/9c/be/ee6f324b18df0fbbeb28f1ad9432.webp)
1

View File

@ -99,7 +99,7 @@ date: 2023-07-17T20:39:45+08:00
## 多级层次的存储系统
![](../../images/408/《计组》存储系统/多级层次的存储系统.jpg)
![](https://lychee.inksoul.top/uploads/medium/54/45/706da3a0cb3cb885f67812d9c4f0.webp)
* 层次结构Cache$\rightarrow$主存层和主存$\rightarrow$辅存
* 前者解决CPU和主存速度不一致的问题
@ -124,21 +124,21 @@ date: 2023-07-17T20:39:45+08:00
* 片选线CS确定哪个存储芯片被选中可用于容量扩充
* 引脚最低数目 = 片选线(1) + 控制线(2,读RD写WR) + 数据线 + 地址线
![](../../images/408/《计组》存储系统/存储器芯片的组成.jpg)
![](https://lychee.inksoul.top/uploads/original/a7/b0/21da0b8d775c9c6bfc67f0ec73f2.webp)
* 主存储器的组成部分
* 数据线的宽度 = MDR的宽度 = 存储字长
* 地址线的宽度 = MAR的宽度 = 存储字数
* 如下图的总容量为$2^{36} \times 64位 = 2^{39}B$
![](../../images/408/《计组》存储系统/主存储器的组成部分.jpg)
![](https://lychee.inksoul.top/uploads/medium/9e/ef/bfee996f6e30bccd01fffecbfedf.webp)
### 存储体的组成元素
* 存储体 + 存储单元 + 存储元
* 总容量 = 存储字数 + 存储字长
![](../../images/408/《计组》存储系统/存储体的组成元素.jpg)
![](https://lychee.inksoul.top/uploads/medium/82/9c/9728f21d435b9938991774001cbe.webp)
### 寻址方式
@ -228,7 +228,7 @@ date: 2023-07-17T20:39:45+08:00
* 刷新时需要选中一行,即占用片选线,地址线,地址译码器
* 同理,刷新操作之间也不能够并行
![](../../images/408/《计组》存储系统/集中刷新.png)
![](https://lychee.inksoul.top/uploads/original/df/8e/ee32bab51efe790a4594520d7ce3.webp)
#### 分散刷新
@ -242,7 +242,7 @@ date: 2023-07-17T20:39:45+08:00
* 不存在停止读/写的死时间,但存取周期变长,整个系统速度都降低了
* 分散刷新的刷新周期为128us但其实无需如此频繁产生了浪费
![](../../images/408/《计组》存储系统/分散刷新.png)
![](https://lychee.inksoul.top/uploads/original/1a/18/e392a9216fe3904c819219e7b7e4.webp)
#### 异步刷新
@ -258,7 +258,7 @@ date: 2023-07-17T20:39:45+08:00
* 是存储周期加长且降低系统速度的缺点,又不会出现集中刷新的访存死区问题
* 根本上提高了整机的工作效率
![](../../images/408/《计组》存储系统/分散刷新.png)
![](https://lychee.inksoul.top/uploads/original/f9/dd/d52c2c56ac875d8677b462bef95e.webp)
### 多模块存储器
@ -284,7 +284,7 @@ date: 2023-07-17T20:39:45+08:00
* 缺点
* 各模块串行工作,存储器的带宽受到了限制,并不能提高吞吐量
* 示意图
* ![](../../images/408/《计组》存储系统/高位交叉编址(顺序方式).jpg)
* ![](https://lychee.inksoul.top/uploads/original/b4/1b/38fdaf15f70dcddb0c8e9687da30.webp)
* 低位交叉编址(交叉方式)
* 特点
* 连续地址分布在相邻的不同模块内,同一模块内的地址是不连续的
@ -301,10 +301,10 @@ date: 2023-07-17T20:39:45+08:00
* 判断发送访问冲突的规则
* 给定的访存地址在相邻的四次访问中出现在同一个存储模块中
* 示意图
* ![](../../images/408/《计组》存储系统/低位交叉编址(交叉方式).jpg)
* ![](../../images/408/《计组》存储系统/低位交叉编址流水线方式存取示意图.jpg)
* ![](https://lychee.inksoul.top/uploads/original/42/95/d2782e5174fe2cb169d06148f6e5.webp)
* ![](https://lychee.inksoul.top/uploads/original/3f/76/dbaac1858f2541ad603b0587cfce.webp)
* 计算带宽
* ![](../../images/408/《计组》存储系统/多体并行存储器-计算带宽.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/4e/52/ef9a11fe1423391dd488c925db7f.webp)
* 常考
* 模块数=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组成
* 地址线并行,数据线一一接上
* 结构图
* ![](../../images/408/《计组》存储系统/位扩展法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/50/aa/b131aa264c69e2ab33d4b8148cc9.webp)
* 字扩展法-线选法实现
* 18k * 8位的存储器 = 2片8K*8位的存储器
* 由片选信号来区分芯片的地址范围
@ -333,7 +333,7 @@ date: 2023-07-17T20:39:45+08:00
* 谁工作数据线就接送谁的数据吗即将CS设置为1
* 2位二进制时只能利用01,0
* 结构图
* ![](../../images/408/《计组》存储系统/字扩展法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/5f/97/b7f31830c11d771bc560cce983d8.webp)
* 字扩展法-译码片实现
* 有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位
* ![](../../images/408/《计组》存储系统/字扩展法【译码片实现】.jpg)
* ![](https://lychee.inksoul.top/uploads/original/fd/1e/abb85780b4abcc66ee509ebaa674.webp)
* 字位同时扩展法
* 一块芯片只有4位因此通过两片叠加实现位扩展
* 等价于实现了一个8位的存储芯片
* 在通过译码片选的方式实现字拓展
* 在不同的地址线中选择不同的芯片组合进行工作
* 结构图
* ![](../../images/408/《计组》存储系统/字位同时扩展法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/6f/1b/7c998358a5f6903329720b595797.webp)
线选法和译码片选法的比较
@ -361,7 +361,7 @@ date: 2023-07-17T20:39:45+08:00
例题:求字扩展法的地址
![](../../images/408/《计组》存储系统/求字扩展法的地址例题.jpg)
![](https://lychee.inksoul.top/uploads/medium/7a/20/653dec5f9815d11d8ff3fd1243b1.webp)
## 外部存储器
@ -379,7 +379,7 @@ date: 2023-07-17T20:39:45+08:00
* 抗震性好
* 缺点
* 易磨损
* ![](../../images/408/《计组》存储系统/SSD.jpg)
* ![](https://lychee.inksoul.top/uploads/original/1d/b6/7a7ddafff116360cb98dd0ef2ece.webp)
## 高速缓存存储器
@ -413,7 +413,7 @@ date: 2023-07-17T20:39:45+08:00
* 让Cache读取主存CPU再从Cache中读取
* CPU一边直接访问主存读取一边让Cache读取主存CPU再从Cache中读取
![](../../images/408/《计组》存储系统/Cache的读写过程.jpg)
![](https://lychee.inksoul.top/uploads/original/d8/67/584fe27f2dde3699f74376015479.webp)
### Cache的性能分析
@ -441,7 +441,7 @@ date: 2023-07-17T20:39:45+08:00
* 计算方法
* 全相联中的t,c,b,m和直接映射中的都一样
* 例图
* ![](../../images/408/《计组》存储系统/全相联映射.png)
* ![](https://lychee.inksoul.top/uploads/original/9c/c3/c3e86984778bdd8c14279b6c6e5c.webp)
* 优点
* 映射灵活
* 块冲突概率比较低
@ -456,7 +456,7 @@ date: 2023-07-17T20:39:45+08:00
* 而且相邻块之间映射的位置也是相邻的
* 因为主存的容量肯定比cache大得多其实相当于一轮轮映射过去
* 例图
* ![](../../images/408/《计组》存储系统/直接映射.png)
* ![](https://lychee.inksoul.top/uploads/original/74/44/e4c2bb22d52149dba26ff72b7302.webp)
* 计算方法
* 主存地址长度
* 主存中存储单元个数为$2^{10}$则主存地址长度就是10
@ -504,7 +504,7 @@ date: 2023-07-17T20:39:45+08:00
* 先按号分组【如8块Cache分为四组】
* 组内再任意放【组内为全相联映射】
* 例图
* ![](../../images/408/《计组》存储系统/组相联映射.png)
* ![](https://lychee.inksoul.top/uploads/original/31/5e/62f3910c4c176264d245d07ad22d.webp)
* 计算过程
* $2^c$
* Cache总块数
@ -679,18 +679,19 @@ q可以认为是Cache分为1024块每组是$2^r$ = 4块就能分$\frac{102
* 先入先出算法FIFO
* 由于最先进入的是0号cache
* 因此0号cache替换掉标记位标记为2
* ![](../../images/408/《计组》存储系统/替换算法-FIFO.jpg)
* ![](https://lychee.inksoul.top/uploads/original/5c/50/45003c6b8b7ef4e5fb6402b27481.webp)
* 近期最少使用(LRU)算法
* 从后往前,先把前面使用过的划去
* 没有被划去的意味着用的比较少
* 然后从前往后看
* 看第一块没有被划去的就决定替换它
* ![](../../images/408/《计组》存储系统/替换算法-LRU.jpg)
* ![](https://lychee.inksoul.top/uploads/original/1f/d4/bf2df1da1ddb28f1b050d9030d14.webp)
* 最不经常使用LFU算法
* 统计使用次数
* 4号块用了3次6号块用了2次
* 其他几块均用了1次需要更多判断依据
* 最终替换掉cache第2块12号
* ![](https://lychee.inksoul.top/uploads/original/2e/d0/59ae6c1ed41c366d128e7fbe8e84.webp)
### 写入/更新策略
@ -703,23 +704,23 @@ q可以认为是Cache分为1024块每组是$2^r$ = 4块就能分$\frac{102
* 在写的时候CPU将数据通过数据总线橙色箭头方向运输
* 由于CPU写给cache的速度和写入主存的速度会差很多
* 所以需要设计一个缓冲,先写入缓冲块中,再慢慢写入
* ![](../../images/408/《计组》存储系统/全写法写直达法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/58/d5/e3167652af1ad1e174980fb5002c.webp)
* 回写法
* 在CPU执行写操作时先按橙色线写入cache存储体中
* 此时并没有修改主存的内容会在cache中设计一个脏位
* 当一块中的任何一个单元被修改时脏位修改位被置1
* 需要替换掉该块时如果修改位为1则必须先把这一块写回到主存中然后才能再调入新的块
* 如果修改位为0则这一块不必写回主存只要用新调入的块覆盖这一块即可
* ![](../../images/408/《计组》存储系统/回写法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/df/b6/3096c51a6ff8495bc52a6a61f3e8.webp)
#### cache写没命中
* 写分配法
* 先将数据从内存中调入到cache中
* 再按回写法修改cache
* ![](../../images/408/《计组》存储系统/写分配法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/82/6e/76b4deb9597a3669d0a6b2c2f5e1.webp)
* 非写分配法
* 直接去内存修改
* ![](../../images/408/《计组》存储系统/非写分配法.jpg)
* ![](https://lychee.inksoul.top/uploads/original/56/66/9f9ea169effbf60ce63277406d2a.webp)
![](../../images/408/《计组》存储系统/四种方法的搭配.jpg)
![](https://lychee.inksoul.top/uploads/original/5b/56/548945b560ccee2e393ae2ccb2b6.webp)

View File

@ -81,7 +81,7 @@ date: 2023-07-22T10:06:23+08:00
* 组成
* 系统总线
* 结构图
* ![](../../images/408/《计组》总线/单总线结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/80/4f/1e5eaa91b90ebe0a0dfec34b855e.webp)
* 双总线结构
* 优点
* 将低速IO设备从单总线上分离出来
@ -91,7 +91,7 @@ date: 2023-07-22T10:06:23+08:00
* 组成
* 主存总线+IO总线
* 结构图
* ![](../../images/408/《计组》总线/双总线结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/9a/53/a29a50b370d2c2830b6b01ac354d.webp)
* 三总线结构
* 优点
* 提高了IO设备的性能
@ -102,7 +102,7 @@ date: 2023-07-22T10:06:23+08:00
* 组成
* IO总线+主存总线+DMA总线
* 结构图
* ![](../../images/408/《计组》总线/三总线结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/5e/86/53affae69346dc4dca1d7c3c4a5c.webp)
## 总线性能标准
@ -130,10 +130,10 @@ date: 2023-07-22T10:06:23+08:00
### 例题
* 计算传输数据所要的时间
* ![](../../images/408/《计组》总线/计算传输数据所要的时间.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/30/a2/05031b363b94093acf58c905b8dd.webp)
* 计算数据传输率/总线带宽
* ![](../../images/408/《计组》总线/计算数据传输率.jpg)
* ![](../../images/408/《计组》总线/计算总线带宽.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/a3/47/dd6c84a2c0c233b3afa0bdfb56c4.webp)
* ![](https://lychee.inksoul.top/uploads/medium/75/39/02416f6c5dbcc21a73767135136e.webp)
## 总线事务和定时
@ -196,3 +196,4 @@ date: 2023-07-22T10:06:23+08:00
* 全互锁方式
* 主设备发请求$\rightarrow$需要等从设备的回答,才能撤销请求信号
* 从设备收到回答$\rightarrow$需要等到主设备的回答,才能撤销回答信号
* ![](https://lychee.inksoul.top/uploads/original/59/a0/e181379c843140b9ed863c0687b0.webp)

View File

@ -57,12 +57,12 @@ date: 2023-07-18T22:48:35+08:00
操作码和地址码分组存放
![](../../images/408/《计组》指令系统/操作码和地址码分组存放.jpg)
![](https://lychee.inksoul.top/uploads/original/7b/04/3d202b6c3f591fd222833d164114.webp)
操作码和地址码放在一起
![](../../images/408/《计组》指令系统/操作码和地址码放在一起.jpg)
![](https://lychee.inksoul.top/uploads/original/a4/86/cb6ba6c0e416373768fbe580516f.webp)
### 地址码
@ -232,7 +232,7 @@ date: 2023-07-18T22:48:35+08:00
* 跳跃的地址分为绝对地址【标记符直接得到】和相对地址【相对当前指令地址的偏移量】
* 跳跃的结果是当前指令修改PC值所以下一条指令仍然通过PC给出
* 例图
* ![](../../images/408/《计组》指令系统/指令寻址的种类例图.jpg)
* ![](https://lychee.inksoul.top/uploads/original/c4/e9/db2d252eb3cc7e389fa5b1a44ae7.webp)
### 数据寻址
@ -262,7 +262,7 @@ date: 2023-07-18T22:48:35+08:00
* 隐地址不给出明显的操作数地址,而在指令中隐含操作数的地址
* 可以简化地址结构,如零地址指令
* 例图
* ![](../../images/408/《计组》指令系统/隐含寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/d3/35/c869a9918c0d30eae07d8c53571c.webp)
* 立即寻址
* 有效地址
* A就是操作数
@ -285,7 +285,7 @@ date: 2023-07-18T22:48:35+08:00
* 特点
* 直接寻址主要执行取指令访存1次还有执行指令访存1次
* 例图
* ![](../../images/408/《计组》指令系统/直接寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/f8/d7/49d32a04207cc4c463ef21b6500b.webp)
* 间接寻址
* EA=(A)
* 定义
@ -295,7 +295,7 @@ date: 2023-07-18T22:48:35+08:00
* 特点
* 与直接寻址相比间接寻址执行取指令访存1次还要执行指令访存2次
* 例图
* ![](../../images/408/《计组》指令系统/间接寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/b0/db/b69e93e3dbcc6fb317210f0789a5.webp)
* 访问寄存器的寻址
* 寄存器寻址
* $EA = R_i$
@ -307,7 +307,7 @@ date: 2023-07-18T22:48:35+08:00
* 访问寄存器会比访问主存快得多
* CPU中寄存器不是很多用很短的编码就可以指令寄存器能有效地缩短地址段的位数
* 例图
* ![](../../images/408/《计组》指令系统/寄存器寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/57/e2/9f68e69cf8f9aa14c0c8bf848854.webp)
* 寄存器间接寻址
* $EA = (R_i)$
* 定义
@ -319,7 +319,7 @@ date: 2023-07-18T22:48:35+08:00
* 寄存器间接寻址主要执行指令访存1次
* 还有一次是寄存器执行指令访存1次
* 例图
* ![](../../images/408/《计组》指令系统/寄存器间接寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/eb/e3/99543e9129a9e1ccce1ca71fbaf3.webp)
* 转/偏移类寻址
* 基址寻址
* EA = (BR)+A
@ -334,8 +334,8 @@ date: 2023-07-18T22:48:35+08:00
* 原先只能寻址A的位数范围内的地址有了基址寻址的方式
* 可以通过加上一个基地址从而在更大范围的空间内设计程序
* 例图
* ![](../../images/408/《计组》指令系统/BR基址寻址.jpg)
* ![](../../images/408/《计组》指令系统/通用基址寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/ed/05/83ad60a759fdb3bf0e4ca8a23fc0.webp)
* ![](https://lychee.inksoul.top/uploads/original/93/62/d36a49e5190e7c0ee4492f09c705.webp)
* 变址寻址
* EA = (IX) + A
* 定义
@ -345,7 +345,7 @@ date: 2023-07-18T22:48:35+08:00
* 变址寻址常用在一些有规律的操作上,比如遍历字符串,遍历数组
* 1条指令实现了基址寻址多条的功能
* 例图
* ![](../../images/408/《计组》指令系统/变址寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/df/3b/2d62ca25d806e09bf34457d7b5a5.webp)
* 相对寻址
* EA = (PC)+A
* 定义
@ -356,7 +356,7 @@ date: 2023-07-18T22:48:35+08:00
* 相对寻址有利于程序浮动,广泛用于转移指令和多道程序设计中
* 所以相对寻址的相对地址是以下条指令在内存中首地址为基准位置的偏移量
* 例图
* ![](../../images/408/《计组》指令系统/相对寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e3/99/129726c6e72c5c818edc57236e41.webp)
* 堆栈寻址
* 定义
* 把操作数存放在堆栈中隐含的使用堆栈指针SP作为操作数地址
@ -365,7 +365,7 @@ date: 2023-07-18T22:48:35+08:00
* 入栈,先压入数据,再修改指针
* 出栈,先修改指针,再弹出数据
* 例图
* ![](../../images/408/《计组》指令系统/堆栈寻址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e3/41/2c5df80422a006b58485bf30a0d1.webp)
* 常考点
* 速度方面
* $立即寻址\rightarrow寄存器寻址\rightarrow直接寻址\rightarrow寄存器间接寻址\rightarrow间接寻址$
@ -381,7 +381,7 @@ date: 2023-07-18T22:48:35+08:00
### 选择结构语句的机器级表示
![](../../images/408/《计组》指令系统/过程调用示意图.png)
![](https://lychee.inksoul.top/uploads/original/1c/ea/21845e5bf1b07eacd48ffc242145.webp)
参数列表中越后面的参数越早压入,压完参数之后就是返回地址,以及旧的 ebp 数值
@ -429,7 +429,7 @@ date: 2023-07-18T22:48:35+08:00
* ggreater、lless、eequalssign
![](../../images/408/《计组》指令系统/跳转指令.png)
![](https://lychee.inksoul.top/uploads/original/68/f9/fff167b8af8f0a8f5b37d805aba8.webp)
* 举例
* 无符号的情况下 jb 就是 B 大jae 就是 A 大于等于 B。
@ -457,12 +457,12 @@ ret
Switch 语法举例
![](../../images/408/《计组》指令系统/switch指令为例.png)
![](https://lychee.inksoul.top/uploads/original/3e/8c/3db7b178f957a1e0dd4ba49b835c.webp)
### 循环结构语句的机器级表示
![](../../images/408/《计组》指令系统/循环结构机器级表示.png)
![](https://lychee.inksoul.top/uploads/original/0e/e7/d1795418469588d0fac8902b6216.webp)
### 过程(函数)调用对应的机器级表示
* 被保存的寄存器函数P将要使用的“被调用者保存寄存器”通过push保存在函数的栈帧中。

View File

@ -24,11 +24,11 @@ date: 2023-07-07T16:48:40+08:00
* 范围0~9 + ABCDEF
* 数制的相互转换
* 二进制$\rightarrow$八进制或十六进制
* ![](../../images/408/《计组》数据的表示和运算/二进制转八或十六.jpg)
* ![](https://lychee.inksoul.top/uploads/original/9e/66/9cf5681c038672d3138480f3f95a.webp)
* 任意进制$\rightarrow$十进制
* ![](../../images/408/《计组》数据的表示和运算/任意进制转二.jpg)
* ![](https://lychee.inksoul.top/uploads/original/41/8e/46332e04964104209937018b54f1.webp)
* 十进制$\rightarrow$任意进制
* ![](../../images/408/《计组》数据的表示和运算/十进制转任意.jpg)
* ![](https://lychee.inksoul.top/uploads/original/84/f8/91b9a656046bb99e80fd347e35e5.webp)
## 无符号数
@ -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}$
* 结构图
* ![](../../images/408/《计组》数据的表示和运算/一位全加器结构.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/90/17/dbfc767d4bff362e71022287f928.webp)
### 串行进位加法器
@ -154,7 +154,7 @@ date: 2023-07-07T16:48:40+08:00
* 串行进位加法器把n个FA相连得到的n位加法器
* 每级进位直接依赖于前一级的进位,进位信号逐级形成
* 最长运算时间由进位信号的传递时间决定
* ![](../../images/408/《计组》数据的表示和运算/串行进位加法器.jpg)
* ![](https://lychee.inksoul.top/uploads/original/12/a0/353117a5bbc6964c23e5e8b0c19b.webp)
### 并行进位加法器
@ -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
* 结构图
* ![](../../images/408/《计组》数据的表示和运算/带标志加法器.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/18/41/6f5c0c1c12919ad4ccd431f2b30b.webp)
### 算术逻辑单元ALU
@ -193,7 +193,7 @@ date: 2023-07-07T16:48:40+08:00
* 在ALUop的控制下由一个多路选择器MUX选择输出某种操作结果
* MUX是多路选择开关它从多个输入信号中选择一个送到输出端
* 结构图
* ![](../../images/408/《计组》数据的表示和运算/算术逻辑单元ALU.png)
* ![](https://lychee.inksoul.top/uploads/medium/ad/c9/5db24d35207e4db92d01115b4383.webp)
## C语言中的整数类型与类型转换
@ -268,7 +268,7 @@ int main(){
* double 占8字节 = 64位
* 大端方式按MSB到LSB的顺序存储数据
* 小端方式按LSB到MSB的顺序存储数据
* ![](../../images/408/《计组》数据的表示和运算/数据的大端方式和小端方式存储.png)
* ![](https://lychee.inksoul.top/uploads/original/a6/2e/116285bae695ee3fa2cc03ce8349.webp)
* 如小端方式中,按字节编制
* 设int变量i的地址为0800Hi的机器数为01234567H则地址0800H表示的内容为67H
@ -278,9 +278,9 @@ int main(){
* 存储字长为32位时半字是2的整数倍字地址是4的整数倍字节大小为8位
* 边界对齐虽然浪费了一些存储空间,但是可以提高取指令和取数的速度
* 边界不对齐可以充分利用存储空间,但是效率低
* ![](../../images/408/《计组》数据的表示和运算/数据按边界对齐方式存储.png)
* ![](https://lychee.inksoul.top/uploads/medium/ef/8b/b233d01c35ed39742b310cfa75e0.webp)
* 例题
* ![](../../images/408/《计组》数据的表示和运算/数据存储和排列例题.png)
* ![](https://lychee.inksoul.top/uploads/medium/a2/52/e1bc2046abc8bc1a4262f8e38f60.webp)
## 定点数
@ -296,7 +296,7 @@ int main(){
* 符号位和数值位一起参与运算
* 运算结果的高位被丢弃
* 实例
* ![](../../images/408/《计组》数据的表示和运算/补码加减法运算实例.png)
* ![](https://lychee.inksoul.top/uploads/medium/23/56/1a94dbe41abf0445bf04d15c82b8.webp)
* 运算电路信号解释
* |记忆方法|解释|是否有意义|
|---|---|---|---|
@ -336,9 +336,9 @@ int main(){
* 积和被乘数采用双符号位
* 最多进行n次加法运算n次移位
* 计算过程
* ![](../../images/408/《计组》数据的表示和运算/原码一位乘法计算过程.png)
* ![](https://lychee.inksoul.top/uploads/medium/98/6a/76dd46c4799d46a3627b1d964981.webp)
* 电路图
* ![](../../images/408/《计组》数据的表示和运算/原码一位乘法流程图.jpg)
* ![](https://lychee.inksoul.top/uploads/original/42/c7/5dfd153c7b89f8c0806f353cc3a6.webp)
* 补码一位乘法
* 定义和概念
* 一种有符号数的乘法
@ -351,9 +351,9 @@ int main(){
|1|0|部分积加$[-a]_补$,右移一位|
|1|1|部分积右移一位|
* 计算过程
* ![](../../images/408/《计组》数据的表示和运算/补码一位乘法计算过程.png)
* ![](https://lychee.inksoul.top/uploads/medium/07/6f/7bb2b85e44f1d2b4875869f7cb5a.webp)
* 电路图
* ![](../../images/408/《计组》数据的表示和运算/补码一位乘法电路图.png)
* ![](https://lychee.inksoul.top/uploads/original/27/1b/979ac1e4025438462e3e23c06b67.webp)
### 除法
@ -369,9 +369,9 @@ int main(){
* 该方法商符和商值分开进行
* 商符由两个操作数的符号位异或形成
* 计算过程
* ![](../../images/408/《计组》数据的表示和运算/原码除法计算过程.png)
* ![](https://lychee.inksoul.top/uploads/medium/28/a3/19da076d726ac42e7739920bd72d.webp)
* 电路图
* ![](../../images/408/《计组》数据的表示和运算/原码除法运算电路图.png)
* ![](https://lychee.inksoul.top/uploads/original/72/22/6037401a25e098aee68e327354cc.webp)
* 补码除法运算(加减交替法)
* 该方法符号位和数值位一起参与运算,商符自然形成
* 根据被除数和除数的符号决定加法还是减法
@ -380,9 +380,9 @@ int main(){
* 异号上商0
* 最后一步商置1
* 计算过程
* ![](../../images/408/《计组》数据的表示和运算/补码除法运算计算过程.png)
* ![](https://lychee.inksoul.top/uploads/medium/41/1f/3440bac11a4224ff0d4f9c63e255.webp)
* 电路图
* ![](../../images/408/《计组》数据的表示和运算/补码除法运算电路图.png)
* ![](https://lychee.inksoul.top/uploads/original/96/3f/521ec34ccd347049077b17280cf4.webp)
## 移位运算
@ -423,7 +423,7 @@ int main(){
* d中数据位连同CF一起左移
* 数据的最高位移入CF
* CF则移入数据的最低位
* ![](../../images/408/《计组》数据的表示和运算/循环移位流程.png)
* ![](https://lychee.inksoul.top/uploads/original/ad/39/c2f22aaa4113231e2be59b8d5bc3.webp)
## 浮点数
@ -452,12 +452,12 @@ int main(){
* 基数为2时将小数点前面的值固定为1基数为4时尾数的最高两位不全为0
* 指数(阶码)部分
* 阶码的位数反映浮点数的表示范围
* ![](../../images/408/《计组》数据的表示和运算/浮点数结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/d0/85/4efe201fa4183c794a62fa055506.webp)
### 表示范围
![](../../images/408/《计组》数据的表示和运算/浮点数范围.jpg)
![](https://lychee.inksoul.top/uploads/original/7e/1a/67374c9d3c254ccd450b656eccd3.webp)
* 【正上溢】:大于最大正数
* 【负上溢】:小于绝对值最大负数
@ -479,7 +479,7 @@ int main(){
* 规格化规定尾数的最高数位必须是一个有效值1
* 目的
* 提高数据的表示精度
* ![](../../images/408/《计组》数据的表示和运算/浮点数规格化.png)
* ![](https://lychee.inksoul.top/uploads/original/40/b0/92d04218a669adc1825a1afdcca2.webp)
* 左规
* 当浮点数运算的结果为非规格化时要进行规格化处理
* 将尾数算术左移一位,阶码减一
@ -522,7 +522,7 @@ int main(){
### IEEE754标准浮点数范围
* IEEE754中尾数使用原码表示阶码用移码表示
* ![](../../images/408/《计组》数据的表示和运算/IEE754浮点数结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e2/40/8bc6f40ea4df6c369020b3a31643.webp)
|以正数为例|最小值|最大值|
|---|---|---|
@ -538,11 +538,11 @@ int main(){
#### 浮点数转十进制
![](../../images/408/《计组》数据的表示和运算/将浮点数转为十进制例题.jpg)
![](https://lychee.inksoul.top/uploads/medium/29/ad/fb3b42539e8279facd2aa4ad9598.webp)
#### 十进制转浮点数
![](../../images/408/《计组》数据的表示和运算/将十进制转为浮点数例题.png)
![](https://lychee.inksoul.top/uploads/medium/c8/be/453bd4a5312a4ece1308291535ae.webp)
## 浮点数和定点数区别

View File

@ -61,7 +61,7 @@ date: 2023-07-07T11:24:47+08:00
## 计算机应用层次结构
* 层次结构图
* ![](../../images/408/《计组》计算机系统概述/计算机应用层次结构.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/0b/f1/3f2d4d2fd5777c32f650214d86a4.webp)
* 三种程序转换
* 高级语言$\underrightarrow{编译}$汇编语言$\underrightarrow{汇编}$机器语言
* 高级语言$\underrightarrow{解释}$机器语言
@ -89,7 +89,7 @@ date: 2023-07-07T11:24:47+08:00
### 冯诺依曼结构
* 组成示例图
* ![](../../images/408/《计组》计算机系统概述/冯诺依曼机的示例图.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/a5/a7/80c328149d2753944b4c7c7c3b86.webp)
* 特点
* 计算机由五大部件组成
* 输入设备
@ -111,7 +111,7 @@ date: 2023-07-07T11:24:47+08:00
### 现代计算机结构
* 示例图
* ![](../../images/408/《计组》计算机系统概述/现代计算机结构的示例图.jpg)
* ![](https://lychee.inksoul.top/uploads/original/5c/45/7f41c1c2a764b5790d874319bb79.webp)
* 特点
* 计算机 = 主机 + 输入/输出设备
* 主机 = CPU +主存
@ -127,8 +127,8 @@ date: 2023-07-07T11:24:47+08:00
### 存储器
* ![](../../images/408/《计组》计算机系统概述/存储器.jpg)
* ![](../../images/408/《计组》计算机系统概述/存储体.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/f5/d6/54c9bbf3e894a0f8c83ee6b852f4.webp)
* ![](https://lychee.inksoul.top/uploads/original/23/36/f2c4b6477d836e1539b7eea1de60.webp)
* 组件
* 存储元存储二进制的电子元件每个存储元可存储1bit
* 存储单元:每个存储单元放一串二进制代码
@ -145,7 +145,7 @@ date: 2023-07-07T11:24:47+08:00
### 运算器
* ![](../../images/408/《计组》计算机系统概述/运算器.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/4e/d5/3b6d2b1152928ab923f48a450a7e.webp)
* 组件
* ACC累加器用于存放操作数或运算结果
* MQ乘商寄存器在乘除计算中用于存放操作数或运算结果
@ -154,7 +154,7 @@ date: 2023-07-07T11:24:47+08:00
### 控制器
* ![](../../images/408/《计组》计算机系统概述/控制器.jpg)
* ![](https://lychee.inksoul.top/uploads/original/a2/cd/67b8e28b59998f413e73513c2de5.webp)
* 组件
* PC:程序计数器,存放下一条指令的地址,并跟踪下一条要执行的指令的地址
* IR指令寄存器存放当前正在执行的指令
@ -164,7 +164,7 @@ date: 2023-07-07T11:24:47+08:00
## 计算机系统的细节
* 系统细节图
* ![](../../images/408/《计组》计算机系统概述/系统细节图.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/5a/b4/2f5038bc4b91baf52523a7687344.webp)
* 系统的组成
* CPU中央处理器
* PC程序计数器
@ -195,7 +195,7 @@ date: 2023-07-07T11:24:47+08:00
* 送结果到寄存器中或送到内存
* PC加一
* 常见操作码
* ![](../../images/408/《计组》计算机系统概述/常见的操作码.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/54/dc/75ab88c8d370f8d1095fdf8f1d29.webp)
* 程序执行过程举例
* 举例计算$y = ax^2 + bx+c$
* 取x至运算器中
@ -205,7 +205,7 @@ date: 2023-07-07T11:24:47+08:00
* 将运算器中数据送至存储器y中
* 打印y
* 停机
* ![](../../images/408/《计组》计算机系统概述/程序执行过程举例.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/52/1a/0138958f183c5b450c228f7ab787.webp)
## 计算机性能指标

View File

@ -20,7 +20,7 @@ date: 2023-07-22T13:59:04+08:00
* 只能在OS内核的底层IO软件中使用
* IO指令实现的数据传送通常发生在通用寄存器和IO端口之间
* 一种特权指令
* ![](../../images/408/《计组》输入输出系统/IO接口的基本结构.jpg)
* ![](https://lychee.inksoul.top/uploads/original/2e/a3/0d3fa66954f4ea0f1e1ff9913985.webp)
* IO接口类型
* 数据传输方式区分
* 并行接口:一个字节或一个字的所有位同时传送
@ -90,7 +90,7 @@ date: 2023-07-22T13:59:04+08:00
* 缺点
* CPU在信息传送过程中要花费很多时间来查询和等待
* 在一段时间内只能和一台外设交换信息,效率大大降低
* ![](../../images/408/《计组》输入输出系统/程序查询方式流程图.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/ca/3e/374f3e51ed7e8eb4122a5ee81601.webp)
* 程序中断方式
* 基本概念
* 在计算机执行现行程序的过程中出现某些急需处理的寻常情况或特殊情况请求CPU暂停中止现行程序而专区对这些异常情况或特殊请求进行处理处理完毕后再返回到现行程序的断点处继续执行原程序
@ -115,7 +115,7 @@ date: 2023-07-22T13:59:04+08:00
* 然后CPU继续执行当前的程序不需要像查询方式那样等待外设准备就绪
* 一但外设完成数据传送的准备工作就主动向CPU发出中断请求请求CPU为自己服务
* 在可以响应中断的条件下CPU暂时中止正在执行的程序转去执行中断服务程序为外设服务在中断服务程序中完成一次主机与外设之间的数据传送传送完成后CPU回到原来的程序
* ![](../../images/408/《计组》输入输出系统/程序中断方式示意图.jpg)
* ![](https://lychee.inksoul.top/uploads/original/ef/c8/db4ea0f7c5e197a5ef2f0597df88.webp)
* 程序中断的基本流程
* 中断请求
* 中断响应判优(硬件排队器实现)
@ -138,7 +138,7 @@ date: 2023-07-22T13:59:04+08:00
* 非向量(软件)中断
* CPU设置一个异常状态寄存器用于记录异常原因OS用一个统一的异常或中断查询程序按优先等级顺序查询异常状态寄存器以检测异常和中断的类型先查到的先被处理然后转到内核中相应的处理程序
* 中断处理过程
* ![](../../images/408/《计组》输入输出系统/可嵌套中断的处理流程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/e7/f4/e15941e9122db759bbd1eaa692fb.webp)
* 多重中断和中断屏蔽技术
* 单重中断
* 若CPU在执行中断服务程序的过程中又出现了新的更高优先级的中断请求而CPU对新的中断请求不响应
@ -152,7 +152,7 @@ date: 2023-07-22T13:59:04+08:00
* 1表示屏蔽该中断源的请求0表示可以正常申请
* 所有屏蔽触发器组合在一起便构成一个屏蔽字寄存器
* 屏蔽字寄存器的内容称为屏蔽字
* ![](../../images/408/《计组》输入输出系统/单重中断和多重中断示意图.jpg)
* ![](https://lychee.inksoul.top/uploads/original/93/0a/cd22d18fa0b9af5707e4a7f7b261.webp)
* DMA(Direct Memory Access 直接存储器存取)方式
@ -180,7 +180,7 @@ date: 2023-07-22T13:59:04+08:00
* DMA请求触发器每当IO设备准备好数据后给出一个控制信号使DMA请求触发器置位
* 控制/状态逻辑由控制和时序电路及状态标志组成用于指令传送方向修改传送参数并对DMA请求信号CPU响应信号进行协调和同步
* 中断机构当一个数据块传送完毕后触发中断机构向CPU提出中断请求
* ![](../../images/408/《计组》输入输出系统/简单的DMA控制器.jpg)
* ![](https://lychee.inksoul.top/uploads/original/49/fb/b5076a0473404b72d15556c50991.webp)
* 传送方式
* 当IO设备和CPU同时访问主存时可能发生冲突为了有效使用主存DMAC和CPU通常采用3种方式使用主存
* 停止CPU访问
@ -198,7 +198,7 @@ date: 2023-07-22T13:59:04+08:00
* 校验送入主存的数据是否正确
* 测试传送过程中是否出错(错误则转诊断程序)
* 决定是否继续使用DMA传送其他数据等
* ![](../../images/408/《计组》输入输出系统/DMA的传送流程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/91/95/4dd2b9dee7f0790c312040b18a29.webp)
* DMA方式和中断方式的对比
@ -222,8 +222,8 @@ date: 2023-07-22T13:59:04+08:00
* 各种IO控制方式的对比和例题
* ![](../../images/408/《计组》输入输出系统/IO控制方式对比.png)
* ![](../../images/408/《计组》输入输出系统/IO例题.jpg)
* ![](https://lychee.inksoul.top/uploads/original/13/3d/03e76755ee99749d2f2528f6202b.webp)
* ![](https://lychee.inksoul.top/uploads/medium/da/ba/965221f98b59e0e4f9059378f662.webp)
## 思维导图

View File

@ -56,14 +56,14 @@ date: 2023-07-27T14:50:10+08:00
* UDP没有拥塞控制有利于实时应用视频语音
* UDP分组首部开销小TCP有20B的首部开销UDP仅有8B的开销
* UDP是面向报文的报文是UDP数据报处理的最小单位
![](../../images/408/《计网》传输层/UDP协议.png)
![](https://lychee.inksoul.top/uploads/original/d7/b7/a996e0f29f9b47e71e5445646933.webp)
* 报文太长UDP把报文交给IP层后会导致分片
* 报文太短UDP把它交给IP层后会使IP数据报的首部相对长度太大
* 两者都会减低IP层的效率
### 首部格式
* ![](../../images/408/《计网》传输层/UDP首部格式.png)
* ![](https://lychee.inksoul.top/uploads/original/f5/06/16a146c2069707d88758d0498950.webp)
* 用户数据报UDP有两个字段数据字段和首部字段
* 首部字段只有8个字节由四个字段组成每个字段长度都是两个字节
* 源端口不是必须的只有在需要对方回信时选用不需要时可用全0
@ -82,13 +82,13 @@ date: 2023-07-27T14:50:10+08:00
* UDP校验和校验出UDP数据报是错误的可以丢弃也可以交付给上层但是要附上错误报告
* UDP校验和提供差错检测功能在计算校验和时要在UDP用户数据报之前增加12字节的伪首部
* 伪首部既不向下传送也不向上递交,只是为了计算校验和
* ![](../../images/408/《计网》传输层/UDP校验1.png)
* ![](https://lychee.inksoul.top/uploads/original/e0/59/f7cde06c7a529e79cd323bc9cc87.webp)
* 各字段内容
* 源IP地址和目的IP地址和IP数据一样各占4个字节
* 伪首部第3个字段是全零
* 协议字段UDP协议的协议字段值是17
* UDP长度UDP用户数据报长度首部长度和数据部分长度之和
* ![](../../images/408/《计网》传输层/UDP校验2.png)
* ![](https://lychee.inksoul.top/uploads/original/53/5a/3eca4dceadbaddf40ed0479d2e25.webp)
* 校验和过程
* 将校验和字段置位0
* 将伪首部和UDP用户数据报首部和数据部分看成是以16位为单位的二进制组成依次进程二进制反码求和
@ -112,14 +112,14 @@ date: 2023-07-27T14:50:10+08:00
### TCP报文段
![](../../images/408/《计网》传输层/TCP报文段1.png)
![](https://lychee.inksoul.top/uploads/original/8e/13/949c8e19bca388a8749af4acae17.webp)
* 一个TCP报文段 = 首部 + 数据部分
* 首部的前20个字节是固定的
* 后面有4n字节是根据需要而增加的选项
* TCP首部的最小字节是20字节
![](../../images/408/《计网》传输层/TCP报文段2.png)
![](https://lychee.inksoul.top/uploads/original/90/80/17d149807692aa9bf116bd42af0e.webp)
* 源端口和目的端口
* TCP分用功能的实现
@ -159,7 +159,7 @@ date: 2023-07-27T14:50:10+08:00
### TCP连接三次握手
![](../../images/408/《计网》传输层/TCP连接三次握手.png)
![](https://lychee.inksoul.top/uploads/original/c4/82/cbb6396ac649f4cd8b24e959d7e5.webp)
* 第一次握手
* 客户端向服务端发送请求首部同步位SYN = 1选择一个初始序号seq = x
@ -179,7 +179,7 @@ date: 2023-07-27T14:50:10+08:00
### TCP连接释放四次握手
![](../../images/408/《计网》传输层/TCP连接三次握手.png)
![](https://lychee.inksoul.top/uploads/original/24/6a/1db75e1bf939add7dadd5515a6f9.webp)
* 第一次握手
* 客户端向服务端发出连接释放报文段->停止发送数据,主动关闭连接
@ -242,16 +242,16 @@ date: 2023-07-27T14:50:10+08:00
* 拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载
* 拥塞往往表现为通信时延的增加
* 慢开始
* ![](../../images/408/《计网》传输层/慢开始.png)
* ![](https://lychee.inksoul.top/uploads/original/bc/2a/5d4c136424bb61130ecfc4843fa0.webp)
* cwnd < ssthresh使
* 在达到慢开始门限ssthresh前cwnd成线性增长
* 拥塞避免
* ![](../../images/408/《计网》传输层/拥塞避免.png)
* ![](https://lychee.inksoul.top/uploads/original/fb/41/3df2bc1dbbc566bfb1728ec687aa.webp)
* cwnd > ssthresh时使用拥塞避免算法
* cwnd每次增加1
* 出现乘法减小时ssthresh设置为当前cwnd的一半cwnd设置为1然后重新慢开始
* 快重传/快恢复
* ![](../../images/408/《计网》传输层/快重传.png)
* ![](https://lychee.inksoul.top/uploads/original/67/f0/63f75c7dd5c8f427e782b80f67f5.webp)
* 快重传
* 当发送方连续收到3个重复的ack报文时直接重传对方尚未收到的报文段
* 不必等待那个报文段设置的重传计时器超时

View File

@ -6,11 +6,11 @@ date: 2023-07-28T14:35:45+08:00
## 各报文常考内容
![](../../images/408/《计网》大题/各报文常考内容.jpg)
![](https://lychee.inksoul.top/uploads/medium/b3/d3/0070074ed8e21a622071de7fc6e0.webp)
## 大题
![](../../images/408/《计网》大题/大题1.jpg)
![](https://lychee.inksoul.top/uploads/medium/99/99/538f2c27a80f309dcc6d6ce56e30.webp)
1
@ -46,7 +46,7 @@ u = $\frac{发送数据的时间}{从开始发送第一帧到收到第一个确
---
![](../../images/408/《计网》大题/大题2.jpg)
![](https://lychee.inksoul.top/uploads/original/24/eb/7239b01e91d265632d9a8c8dc195.webp)
1
@ -66,7 +66,7 @@ u = $\frac{发送数据的时间}{从开始发送第一帧到收到第一个确
---
![](../../images/408/《计网》大题/大题3.jpg)
![](https://lychee.inksoul.top/uploads/original/bf/04/3a3bfd9f282d6d92abc49620017c.webp)
1
@ -98,7 +98,7 @@ $2^7 = 128$ =>主机号占7位
---
![](../../images/408/《计网》大题/大题4.jpg)
![](https://lychee.inksoul.top/uploads/original/d7/1a/0c01bacd344aec4b7c3d35742ff5.webp)
1
@ -123,7 +123,7 @@ $2^7 = 128$ =>主机号占7位
---
![](../../images/408/《计网》大题/大题5.jpg)
![](https://lychee.inksoul.top/uploads/original/61/78/d4dc1370e36f8318d23029017ead.webp)
1
@ -146,7 +146,7 @@ R2转发P的源IP地址203.10.2.6目的IP地址192.168.1.2
---
![](../../images/408/《计网》大题/大题6.jpg)
![](https://lychee.inksoul.top/uploads/original/90/da/6538113f7e421feab16a30db0500.webp)
1
@ -167,7 +167,7 @@ R1,R2属于不同的自治系统使用边界网关协议BGP或BGP4
---
![](../../images/408/《计网》大题/大题7.jpg)
![](https://lychee.inksoul.top/uploads/medium/85/aa/0abab959b630b44e22bda12b063f.webp)
1
@ -193,7 +193,7 @@ metric为10
---
![](../../images/408/《计网》大题/大题8.jpg)
![](https://lychee.inksoul.top/uploads/original/f8/6b/9274732756d87870f5a9cf48496a.webp)
1
@ -219,7 +219,7 @@ R需提供NAT服务网络地址转换服务
---
![](../../images/408/《计网》大题/大题9.jpg)
![](https://lychee.inksoul.top/uploads/medium/c3/2e/71b4f8722981822e621d40169583.webp)
1
@ -267,7 +267,7 @@ STTL = 40H = 64
---
![](../../images/408/《计网》大题/大题10.jpg)
![](https://lychee.inksoul.top/uploads/medium/45/1f/29265e8b6d0cfa463b34dbd06a63.webp)
1
@ -289,7 +289,7 @@ SYN = 1,ACK =1,确认序号 =101
---
![](../../images/408/《计网》大题/大题11.jpg)
![](https://lychee.inksoul.top/uploads/medium/1b/b4/066a05604dbffb9d5d358014d0d2.webp)
1
@ -322,7 +322,7 @@ IP数据报每经过一个路由器TTL长度减1并重新计算首部验
---
![](../../images/408/《计网》大题/大题12.jpg)
![](https://lychee.inksoul.top/uploads/original/41/5b/b21a8f16f63ff6bdfa640bd5f6db.webp)
1

View File

@ -16,7 +16,7 @@ date: 2023-07-27T19:15:08+08:00
### 客户/服务器模型
![](../../images/408/《计网》应用层/客户服务器模型.png)
![](https://lychee.inksoul.top/uploads/original/4f/cc/3c80f8fa437cef1ad7ff67b740d5.webp)
* 主要特点
* 客户是服务请求方,服务器是服务提供方
@ -36,7 +36,7 @@ date: 2023-07-27T19:15:08+08:00
### P2P模型
![](../../images/408/《计网》应用层/P2P模型.png)
![](https://lychee.inksoul.top/uploads/original/4d/42/0acd65894457972eea621839a17a.webp)
* 主要特点
* 显著特点:对等节点之间有直接通信能力
@ -56,13 +56,13 @@ date: 2023-07-27T19:15:08+08:00
### DNS组成部分
* 层次域名空间
* ![](../../images/408/《计网》应用层/层次域名空间.png)
* ![](https://lychee.inksoul.top/uploads/original/8f/21/866d6ac956e7c7b23bcaa8fa1a77.webp)
* 顶级域名
* 二级域名
* 三级域名
* 多个标号组成的完整域名总共不超过255个字符
* 域名服务器
* ![](../../images/408/《计网》应用层/域名服务器.png)
* ![](https://lychee.inksoul.top/uploads/original/56/a3/8f52efed3d99185b0d1869fb7c71.webp)
* 种类
* 根域名服务器(.
* 顶级域名服务器
@ -72,10 +72,10 @@ date: 2023-07-27T19:15:08+08:00
* 域名服务器被设计为一种联机的分布式数据库系统采用C/S模型
* 域名解析过程
* 递归查询
* ![](../../images/408/《计网》应用层/递归查询.png)
* ![](https://lychee.inksoul.top/uploads/original/e8/f0/719b6864b5231cf6043faab5e5ca.webp)
* 本机向本地域名服务器的查询是递归查询
* 递归迭代查询
* ![](../../images/408/《计网》应用层/递归迭代查询.png)
* ![](https://lychee.inksoul.top/uploads/original/29/65/2526cd605005a19ad49d63957884.webp)
* 本地域名服务器向根域名服务器的查询是迭代查询
* 流程
* 主机m.xyz.com先向其本地域名服务器dns.xyz.com进行递归查询
@ -123,7 +123,7 @@ date: 2023-07-27T19:15:08+08:00
* 使协议更加简单和容易实现
* 在传输文件的时候可以利用控制连接对文件的传输进行控制(如用户可以在文件传输过程中发生请求中止服务)
![](../../images/408/《计网》应用层/FTP工作时用到的TCP连接.png)
![](https://lychee.inksoul.top/uploads/original/58/89/7854279692d13141a7406def5053.webp)
* 控制连接
* 作用
@ -158,7 +158,7 @@ date: 2023-07-27T19:15:08+08:00
* 邮件服务器,用来发送和接收邮件
* 邮件发送协议SMTP【类似Push】和读取协议pop3【类似Pull】
* 发送接收过程
* ![](../../images/408/《计网》应用层/电子邮件发送接收过程.png)
* ![](https://lychee.inksoul.top/uploads/original/7d/a5/d2c88b33a0949839d90b6ba5d788.webp)
### 电子邮件格式
@ -205,7 +205,7 @@ date: 2023-07-27T19:15:08+08:00
### Cookie
![](../../images/408/《计网》应用层/Cookie.png)
![](https://lychee.inksoul.top/uploads/original/2b/73/4b91da8b45cc3ea7d2d3217dcc88.webp)
* Cookie是网站为了辨别用户身份进行会话跟踪而存储在客户端上的数据
* Cookie的组成
@ -216,7 +216,7 @@ date: 2023-07-27T19:15:08+08:00
### HTTP操作过程
![](../../images/408/《计网》应用层/HTTP操作过程.jpg)
![](https://lychee.inksoul.top/uploads/original/f7/0c/2b9ab4673c17f28798b6ff514fb7.webp)
* 浏览器分析链接指向页面的URL
* 浏览器向DNS请求解析网址的IP地址
@ -230,13 +230,13 @@ date: 2023-07-27T19:15:08+08:00
### 持久连接和非持久连接
* 非持久连接
* ![](../../images/408/《计网》应用层/非持久连接.png)
* ![](https://lychee.inksoul.top/uploads/original/50/81/acc5fb3142fa634d1d32bf15940b.webp)
* 传输时间
* 文档传输时间 + 两倍的往返时间RTT
* connection状态
* 标志为close说明是非持久连接
* 持久连接
* ![](../../images/408/《计网》应用层/持久连接.png)
* ![](https://lychee.inksoul.top/uploads/original/7f/08/9650ad648fb8c0a56ced39405745.webp)
* 传输时间
* 共经历1个RTT延迟
* connection状态
@ -245,7 +245,7 @@ date: 2023-07-27T19:15:08+08:00
### HTTP的报文结构
![](../../images/408/《计网》应用层/HTTP的报文结构.jpg)
![](https://lychee.inksoul.top/uploads/original/e6/a4/5bdbd6972015122d4258528f68fd.webp)
* 两类HTTP报文
* 请求报文
@ -260,4 +260,4 @@ date: 2023-07-27T19:15:08+08:00
* POST【上传信息】
* CONNECT【代理服务器】
* 实例
* ![](../../images/408/《计网》应用层/HTTP的报文结构实例.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/f9/49/fa827070c2645a6c19037b2b2bd7.webp)

View File

@ -66,9 +66,9 @@ date: 2023-07-25T19:25:31+08:00
* 计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层
* CRC具有纠错能力但数据链路层只使用了他的检错功能检测到帧出错直接丢弃
* 计算举例
* ![](../../images/408/《计网》数据链路层/CRC计算举例1.jpg)
* ![](../../images/408/《计网》数据链路层/CRC计算举例2.jpg)
* ![](../../images/408/《计网》数据链路层/CRC计算举例3.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/e1/50/4a84d2d0b7abb9cc1f79f90b1a68.webp)
* ![](https://lychee.inksoul.top/uploads/medium/e4/30/dc0f4a76b9f84824e5ced91c905b.webp)
* ![](https://lychee.inksoul.top/uploads/medium/f9/a0/16b20651d42998bbe4fe5090e19a.webp)
* 纠错编码分类
* 海明码
* 实现原理
@ -102,7 +102,7 @@ date: 2023-07-25T19:25:31+08:00
### 停止等待协议SW
![](../../images/408/《计网》数据链路层/停止-等待协议.jpg)
![](https://lychee.inksoul.top/uploads/medium/16/ab/a5febf909cb8c63871668a7d7e6e.webp)
* 接收端检测到数据分组有误码时,将器丢弃并等待发送方的超时重传
* 对于误码率较高的点对点链路为使发送方尽快重传可给发送方发生NAK拒绝分组
@ -115,42 +115,42 @@ date: 2023-07-25T19:25:31+08:00
* 超时计时器设置的重传时间一般略大于从发送方到接收方的平均往返时间
* 在数据链路层点对点的往返时间好确认,重传时间好确认
* 在运输层,由于端到端往返时间不确定,重传时间不好确认
* ![](../../images/408/《计网》数据链路层/停止-等待协议的信道利用率.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/c5/fb/b3f8fc4cdac66c0c9d470ed30d83.webp)
* 当往返时延RTT远大于数据帧发送时延TD时【如卫星链路】信道利用率非常低
* 若出现重传,则对于传送有用的数据信息来说,信道利用率还要降低
* 为了克服该协议信道利用率低的缺点可以使用GBN和SR协议
* 这些协议也叫做自动重传请求ARQ
* ARQ通过接收方请求发送方重传出错的数据帧来恢复出错的帧
* 例题
* ![](../../images/408/《计网》数据链路层/例题停止-等待协议.jpg)
* ![](../../images/408/《计网》数据链路层/例题2停止-等待协议.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/3f/6a/bda6b308f82a6c99911955cbfa4d.webp)
* ![](https://lychee.inksoul.top/uploads/medium/42/9a/a68f65a345c60208709248827119.webp)
### 回退N帧协议GBN【Go-back-N】
![](../../images/408/《计网》数据链路层/回退N帧协议.jpg)
![](https://lychee.inksoul.top/uploads/medium/f3/9a/9b2b31a977e698f6af764b5a6665.webp)
![](../../images/408/《计网》数据链路层/详细回退N帧协议.jpg)
![](https://lychee.inksoul.top/uploads/medium/b8/cc/3dadc9224db21ea05922af0f409b.webp)
* 例题
* ![](../../images/408/《计网》数据链路层/例题1回退N帧协议.jpg)
* ![](../../images/408/《计网》数据链路层/例题2回退N帧协议.jpg)
* ![](../../images/408/《计网》数据链路层/例题3回退N帧协议.jpg)
* ![](../../images/408/《计网》数据链路层/例题4回退N帧协议.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/84/90/8fed83384d764587e1a136528829.webp)
* ![](https://lychee.inksoul.top/uploads/medium/44/59/26ccbb8e86b2d45570cbe1acda86.webp)
* ![](https://lychee.inksoul.top/uploads/medium/e1/ee/2010d158835672f493cca837cc33.webp)
* ![](https://lychee.inksoul.top/uploads/medium/54/98/c3560327af2eea9bc7eb2508de3f.webp)
### 选择重传协议SR
![](../../images/408/《计网》数据链路层/选择重传协议.jpg)
![](https://lychee.inksoul.top/uploads/medium/f4/98/0b8355babe7447cb8336d4ded982.webp)
![](../../images/408/《计网》数据链路层/详细选择重传协议.jpg)
![](https://lychee.inksoul.top/uploads/medium/94/1a/0eb7fc34d9635788797f691603e9.webp)
* 例题
* ![](../../images/408/《计网》数据链路层/例题选择重传协议.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/6e/93/eabfa5bb82a8b51ac78fe9db366e.webp)
## 点对点协议PPP
![](../../images/408/《计网》数据链路层/点对点协议PPP.jpg)
![](https://lychee.inksoul.top/uploads/medium/59/96/f39be426959a40528b6d8b6d4281.webp)
* PPP协议的组成
* 链路控制协议LCP
@ -173,14 +173,14 @@ date: 2023-07-25T19:25:31+08:00
* 共享信道要着重考虑的一个问题就是如何协调多个发送和接受站点对一个共享传输媒体的占用即MAC(Medium Access Control)
* MAC的内容就是采取一定的措施使得两对结点之间的通信不会发生互相干扰的情况
* 分类
* ![](../../images/408/《计网》数据链路层/媒体接入控制.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/20/78/65cbdee06e930f96b2711f75bece.webp)
* 要点
* 随着技术的发展,交换技术的成熟和成本的减低,具有更高性能的使用点对点链路和链路层交换机的交换式局域网在有线领域已完全取代了共享式局域网,但由于无线信道的广播特性,无线局域网仍然使用的是共享媒体技术
## 静态划分信道
* 信道复用
* ![](../../images/408/《计网》数据链路层/信道复用.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/73/16/8ff4265edc826be2cea399f42eaa.webp)
* 复用是通信技术中的一个重要概念
* 复用就是通过一条物理线路同时传输多路用户的信号
* 当网络中传输媒体的传输容量大于多条单一信道传输的总通信量时
@ -190,7 +190,7 @@ date: 2023-07-25T19:25:31+08:00
#### 频分多路复用FDM
![](../../images/408/《计网》数据链路层/频分多路复用.jpg)
![](https://lychee.inksoul.top/uploads/medium/7b/4c/9739935f5d935ba1e996447c7cd8.webp)
* FDM的所有用户同时占用不同的频带资源并行通信
* FDM和TDM的比较
@ -201,7 +201,7 @@ date: 2023-07-25T19:25:31+08:00
#### 时分多路复用TDM
![](../../images/408/《计网》数据链路层/时分多路复用.jpg)
![](https://lychee.inksoul.top/uploads/medium/b5/2e/1cb628ffceae5058c5fa8af8a0dc.webp)
* TDM的所有用户在不同的时间占用同样的频带宽度
* TDM介质的位速率大于单个信号的位速率
@ -211,7 +211,7 @@ date: 2023-07-25T19:25:31+08:00
#### 波分多路复用WDM
![](../../images/408/《计网》数据链路层/波分多路复用.jpg)
![](https://lychee.inksoul.top/uploads/medium/27/a1/358339aadc75b657ef89a4f11a10.webp)
#### 超分多路复用CDM
@ -235,11 +235,11 @@ date: 2023-07-25T19:25:31+08:00
* $S \cdot S = l$
* $S \cdot \bar{S} = -l$
* 例题
* ![](../../images/408/《计网》数据链路层/例题1码分多路复用.jpg)
* ![](../../images/408/《计网》数据链路层/例题2码分多路复用.jpg)
* ![](../../images/408/《计网》数据链路层/例题3码分多路复用.jpg)
* ![](../../images/408/《计网》数据链路层/例题4码分多路复用.jpg)
* ![](../../images/408/《计网》数据链路层/例题5码分多路复用.jpg)
* ![](https://lychee.inksoul.top/uploads/original/72/e4/67da30382a6b64331c42a3405b7b.webp)
* ![](https://lychee.inksoul.top/uploads/medium/b7/5c/833ba6e564cd16f79e690e89e98a.webp)
* ![](https://lychee.inksoul.top/uploads/medium/64/96/c44f84b0e0d4fdda468ed0caa873.webp)
* ![](https://lychee.inksoul.top/uploads/medium/1d/92/f767d8e8201d68a4aa2d2e3a9b69.webp)
* ![](https://lychee.inksoul.top/uploads/medium/2c/1e/adc8e1459aba04c9516865ad2ee7.webp)
### 随机接入协议分类
@ -273,74 +273,74 @@ date: 2023-07-25T19:25:31+08:00
##### 多址接入MA、碰撞检测CD、载波监听CS的概念
![](../../images/408/《计网》数据链路层/多址接入MA.jpg)
![](https://lychee.inksoul.top/uploads/medium/8d/9e/f2e540047270721f54064f19fe4e.webp)
* 不适用于无线网络
##### 征用期(碰撞期)
![](../../images/408/《计网》数据链路层/征用期(碰撞期.jpg)
![](https://lychee.inksoul.top/uploads/medium/9f/93/49ca73e115cc370be42016cae9d5.webp)
##### 最大帧长
【首部+尾部+数据载荷最小开始=64即最小帧长】
![](../../images/408/《计网》数据链路层/最大帧长.jpg)
![](https://lychee.inksoul.top/uploads/medium/7f/83/89ffaafec724bd47a7ea438580ae.webp)
##### 信道利用率
![](../../images/408/《计网》数据链路层/信道利用率.jpg)
![](https://lychee.inksoul.top/uploads/medium/f1/57/05dbc1cb5ed55835439da76d925f.webp)
* 信号传播延迟趋于0时信道利用率接近100%
##### MA、CD、CS的协作
![](../../images/408/《计网》数据链路层/MACDCS的协作.jpg)
![](https://lychee.inksoul.top/uploads/medium/2b/42/c838e22ff5686182ab5d8516db29.webp)
##### 最小帧长
![](../../images/408/《计网》数据链路层/最小帧长.jpg)
![](https://lychee.inksoul.top/uploads/medium/03/cd/3bb545456c021f497edd1533a286.webp)
##### 截断二进制的指数退避算法
![](../../images/408/《计网》数据链路层/截断二进制指数退避算法.jpg)
![](https://lychee.inksoul.top/uploads/medium/40/ad/6cf10c0765a94027e5c365d914e9.webp)
* 考虑到了网络负载对冲突的影响
##### 帧发送流程
![](../../images/408/《计网》数据链路层/帧发送流程.jpg)
![](https://lychee.inksoul.top/uploads/medium/64/9f/a7c9c0b023901afa43318b035a1d.webp)
#### 无线局域网使用的协议【CSMA/CA】
##### CSMA/CA为什么不能用于无线网
![](../../images/408/《计网》数据链路层/CSMACA为什么不能用于无线网.jpg)
![](https://lychee.inksoul.top/uploads/medium/bc/24/65465d8e5191f4f60caf94353c7b.webp)
##### 帧间间隔IFSInterFrame Space
![](../../images/408/《计网》数据链路层/帧间间隔IFSInterFrame%20Space.jpg)
![](https://lychee.inksoul.top/uploads/medium/ba/01/2da5b1858f2a09d90d1fd13164eb.webp)
##### 退避算法工作原理
![](../../images/408/《计网》数据链路层/退避算法工作原理.jpg)
![](https://lychee.inksoul.top/uploads/medium/30/18/4e5bd65f5a4c0ca700c87ab1a583.webp)
##### CSMA/CA是什么
![](../../images/408/《计网》数据链路层/CSMACA是什么.jpg)
![](https://lychee.inksoul.top/uploads/medium/ca/c0/4414441687e2e1b444b689d16b2e.webp)
##### CSMA/CA的工作原理
![](../../images/408/《计网》数据链路层/CSMACA的工作原理.jpg)
![](https://lychee.inksoul.top/uploads/medium/9a/35/db5d64a18911181380aa429a96d5.webp)
##### 退避算法示意
![](../../images/408/《计网》数据链路层/退避算法示意图.jpg)
![](https://lychee.inksoul.top/uploads/medium/1d/6f/4341e0e4591bf3cd5fe828b0383f.webp)
##### 虚拟载波监听
![](../../images/408/《计网》数据链路层/虚拟载波监听.jpg)
![](https://lychee.inksoul.top/uploads/medium/3e/e8/7d9727ea767d188d0bde4d8919db.webp)
#### 令牌传递协议
@ -356,19 +356,19 @@ date: 2023-07-25T19:25:31+08:00
### 基本概述
![](../../images/408/《计网》数据链路层/MAC地址的基本概述.jpg)
![](https://lychee.inksoul.top/uploads/medium/60/08/9a036a6a56f2e1611ab92d69d5b2.webp)
### IEEE802局域网的MAC地址发送顺序
![](../../images/408/《计网》数据链路层/IEEE802.11局域网的MAC地址发送顺序.jpg)
![](https://lychee.inksoul.top/uploads/medium/b0/eb/6c95cab6434db8e3a8316f8d0454.webp)
### IEEE802局域网的MAC地址格式
![](../../images/408/《计网》数据链路层/IEEE802.11局域网的MAC地址格式.jpg)
![](https://lychee.inksoul.top/uploads/medium/af/04/1793299a703519be25f5ea210a36.webp)
### 以太网和802的MAC帧示意图
![](../../images/408/《计网》数据链路层/以太网和802的MAC帧示意图.jpg)
![](https://lychee.inksoul.top/uploads/original/a4/49/13df1051e5b9af7cba1569ecdb0d.webp)
## ARPaddress resolution protocol协议
@ -393,7 +393,7 @@ date: 2023-07-25T19:25:31+08:00
### 以太网交换机的概述
![](../../images/408/《计网》数据链路层/以太网交换机的概述.jpg)
![](https://lychee.inksoul.top/uploads/medium/71/b8/5cd3488bc8a3f92a78a109b3c764.webp)
### 以太网交换机自学习和转发帧的过程
@ -401,19 +401,19 @@ date: 2023-07-25T19:25:31+08:00
* 以太网交换机收到帧后在帧交换表中查找帧的目的MAC地址所对应的接口号然后通过该接口转发帧
* 以太网交换机是一种即插即用的设备,刚上电启动时其内部的帧交换表是空的
* 随着网络各主机间的通信,以太网交换机通过自学习算法自动逐渐建立起帧交换表
* ![](../../images/408/《计网》数据链路层/以太网交换机自学习和转发帧的过程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/6b/f1/362632b41c756255a4d807c1a56b.webp)
* 例题
* ![](../../images/408/《计网》数据链路层/例题以太网交换机自学习和转发帧的过程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/89/0d/e4f5f7b5d756ad83b5a1e105ac50.webp)
### 以太网交换机生成树协议STP
![](../../images/408/《计网》数据链路层/以太网交换机生成树协议STP.jpg)
![](https://lychee.inksoul.top/uploads/medium/91/4a/b906c1475e5f3762564410df34fd.webp)
### 集线器和交换机的对比
![](../../images/408/《计网》数据链路层/集线器和交换机的对比1.jpg)
![](https://lychee.inksoul.top/uploads/medium/5b/77/75f40dd9b2140d33226ee58fb963.webp)
![](../../images/408/《计网》数据链路层/集线器和交换机的对比2.jpg)
![](https://lychee.inksoul.top/uploads/medium/c0/bb/a5124a8327ce121ed3e89d74032d.webp)
## 局域网和广域网
@ -441,10 +441,10 @@ date: 2023-07-25T19:25:31+08:00
* 有效共享网络资源
* 简化网络管理
* 提高网络安全性
* ![](../../images/408/《计网》数据链路层/VLAN的概述.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/74/e6/c581caeeb70d4b4b88a293914982.webp)
### VLAN的实现机制
IEEE 802.1Q帧
![](../../images/408/《计网》数据链路层/VLAN的实现机制.jpg)
![](https://lychee.inksoul.top/uploads/medium/e9/c0/bac83ae41ed754651b90b52b4695.webp)

View File

@ -103,11 +103,11 @@ date: 2023-07-24T16:46:37+08:00
* 噪声干扰
* 传输媒体的质量
* 码元传输速率越大、信号传输距离越远、噪声干扰越大或传输媒体质量越差、波形失真越严重
* ![](../../images/408/《计网》物理层/失真.png)
* ![](https://lychee.inksoul.top/uploads/original/30/d5/c570d19e2209682e0dae7d70d262.webp)
* 码间串扰
* 接收端收到的信号波形市区了码元之间清晰界限的现象
* 具体的信道所能通过的频率范围是有限的
* ![](../../images/408/《计网》物理层/码间干扰.png)
* ![](https://lychee.inksoul.top/uploads/original/b4/be/345a930762e12bbcee3cc98368f2.webp)
* 奈氏准则
* 在理想低通无噪声、带宽受限条件下为了避免码间串扰极限码元传输速率为2W BaudW是信道带宽单位是Hz
* 带宽只有在奈氏准则和香农定理中单位是HZ其余都是b/s
@ -130,7 +130,7 @@ date: 2023-07-24T16:46:37+08:00
## 编码和调制
![](../../images/408/《计网》物理层/编码和调制.png)
![](https://lychee.inksoul.top/uploads/original/d9/80/591e6a78f5d3b12399c98de73d5b.webp)
* 信道上传送的信号类型
* 基带信号
@ -152,7 +152,7 @@ date: 2023-07-24T16:46:37+08:00
## 四种编码方式
### 数字数据编码为数字信号
* ![](../../images/408/《计网》物理层/数字数据编码为数字信号.png)
* ![](https://lychee.inksoul.top/uploads/original/79/9e/6684672393168fd011f917ed450d.webp)
* 归零编码
* 信号电平在一个码元之内都要恢复到零的编码方式
* 这种编码在传输过程中处于低电平的情况多,信道利用率低
@ -178,7 +178,7 @@ date: 2023-07-24T16:46:37+08:00
### 数字数据调制为模拟信号
![](../../images/408/《计网》物理层/数字数据调制为模拟信号.png)
![](https://lychee.inksoul.top/uploads/original/4e/8c/670cfa948e32d808dff8d9936f92.webp)
* 调幅
* 即戴波的振幅随基带数字信号而变化如0或1分别对应无载波或有载波输出
@ -212,7 +212,7 @@ date: 2023-07-24T16:46:37+08:00
## 电路交换、报文交换、分组交换
![](../../images/408/《计网》物理层/三种交换的比较.png)
![](https://lychee.inksoul.top/uploads/original/72/80/79b974ccf1b1920fe58ab1fc336c.webp)
* 电路交换
* 电路交换需要建立一条专用的数据通信路径,这条路径上可能包含许多中间节点
@ -317,7 +317,7 @@ date: 2023-07-24T16:46:37+08:00
* 5-4-3规则
* 网络标准中都对信号的延迟范围作了具体的规定,因而中继器只能在规定的范围内进行,否则会网络故障
* 以太网有5个网段4个网络设备3个段连接计算机
* ![](../../images/408/《计网》物理层/5-4-3规则.png)
* ![](https://lychee.inksoul.top/uploads/original/d6/65/9e60ffb27a73a9fef2b59ee7f28b.webp)
* 集线器
* 本质为一个多端口的中继器
* 功能

View File

@ -71,7 +71,7 @@ date: 2023-07-26T11:37:50+08:00
* 分组转发,处理通过路由器的数据流
* 路由计算,通过和其他路由器进行路由协议的交互,完成路由表的计算
* 路由器的组成
* ![](../../images/408/《计网》网络层/路由器的组成.jpg)
* ![](https://lychee.inksoul.top/uploads/original/df/f2/0794d8841f20f5e74b97b0250c67.webp)
* 路由选择部分
* 路由选择处理机 + 路由选择协议 + 路由表
* 控制部分,核心是路由选择处理机
@ -93,14 +93,14 @@ date: 2023-07-26T11:37:50+08:00
* 路由表总是用软件实现,转发表可以用软件也可以用邮件实现
* 路由表不等于转发表,分组的实际转发是靠直接查找转发表,而不是直接查找路由表
* 路由表中默认路由的目的地址和子网掩码都是0.0.0.0
* ![](../../images/408/《计网》网络层/路由表.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/c7/4a/0d9dd18c287cae9e4bbb10b167bb.webp)
## IP地址的基本知识
### IP地址的定义
![](../../images/408/《计网》网络层/IP地址定义.png)
![](https://lychee.inksoul.top/uploads/original/d5/cc/6dc232b58d019b86495488efbdd7.webp)
* MAC的作用则是实现直连的两个设备之间通信而IP负责在没有直连的两个网络之间进行通信传输
* 源IP地址和目标IP地址在传输过程中是不会变化的没有使用NAT网络情况下只有源MAC地址和目标MAC一直在变化
@ -112,7 +112,7 @@ date: 2023-07-26T11:37:50+08:00
#### 分类
![](../../images/408/《计网》网络层/分类编制的IPV4地址.jpg)
![](https://lychee.inksoul.top/uploads/original/8b/5c/ef9fffff5c4e1fa1a09f3839e4a5.webp)
* ABC类地址主要由网络号和主机号组成
* 网络号标志主机/路由器所连接到的网络
@ -142,15 +142,15 @@ date: 2023-07-26T11:37:50+08:00
* C类地址254个太少了B类地址65534个又太多了不能很好地与显示网络匹配
* 可用CIDR解决
* 例题
* ![](../../images/408/《计网》网络层/例题分类编制的IPV4地址.jpg)
* 一般不用的IP地址
* ![](../../images/408/《计网》网络层/一般不使用的IP地址.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/bc/5e/2c33f657858ce08f219038820a13.webp)
* 一般不使用的IP地址
* ![](https://lychee.inksoul.top/uploads/medium/53/e1/ed2cd8c619694b58902878ef9ccd.webp)
### 划分子网的IP地址
![](../../images/408/《计网》网络层/划分子网的IPV4地址.jpg)
![](https://lychee.inksoul.top/uploads/original/92/26/0726ebcfc604b5283a6fd0812626.webp)
![](../../images/408/《计网》网络层/划分子网的IPV4地址2.jpg)
![](https://lychee.inksoul.top/uploads/original/1f/18/bedb485bcbd45e3281472d20fed4.webp)
* 划分子网原因
* 两级IP地址分类的地址空间流动率有时很低用子网划分的方法来改善这个问题
@ -174,9 +174,9 @@ date: 2023-07-26T11:37:50+08:00
* 根据子网掩码可知从8位主机号中借用2位作为子网号
* 由于子网网络地址被划分成2位那么子网地址就有4个分别是00、01、10、11
* 划分后的4个子网如下图
* ![](../../images/408/《计网》网络层/例题划分子网的IPV4地址.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/4e/dd/757c0b42b3e6813fb8f7bce3696d.webp)
### 无分类编的IPV4地址【CIDR】
### 无分类编的IPV4地址【CIDR】
* 引入原因
* CIDR消除了传统的A类B类和C类地址以及划分子网的概念
@ -184,14 +184,14 @@ date: 2023-07-26T11:37:50+08:00
* 一种归并技术,可以把小的网络汇聚成大的超网
* 可以更加有效地分配IPV4的地址空间并且可以在新的IPV6使用之前允许因特网的规模继续增长
* 细节
* ![](../../images/408/《计网》网络层/无分类编制的IPV4地址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/2f/0f/583324a4889ce029dd6eabda92e9.png)
* 路由聚合
* 为了减少路由表的消耗,用路由聚合来聚合网络地址
* 网络前缀越长,地址块越小,路由越具体
* 最长前缀匹配:有多条路由可选的时候,选择网络前缀最长的那条
* ![](../../images/408/《计网》网络层/路由聚合.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/96/93/1f97b6950131187d8e4baa5c946a.webp)
* 例题
* ![](../..images/《计网》网络层/例题无分类编制的IPV4地址.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/b8/69/ca03cd0985536b01a3a00f235e1b.webp)
* 答案为C
### IPV4的应用规划
@ -200,13 +200,13 @@ date: 2023-07-26T11:37:50+08:00
* 使用同一个子网掩码来划分子网
* 子网划分方式不灵活,只能划分出$2^n$个子网
* 每个子网所分配的IP地址数量相同容易造成IP地址浪费
* ![](../../images/408/《计网》网络层/定长的子网掩码.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/1d/11/797ee374b8671497fd02b947fd55.webp)
* 变长的子网掩码
* 使用不同的子网掩码来划分子网
* 子网划分方式灵活,可以按需分配
* 每个子网所分配的IP地址数量可以不同尽可能减少对IP地址的浪费
* ![](../../images/408/《计网》网络层/变长的子网掩码1.jpg)
* ![](../../images/408/《计网》网络层/变长的子网掩码2.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/25/3d/1445f92c3dff1173822e5cffbd97.webp)
* ![](https://lychee.inksoul.top/uploads/medium/43/23/a1e9c530c7e66edcbea41565fe2c.webp)
### IP数据报的发送和转发过程
@ -219,36 +219,36 @@ date: 2023-07-26T11:37:50+08:00
* 出错直接丢弃该IP数据报并通告源主机
* 没有出错,直接进行转发
* 根据IP数据报的目的地址在路由表中查找匹配的条目
* ![](../../images/408/《计网》网络层/路由器转发IP数据报.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/2d/e1/fd68f4805a925538d85b5f75a25f.webp)
* 若找到匹配的条目,则转发给条目中指示的下一跳
* 若找不到则丢弃该IP数据报并通告源主机
### 静态路由配置及其可能产生的路由环路问题
* 静态路由配置
* ![](../../images/408/《计网》网络层/静态路由配置.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/92/3b/3a7d185322e173c7d16f255fd7b4.webp)
* 特定主机路由(默认路由)
* ![](../../images/408/《计网》网络层/特定主机路由.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/47/c3/c7c397c85959c1142ea2d06b140e.webp)
* 静态路由配置错误导致路由环路
* ![](../../images/408/《计网》网络层/静态路由配置错误导致路由环路.jpg)
* ![](https://lychee.inksoul.top/uploads/original/9d/5b/d9cf8d5b68b8d22f28db70d0554d.webp)
* 为了防止IP数据报在路由环路中永久兜圈在IP数据报首部设有生存时间TTL字段
* IP数据报进入路由器后TTL字段的值减1
* 若TTL的值不等于0则被路由器转发否则被丢弃
* 聚合不存在的网络而导致的路由环路
* ![](../../images/408/《计网》网络层/聚合不存在的网络而导致的路由环路.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/d7/43/383d61975df79cd5a1cfdb0e876b.webp)
* 用黑洞路由条目配置解决
* 网络故障而导致的路由环路
* ![](../../images/408/《计网》网络层/网络故障而导致的路由环路.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/38/07/6961ec4a414337b7d40b7c6db4f9.webp)
* 用黑洞路由条目配置解决该问题
* 如果故障消失了,会暂时把黑洞路由条目设置为失效
### IPV6
![](../../images/408/《计网》网络层/IPV61.jpg)
![](https://lychee.inksoul.top/uploads/original/86/29/c06933f1dbe0e385d11ab465a813.webp)
![](../../images/408/《计网》网络层/IPV62.jpg)
![](https://lychee.inksoul.top/uploads/original/b1/aa/b5f6dad7b2d0c0e54fea69f907c9.webp)
![](../../images/408/《计网》网络层/IPV61.jpg)
![](https://lychee.inksoul.top/uploads/original/c3/c5/77e0dce75a8497bde251b703db2e.webp)
* IPV6地址的标识方法
* IPV6地址长度是128位是以每16位作为一组
@ -276,34 +276,34 @@ date: 2023-07-26T11:37:50+08:00
### IPV4首部
![](../../images/408/《计网》网络层/IPV4首部.jpg)
![](https://lychee.inksoul.top/uploads/original/d6/b9/c8c4f4032889d13e7ae295dbbc81.webp)
* 首部内容
* 首部长度总长度片偏移的基本单位分别为4B,1B,8B
* ![](../../images/408/《计网》网络层/首部内容.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/5d/c3/5756d438e1a3dfcaed341be58443.webp)
* IPV4分片
* 以太网MTU【最大传输单元】不超过1500
* DF=1时分组的长度又超过MTU时丢弃该分组并用ICMP差错报文向源主机报告
* MF = 1表示接受到的分片不是最后一个分片
* 所有片中的有效数据核载都是8的倍数【偏移值的单位是8B】
* 在目的主机中对分片后的数据报重组
* ![](../../images/408/《计网》网络层/IPV4分片1.jpg)
* ![](../../images/408/《计网》网络层/IPV4分片2.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/6b/8b/dcacae0aeb7f796b706cf20bc2bb.webp)
* ![](https://lychee.inksoul.top/uploads/medium/4a/5d/aeeb95984fd722d28bbfb5815031.webp)
* 例题
* ![](../../images/408/《计网》网络层/IPV4分片例题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/1c/d6/f01a6c8585a2ce5565d52fbb9bb7.webp)
## 路由选择协议概述
* 静态路由选择/动态路由选择
* ![](../../images/408/《计网》网络层/路由选择.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/6e/0f/2be6d1fbb6c98cff26960bf8778d.webp)
* 路由协议的主要特点
* 自适应-动态路由选择,能较好地适应网络状态的变化
* 分布式-路由器之间交换路由信息
* 分层次-将整个因特网划分为许多较小的自治系统
* 分层次的路由选择协议
* ![](../../images/408/《计网》网络层/分层次的路由选择协议.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/55/0d/a071fb917039c8beb108f7e36df2.webp)
* 路由选择协议
* ![](../../images/408/《计网》网络层/路由选择协议汇总.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/b7/e7/38c7b140c2ddfe3411b7bda3be54.webp)
### 三种路由协议比较
@ -319,45 +319,45 @@ date: 2023-07-26T11:37:50+08:00
### 路由信息协议RIP的工作原理
* RIP基本概念
* ![](../../images/408/《计网》网络层/RIP基本概念.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/57/ae/bd90b8b8eeb019862efa9332831e.webp)
* RIP工作原理
* ![](../../images/408/《计网》网络层/RIP工作原理.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/50/a0/318438ba02fad7b8b682e5b21413.webp)
* RIP基本工作过程
* ![](../../images/408/《计网》网络层/RIP基本工作过程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/1f/b7/8f038bcb8fa4f51e649a87e94362.webp)
* RIP路由条目更新规则
* ![](../../images/408/《计网》网络层/RIP路由条目更新规则.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/10/7d/1a3973e35504ca0288039e907453.webp)
* RIP坏消息传播得慢
* ![](../../images/408/《计网》网络层/RIP坏消息传的慢的问题.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/29/e0/4683d4151ad74dc4a92b66d6157a.webp)
### 开放最短路径优先OSPF的基本工作原理
* OSPF基本概念
* ![](../../images/408/《计网》网络层/OSPF基本概念.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/9a/32/72bd5285e47ac7e2390cfeeb74c9.webp)
* 区域边界路由器:主干区域内,用于连接主干区域和其他下层区域的路由器
* 主要在主干区域中的路由器都叫做主干路由器
* 主干路由器可以兼做区域边界路由器
* 自治系统有4类路由器区域内部路由器主干路由器区域边界路由器自治域边界路由器
* 链路的代价
* ![](../../images/408/《计网》网络层/链路的代价.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/f3/87/dda43409fb36f72f29c9084fd00a.webp)
* 交互问候分组
* ![](../../images/408/《计网》网络层/交互问候分组.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/22/30/1ee55990f36c17426ce08a4759d9.webp)
* 计算最短路径的过程
* ![](../../images/408/《计网》网络层/计算最短路径的过程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/03/00/35dc743faa10d439c11c37a0ba13.webp)
* 五种分组类型
* ![](../../images/408/《计网》网络层/五种分组类型.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/30/e4/487f213dc0792dce70c8aeb1e409.webp)
* OSPF的基本工作过程
* ![](../../images/408/《计网》网络层/OSPF的基本工作过程.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/ec/b0/565836568df87eb2a8ce85e59ff1.webp)
* DR和BDR
* ![](../../images/408/《计网》网络层/DR和BDR.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/da/38/856556107a5d0b4149588c973801.webp)
* 区域
* ![](../../images/408/《计网》网络层/区域.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/c3/60/88bc7f661a24e412e223eba641fd.webp)
* 总结
* ![](../../images/408/《计网》网络层/内容总结.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/04/8d/36490ba79ab30f0aaeeac9687ecf.webp)
### 边界网关协议BGP的工作原理
* BGP交换的网络可达性信息要到达某个网络所要结果的一系列自治系统/路径
* ![](../../images/408/《计网》网络层/边界网关协议BGP的工作原理.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/59/b0/9b31b1912386977b198045bd7801.webp)
## IP协议相关技术
@ -365,22 +365,21 @@ date: 2023-07-26T11:37:50+08:00
### ICMP【互联网控制报文协议】
* 概述
* ![](../../images/408/《计网》网络层/ICMP概述.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/c9/06/a3cf13e5bad5191291aa00fb1c4f.webp)
* 五种差错报文
* ![](../../images/408/《计网》网络层/五种差错报文1.jpg)
* ![](../../images/408/《计网》网络层/五种差错报文2.jpg)
* ![](../../images/408/《计网》网络层/五种差错报文3.jpg)
* ![](../../images/408/《计网》网络层/五种差错报文4.jpg)
* ![](../../images/408/《计网》网络层/五种差错报文5.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/81/eb/f41d08805d9aff8b7ce6a92dfec2.webp)
* ![](https://lychee.inksoul.top/uploads/medium/aa/6a/a39a140f3eba141c8d104cbea275.webp)
* ![](https://lychee.inksoul.top/uploads/medium/46/f9/05a0e0025243a5c5d04454d2b1d7.webp)
* ![](https://lychee.inksoul.top/uploads/medium/ca/4d/ace88968c625f1bd9410fe706fcb.webp)
* ![](https://lychee.inksoul.top/uploads/medium/e6/16/09cfab38b456d4186229cb5b7fef.webp)
* 不应该发送差错报文的情况
* ![](../../images/408/《计网》网络层/不应该发送差错报文的情况.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/b3/1a/bc8e2771086a8a9464e27b4ca137.webp)
* ICMP询问方式
* ![](../../images/408/《计网》网络层/ICMP询问方式.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/03/da/b7f635deb9d791729e7605b3265e.webp)
* ICMP应用
* ![](../../images/408/《计网》网络层/ICMP应用1.jpg)
* ![](../../images/408/《计网》网络层/ICMP应用2.jpg)
* ![](../../images/408/《计网》网络层/ICMP应用3.jpg)
* ![](../../images/408/《计网》网络层/ICMP应用4.jpg)
* ![](https://lychee.inksoul.top/uploads/original/62/d4/9a4e54dcb6a37d955758d1916946.webp)
* ![](https://lychee.inksoul.top/uploads/medium/31/e9/41776e9e0e812391384b032a1fd1.webp)
### ARP协议【IP地址到MAC地址的映射】
@ -401,22 +400,22 @@ date: 2023-07-26T11:37:50+08:00
### DHCP协议【动态主机配置协议】
* DHCP主要内容
* ![](../../images/408/《计网》网络层/DHCP主要内容.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/ed/8a/86201b647999f2e89ea1ad2fe22d.webp)
* DHCP过程
* ![](../../images/408/《计网》网络层/DHCP过程.jpg)
* ![](../../images/408/《计网》网络层/DHCP过程1.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/d5/c0/bc3028f4e2215a4d9630a534e0f6.webp)
* ![](https://lychee.inksoul.top/uploads/medium/4e/b8/e5bc713996006500b10514598c17.webp)
### 虚拟专用网VPN和网络地址转换NAT
* 公有地址,私有地址
* ![](../../images/408/《计网》网络层/公有地址,私有地址.jpg)
* ![](https://lychee.inksoul.top/uploads/original/e4/36/cc361eaf2af106659f214e159222.webp)
* 虚拟专用网VPN
* ![](../../images/408/《计网》网络层/虚拟专用网VPN.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/a4/bf/bcaaf628064fd03d153a94ae9ee3.webp)
* 网络地址转换NAT
* ![](../../images/408/《计网》网络层/网络地址转换NAT.jpg)
* ![](https://lychee.inksoul.top/uploads/medium/b6/96/cafd32ba79f44ee21b599f481aa0.webp)
* NAT的表项需要由管理员来添加
* NAT转换流程
* ![](../../images/408/《计网》网络层/NAT转换流程.jpg)
* ![](https://lychee.inksoul.top/uploads/original/b6/23/0ef9c72450fde279c5f8605516a5.webp)
* 上图有两个客户端192.168.1.10和192.168.1.11
* 与服务器183.232.231.172进行通信并且这两个客户端的本地端口都是1025
* 此时两个私有IP都转换IP为公有地址120.229.175.121,但以不同的端口号作为区分

View File

@ -145,7 +145,7 @@ date: 2023-07-24T13:31:22+08:00
* 相互通信的两个计算机系统必须高度协调工作,这种协调是相当复杂的
* 分层可以将庞大而复杂的问题转化为若干个较小的局部问题,而这些较小的局部问题就比较易于研究和处理
* 实体、协议、服务和服务访问点
* ![](../../images/408/《计网》计算机网络体系结构/实体协议图示.png)
* ![](https://lychee.inksoul.top/uploads/original/7a/c2/09276bd0dfe72d1623060be00ade.webp)
* 实体
* 表示任何可以发送或接受信息的硬件或软件进程。同一层的实体称为对等实体
* 协议
@ -196,7 +196,7 @@ date: 2023-07-24T13:31:22+08:00
### 两个主机通信的过程
![](../../images/408/《计网》计算机网络体系结构/主机通信过程.png)
![](https://lychee.inksoul.top/uploads/original/b8/bb/f487b2c2762707619f8f8249fb19.webp)
1. 主机A先将其数据交给本机的第7层应用层。第5层加上必要的控制信息H7就变成了下一层的数据单元
2. 第6层表示层收到数据单元后加上本层的控制信息H6就变成了下一层的控制信息依次类推
@ -211,18 +211,18 @@ date: 2023-07-24T13:31:22+08:00
### 三种网络模型
* OSI七层模型
* ![](../../images/408/《计网》计算机网络体系结构/OSI七层模型.png)
* ![](https://lychee.inksoul.top/uploads/original/b8/bb/f487b2c2762707619f8f8249fb19.webp)
* 表示层
* 数据压缩、加密及数据描述,使得应用程序不必关系再各台主机中数据内部格式不同的问题
* 会话层
* 建立及管理会话
* TCP/IP结构
* ![](../../images/408/《计网》计算机网络体系结构/TCPIP结构.png)
* ![](https://lychee.inksoul.top/uploads/original/ec/ab/f5cee48f74cf75cba0e75717d2bd.webp)
* 只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层
* TCP/IP体系结构不严格遵循OSI分层概念
* 应用层可能会直接使用IP层或网络接口层
* 五层协议结构
* ![](../../images/408/《计网》计算机网络体系结构/五层协议结构.png)
* ![](https://lychee.inksoul.top/uploads/original/49/5a/f4dbbb292d4cdbabd56fcad4884a.webp)
* 应用层
* 通过应用进程间的交互来完成特定网络应用,数据单位为报文
* 运输层
@ -238,4 +238,4 @@ date: 2023-07-24T13:31:22+08:00
* 物理层
* 主要负责在物理线路上传输原始的二进制数据
* 三个网络模型的对比
* ![](../../images/408/《计网》计算机网络体系结构/三者的对比.jpg)
* ![](https://lychee.inksoul.top/uploads/original/c2/65/bc2f1212f6dcc2b91ebf068f1ba3.webp)

View File

@ -20,14 +20,14 @@ date: 2022-05-15T17:55:10+08:00
对同一像素点内采用多个采样点的方式来减少走样但将采样点分散到了一段时间内的多个帧上,在每帧采样时对采样点进行偏移,即抖动(jitter)来实现MSAA中放置多个次采样点的效果
采样序列也使用Halto sequence
![](../../images/Halton_sequence.png)
![](https://lychee.inksoul.top/uploads/original/60/cb/a0483deb812efc3f47e71c5c566a.webp)
###### jitter的实现
采样点的位置会在初始化的时候确定,之后需要在与像素中心距离$[0,1]$的范围里发生偏移
实现这个效果只需要对投影矩阵中的值进行改动
![](../../images/offset_projection_matrix.png)
![](https://lychee.inksoul.top/uploads/original/90/c7/0dd559801285a37c2a57fa3f9cfc.webp)
图片中标红的值便是在归一化后的坐标空间里偏移值的替换位置
@ -154,7 +154,7 @@ blendFactor = (lastStencil & 0x18) == (currStencil & 0x18) ? blendFactor : 1.f;
在经过处理后,鬼影现象消失,但当相机从向右旋转时,人物的左侧边缘像素表现效果较差
![](../../images/revealed_piels_appear_bad.png)
![](https://lychee.inksoul.top/uploads/original/10/29/473ea54a527865f5577ae9acb3e8.webp)
为了减少这种情况的产生我们在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像素厚的鬼影存在
![](../../images/one_pixel_thick_ghosting.png)
![](https://lychee.inksoul.top/uploads/original/63/c5/1c0c800c976feccc81deec6a7138.webp)
产生原因:
<br>Color history 是线性采样Stencil history 是点采样,两者在边缘并不相容

View File

@ -29,17 +29,17 @@ date: 2022-07-19T16:04:37+08:00
1. 通过每个像素投射一条光线的方式来生成图像
2. 通过向光源发送光线的方式来生成阴影
![](../../images/Ray_Casting_theory.png)
![](https://lychee.inksoul.top/uploads/original/ec/04/414b90c3022c716d2624975c7704.webp)
#### 生成视角射线(Generating Eye Rays)
Pinhole Camera Model
![](../../images/Ray_Casting_Generate_Eye_Ray.png)
![](https://lychee.inksoul.top/uploads/original/4d/43/8ebc04e289ec5c00933ebd6560cb.webp)
#### 着色像素(shading pixel)
![](../../images/Ray_Casting_shading_pixel.png)
![](https://lychee.inksoul.top/uploads/original/93/78/eab871ac503716171d83ecdc6b22.webp)
### 递归式光线追踪(Recursive Ray Tracing)
@ -48,11 +48,11 @@ Recursiv Ray Tracing 又名 Whitted-Style Ray Tracing 由T.Whitted在1980年提
"An improved Illumination model for shaded display"
![](../../images/eg_Recursive_Ray_Tracing.png)
![](https://lychee.inksoul.top/uploads/original/51/44/e45e88c6e723c9b5494970236959.webp)
总体计算流程
![](../../images/Recursive_Ray_Tracing_progress.png)
![](https://lychee.inksoul.top/uploads/original/99/78/b546da5352d25210e62d0e3ddf57.webp)
-------------------------------------------
@ -143,14 +143,14 @@ $(p-p') * N = (o + td - p') * N = 0$
$t = \frac{(p'-o) * N }{d * N}$
![](../../images/Ray_Intersection_With_Plane.png)
![](https://lychee.inksoul.top/uploads/original/f7/e2/6aedc56a7ccf58a5185b7577856b.webp)
##### Möller Trumbore Algorithm
一种更快地得出重心坐标的算法
![](../../images/Möller_Trumbore_Algorithm.png)
![](https://lychee.inksoul.top/uploads/original/62/e8/365bd716459ec4e00d507750122f.webp)
### 光线追踪的性能瓶颈

View File

@ -10,7 +10,7 @@ date: 2022-05-18T14:07:33+08:00
需要对不同深度的物体进行分类来确定面与面的绘制顺序,复杂度为$O(n\log n)$,其中n为三角形的个数也存在一个无法解决的问题不能处理无法确定绘制顺序的物体例如下图互相遮挡的情况
![](../../images/unresolvable_depth_order.png)
![](https://lychee.inksoul.top/uploads/original/09/c8/b0e109e8505925e719028d94a648.webp)
###### Z-Buffer
@ -23,7 +23,7 @@ date: 2022-05-18T14:07:33+08:00
Z-Buffer会在生成渲染图的同时根据各采样点像素的深度值生成深度图,颜色越深代表距离越近,越浅则越远
![](../../images/Depth_map.png)
![](https://lychee.inksoul.top/uploads/original/66/60/4f026f087570efd23e472812ea00.webp)
算法
@ -42,5 +42,5 @@ for (each triangle T)
整体算法流程会形成如下图效果复杂度为O(n),n为三角形面的数量
![](../../images/Z-Buffer_test.png)
![](https://lychee.inksoul.top/uploads/original/8a/ac/c09ec5438aa56bc7792d3e09f44f.webp)

View File

@ -27,4 +27,4 @@ date: 2023-09-12T21:08:00+08:00
![Alt text](<../../images/计算机图形学/小预告specular color.png>)
![](https://lychee.inksoul.top/uploads/original/8e/d3/15a833562f9cf43235ecb239d046.webp)

View File

@ -12,11 +12,11 @@ date: 2022-07-30T16:49:52+08:00
坐在房间的一侧往窗户的一侧看,三维和二维的情况是下面这样的
![](../../images/color_and_perception_1.png)
![](https://lychee.inksoul.top/uploads/original/2d/d3/046d74badbe5248c86f207b703e8.webp)
如果加上一个幕布,显示上图图像,往往人们难以区别于现实世界,即为虚拟现实的原理
![](../../images/color_and_perception_2.png)
![](https://lychee.inksoul.top/uploads/original/b1/22/4c2191d7fca3018bccc736fe897a.webp)
### 全光函数(The Plenoptic Function)
@ -24,7 +24,7 @@ date: 2022-07-30T16:49:52+08:00
统计往任意方向上的所见值,可定义一个函数,最后结果为一个数
![](../../images/color_and_perception_4.png)
![](https://lychee.inksoul.top/uploads/original/a4/d8/f581921c243e8ea6683824ae8e2a.webp)
* 改进函数 Color snapshot
@ -32,19 +32,19 @@ date: 2022-07-30T16:49:52+08:00
记录各个方向看到的不同方向上的光,就可以看到彩色场景
![](../../images/color_and_perception_5.png)
![](https://lychee.inksoul.top/uploads/original/b7/96/1bf9fbe5897dc46243e2f26dd1a2.webp)
* 扩展的全光函数 A movie
进一步将全光函数扩展一个时间t那下面这个四维的函数就是电影因为你可以往各个不同的方向看看到各个不同方向来的信息都是彩色的然后在不同时间显示的东西不一样
![](../../images/color_and_perception_6.png)
![](https://lychee.inksoul.top/uploads/original/dd/b7/e20f0bcbced379c241db5dec9a07.webp)
* 进一步扩展 Holographic movie
现在考虑人/摄像机可以在三维空间中的任何地方移动三维空间中的任何一个位置可以用x、y、z定义。那这也就是全息电影
![](../../images/color_and_perception_7.png)
![](https://lychee.inksoul.top/uploads/original/18/4e/cd7839d9f2cbb2b29410704b839e.webp)
* 再改进一步 The Plenoptic Function
@ -62,7 +62,7 @@ date: 2022-07-30T16:49:52+08:00
![](../../images/color_and_perception_9.png)
![](https://lychee.inksoul.top/uploads/original/90/65/fc6d127d245f1a59c6d13cffa5dc.webp)
## 光场
@ -70,7 +70,7 @@ date: 2022-07-30T16:49:52+08:00
* 通过一个起点和一个方向定义
![](../../images/color_and_perception_10.png)
![](https://lychee.inksoul.top/uploads/original/cd/33/abd4076e7ce6915659b5d91e06c4.webp)
* 取光线上的任意两点定义整条光线(二维位置和方向)
@ -78,7 +78,7 @@ date: 2022-07-30T16:49:52+08:00
已知包围盒上的点,观测位置的点,这两点确定一条光线,可以查询记录的函数,该函数记录了物体表面不同位置往各个不同方向的发光情况
![](../../images/color_and_perception_11.png)
![](https://lychee.inksoul.top/uploads/original/11/2e/b3b94c1c4a6683c0e313e803d6c1.webp)
### 定义光场
@ -87,7 +87,7 @@ date: 2022-07-30T16:49:52+08:00
如果有了一个物体的光场如下图任何一个位置往任何一个方向都可以发光。我们在任何一个位置往这个物体某个点看的时候是可以知道这条光线带的能量是多少的因为通过这2个点可以知道往这个点看的方向就可以从4维的光场中查询到之前记录的光场的值即光场可以给出任意观测方向看到的结果
![](../../images/color_and_perception_12.png)
![](https://lychee.inksoul.top/uploads/original/72/4a/796ccde3508ffe49a71719272643.webp)
### 记录光场
@ -97,7 +97,7 @@ date: 2022-07-30T16:49:52+08:00
![](../../images/color_and_perception_13.png)
![](https://lychee.inksoul.top/uploads/original/ba/c7/d10292285b66daab8558ba699f01.webp)
* 取一平面,平面右侧有有物体发出光线打到平面上
@ -111,11 +111,11 @@ date: 2022-07-30T16:49:52+08:00
找到所有u、v和s、t的组合可以描述所有的不同位置和不同方向出来的光线
![](../../images/color_and_perception_14.png)
![](https://lychee.inksoul.top/uploads/original/08/8d/047f668b430bd561f4b31f8477c6.webp)
![](../../images/color_and_perception_15.png)
![](https://lychee.inksoul.top/uploads/original/9b/00/d6d30d0f68253bb9fc10bd36ec8c.webp)
![](../../images/color_and_perception_16.png)
![](https://lychee.inksoul.top/uploads/original/0f/57/f2802a40a42f643febe870567d1e.webp)
光场本质上就是一个4维的函数不同记录方法即为描述方式不同
@ -127,11 +127,11 @@ date: 2022-07-30T16:49:52+08:00
![](../../images/color_and_perception_17.png)
![](https://lychee.inksoul.top/uploads/original/c1/5b/e3ae0e4847a8da0d2d86fc2adbb0.webp)
很多摄像机从某一个角度看向世界拍一张图然后将所有图都组织到一块就是整个光场。如下图斯坦福做了一个摄像机的矩阵相当于在不同的位置对场景拍不同的图每个位置对应一个u、v拍到的照片是s、t相机本身二维成像结果二维综合为四维
![](../../images/color_and_perception_18.png)
![](https://lychee.inksoul.top/uploads/original/92/38/f6433a3dffe0d66e15635c654561.webp)
* 固定s、t平面上一个点然后往u、v平面上看
@ -139,7 +139,7 @@ date: 2022-07-30T16:49:52+08:00
通过这种方式可以将像素上的Irradiance给展开成Radiance可以看到打到任何一个像素上不同方向的光
![](../../images/color_and_perception_19.png)
![](https://lychee.inksoul.top/uploads/original/77/f4/57f5049eb357926c852c99b3aea2.webp)
苍蝇的复眼成像原理就是成像一个光场盯着原本拍出的一张照片来看那照片上的任何一个像素记录的是Irradiance(平均各个方向的光)
@ -147,7 +147,7 @@ date: 2022-07-30T16:49:52+08:00
此时看一个像素实际为穿过像素的不同方向的光
![](../../images/color_and_perception_20.png)
![](https://lychee.inksoul.top/uploads/original/1b/6c/c1d13de0e0f5d7b98188dabfae1c.webp)
## 光场相机
@ -157,7 +157,7 @@ date: 2022-07-30T16:49:52+08:00
Lytro相机有下图这个人创办
![](../../images/color_and_perception_21.png)
![](https://lychee.inksoul.top/uploads/original/08/aa/c16bdd7eb11e58f80af34353bf07.webp)
* 原理Microlens design上面谈到的微透镜。将一个像素替换成一个透镜让这个透镜可以把来自于不同方向的光分开并记录下来
@ -165,19 +165,19 @@ Lytro相机有下图这个人创办
* 具体效果如下图:
![](../../images/color_and_perception_22.png)
![](https://lychee.inksoul.top/uploads/original/2f/1f/3c6ce3f96498071a65bc3dc47406.webp)
* 详细原理
将原本的像素换成了微透镜,这些微透镜可以把来自各方向的光分散到不同的方向上去,在后面再将它记录下来
![](../../images/color_and_perception_23.png)
![](https://lychee.inksoul.top/uploads/original/f8/7d/70b5e01b3d9c1cd21a277edab520.webp)
光场照相机照出来的最原始的图实际上是原本的一个像素变成了一个圆,任何一个圆内部平均起来就是以前普通的照相机得到的结果,在一个圆的内部各个像素其实就是记录了各个不同的方向
![](../../images/color_and_perception_24.png)
![](https://lychee.inksoul.top/uploads/original/0b/37/e3bb4f7adb01a39b818836a56c4a.webp)
* 得到普通相机照片
@ -219,7 +219,7 @@ Lytro相机有下图这个人创办
![](../../images/color_and_perception_25.png)
![](https://lychee.inksoul.top/uploads/original/08/a4/3df622230b5cb2007acaa72adc7b.webp)
#### 可见光谱
@ -227,7 +227,7 @@ Lytro相机有下图这个人创办
光谱是光线的能量在不同的波长上的分布。光谱是一个很长的范围图形学中重要的是可见光的光谱即分布在波长在400nm到700nm之间
![](../../images/color_and_perception_26.png)
![](https://lychee.inksoul.top/uploads/original/21/52/a13940dbe0a11a54fb33812e1629.webp)
#### 谱功率密度(SPD)
@ -243,17 +243,16 @@ Lytro相机有下图这个人创办
阳光则是另一种SPD
![](../../images/color_and_perception_27.png)
![](https://lychee.inksoul.top/uploads/original/11/5d/c6799f2436932c70c1bac35b8aab.webp)
#### 不同光源的SPD
![](../../images/color_and_perception_28.png)
![](https://lychee.inksoul.top/uploads/original/81/42/e3e72fefb96ab0f265122354b1d8.webp)
* SPD的线性性质
用一种光照亮能记录光强度的东西能够得到右边的另一种分布两种光同时照亮得到的分布就是它们两个对应的SPD之和
![](../../images/color_and_perception_29.png)
![](https://lychee.inksoul.top/uploads/original/f3/77/0f992bc513042e1c113ebc52d796.webp)
### 颜色的生物学基础
@ -265,7 +264,7 @@ Lytro相机有下图这个人创办
人眼的瞳孔可调节大小,对应着光圈;晶状体对应透镜,可通过肌肉的拉扯调节焦距;视网膜进行成像
![](../../images/color_and_perception_30.png)
![](https://lychee.inksoul.top/uploads/original/d5/8d/0645c3f1b889821cc54a09e79e7c.webp)
#### 视网膜感光细胞
@ -284,11 +283,11 @@ Lytro相机有下图这个人创办
三种响应类型的曲线:
![](../../images/color_and_perception_31.png)
![](https://lychee.inksoul.top/uploads/original/ba/c7/75c738ea300b6f3e443bf49419bf.webp)
* 三种细胞的分布和数量有个体差异下图为12人锥形细胞分布差异
![](../../images/color_and_perception_32.png)
![](https://lychee.inksoul.top/uploads/original/18/e3/ee011fd5885fc0b9a637daf40abe.webp)
### 颜色的三刺激理论
@ -299,7 +298,7 @@ Lytro相机有下图这个人创办
三种不同的细胞自然会感应出三种颜色对应下图的S、M、L
![](../../images/color_and_perception_33.png)
![](https://lychee.inksoul.top/uploads/original/b5/4b/0e395cc69bc288072c13530fbb34.webp)
给定任意类型光线人眼看到的是上面S、M、L这3个数而不是光线本身的SPD
@ -307,7 +306,7 @@ Lytro相机有下图这个人创办
光线的光谱经过人的眼睛反应到视网膜上然后被三种不同的细胞感知到形成3个数这3个数送到人的脑袋中人就会认为看到了一个什么样的颜色
![](../../images/color_and_perception_34.png)
![](https://lychee.inksoul.top/uploads/original/a8/3c/7b1b8665f0ac597f8a32754e238f.webp)
#### 同色异谱
@ -324,13 +323,13 @@ Lytro相机有下图这个人创办
下图中光谱的SPD完全不同但被人感知后可得到三个相同的结果
![](../../images/color_and_perception_35.png)
![](https://lychee.inksoul.top/uploads/original/d1/0c/51a322afe49470d417b780e76be2.webp)
* 应用
如图,可通过不同调节方式使两个颜色一致来表现显示器上太阳颜色,但混合后光谱可与之前的完全不同
![](../../images/color_and_perception_36.png)
![](https://lychee.inksoul.top/uploads/original/28/d0/1e5137589f3a663f845451c4180c.webp)
## 颜色复制/匹配
@ -346,7 +345,7 @@ Lytro相机有下图这个人创办
类似于调和不同颜料会越调越黑
![](../../images/color_and_perception_37.png)
![](https://lychee.inksoul.top/uploads/original/c5/05/594aedc2e35f1b5e69125fc29c12.webp)
### 加色实验
@ -356,28 +355,28 @@ Lytro相机有下图这个人创办
如下图,给定任何一个颜色,希望用三种不同颜色混合匹配得到相同颜色
![](../../images/color_and_perception_38.png)
![](https://lychee.inksoul.top/uploads/original/e9/d7/f8a294188f7c2fba683cb33759cb.webp)
左侧为给定颜色,右侧为混合颜色,每个颜色存在系数
![](../../images/color_and_perception_39.png)
![](https://lychee.inksoul.top/uploads/original/3b/a1/48fcc33818001ce8671c4e50b0a3.webp)
即找到三种颜色系数的值混合后得到左边颜色
![](../../images/color_and_perception_40.png)
![](https://lychee.inksoul.top/uploads/original/5f/3f/291fd907b33ba12d6343e1ce529a.webp)
* 实验二
有时存在左边的颜色右边无法混合得到的情况
![](../../images/color_and_perception_41.png)
![](https://lychee.inksoul.top/uploads/original/0e/82/ab2d66640d02123045c4785a953f.webp)
可在左边给定的颜色上加上一个颜色,类似于右边对应减去这个颜色
多个不同颜色混合得到一个颜色,存在负值可能
![](../../images/color_and_perception_42.png)
![](https://lychee.inksoul.top/uploads/original/cd/f9/63375d7e462e4a3dc6b03a92a62c.webp)
#### CIE RGB配色实验
@ -387,7 +386,7 @@ CIE是一个组织定义了RGB系统给定的任何一个颜色是单波
使用三种单色的光
![](../../images/color_and_perception_43.png)
![](https://lychee.inksoul.top/uploads/original/83/63/8031baa3033eae75f698313e9fb7.webp)
#### 颜色匹配函数:
@ -395,7 +394,7 @@ CIE是一个组织定义了RGB系统给定的任何一个颜色是单波
做颜色匹配时给定一个固定波长需要将这3个颜色中相同波长的值混合起来
![](../../images/color_and_perception_44.png)
![](https://lychee.inksoul.top/uploads/original/76/78/88f05fe0854a621017ff9ad91c9f.webp)
* 实际光(多波长)
@ -403,7 +402,7 @@ CIE是一个组织定义了RGB系统给定的任何一个颜色是单波
这三个颜色每一个积分出来会得到三个数
![](../../images/color_and_perception_45.png)
![](https://lychee.inksoul.top/uploads/original/86/a9/f67a26ad0fe900d1b825651c213c.webp)
### 颜色空间
@ -424,7 +423,7 @@ CIE XYZ系统人为定义了一个颜色匹配函数
* 绿色曲线分布比较对称对应的y函数匹配出来的数Y在一定程度上可以表示颜色的亮度
* 红色有2个峰值没有负数这些函数都分布在可见光的范围内
![](../../images/color_and_perception_46.png)
![](https://lychee.inksoul.top/uploads/original/c2/08/028c1e6a79c4c17ca393fb656649.webp)
二维可视化XYZ
@ -440,7 +439,7 @@ $$z = \frac{Z}{X+Y+Z}$$
改变Y即为改变亮度
![](../../images/color_and_perception_47.png)
![](https://lychee.inksoul.top/uploads/original/d8/2d/5e6ed9f7763b5b686b43b88d0162.webp)
* 色域
@ -448,13 +447,13 @@ $$z = \frac{Z}{X+Y+Z}$$
色域有一个白色中心,纯色都在边界上
![](../../images/color_and_perception_48.png)
![](https://lychee.inksoul.top/uploads/original/bd/c9/40db053110395179c46341a6d9f7.webp)
不同颜色空间表示的颜色范围不一样
下图sRGB只能表示很小的三角形部分的色域
![](../../images/color_and_perception_49.png)
![](https://lychee.inksoul.top/uploads/original/af/a4/3154fcae732d736425e3c6a80717.webp)
### Perceptually Organized Color Spaces
@ -482,7 +481,7 @@ b轴上蓝和黄在两端
LAB空间认为任何一个轴上两端都是互补色
![](../../images/color_and_perception_50.png)
![](https://lychee.inksoul.top/uploads/original/fe/9d/9dbb05bc6e37bd19e801c2ba0b7a.webp)
#### 互补色理论
@ -498,11 +497,11 @@ LAB空间认为任何一个轴上两端都是互补色
如下图A你会觉得B比A亮
![](../../images/color_and_perception_51.png)
![](https://lychee.inksoul.top/uploads/original/c3/39/a6869264938401a31478c7f027e4.webp)
挡住A、B以外区域会发现A和B颜色相同
![](../../images/color_and_perception_52.png)
![](https://lychee.inksoul.top/uploads/original/d9/61/96d80db038b21aee30367ea38bf2.webp)
## 减色系统(CMYK)
@ -514,10 +513,10 @@ Cyan蓝绿色、Magenta品红色、Yellow黄色、Key黑色
![](../../images/color_and_perception_53.png)
![](https://lychee.inksoul.top/uploads/original/74/82/9e6bea67f2af82cbee8bd254eec9.webp)
C、M、Y可以通过混合得到各种不同的颜色所以在打印上可以通过混合各种各样不同墨水调出各种各样不同的颜色
![](../../images/color_and_perception_54.png)
![](https://lychee.inksoul.top/uploads/original/38/fd/210d3c87c0c2752b300b804271a1.webp)
印刷上要考虑成本正常情况下打印东西以黑色居多而且黑色的墨水好制作便宜C、M、Y这三种带颜色的墨水不容易制作那用这三种颜色混合得到黑色成本就比直接用黑色高因而需要黑色墨水

View File

@ -20,13 +20,13 @@ date: 2022-07-20T17:56:31+08:00
Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
![](../../images/Ray-Intersection_With_Box.png)
![](https://lychee.inksoul.top/uploads/original/75/2c/74e6499d35fa126ec6d1b9015870.webp)
#### 射线与轴对称包围盒相交(Ray Intersection with Axis-Aligned Box)
以下2D例子在3D场景中同样适用
![](../../images/Ray_Intersection_With_AABB.png)
![](https://lychee.inksoul.top/uploads/original/4b/93/d9bd9bfdf2ee381f92cee7468497.webp)
如上图所示,我们分别计算射线与包围盒两个边界的相交时间点,求取到$t_{min}/t_{max}$的交集
@ -44,7 +44,7 @@ Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
选择轴对称的原因:计算量少
![](../../images/Why_Axis-Aligned.png)
![](https://lychee.inksoul.top/uploads/original/60/74/f0d17b99d406a39c91fabaeff244.webp)
### 统一空间分区\网格(Uniform Spatial Partitions/Grids)
@ -53,22 +53,22 @@ Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
找到包围盒
![](../../images/grid_build_progress_step1.png)
![](https://lychee.inksoul.top/uploads/original/84/45/9ba38ca4b7d12319286d11479b7d.webp)
创建网格
![](../../images/grid_build_progress_step2.png)
![](https://lychee.inksoul.top/uploads/original/f1/76/e2fac383f64356b52ee597e7c9fe.webp)
在与相应物体重叠的网格中存储对应的物体
![](../../images/grid_build_progress_step3.png)
![](https://lychee.inksoul.top/uploads/original/40/2d/6723c4488a9ef3c3094e9c31f044.webp)
根据射线穿过的网格顺序来遍历网格
对于每一个被遍历的网格,需要检测其中存储的物体是否与射线相交
![](../../images/Ray_Scene_intersection_grid.png)
![](https://lychee.inksoul.top/uploads/original/0b/8b/4d41b2e73c3709387402c2a780ba.webp)
------------------------
@ -76,11 +76,11 @@ Bounding Box(BB)的任意一侧沿着X,Y,或Z轴
网格仅有一个时无法起到加速算法的效果
![](../../images/grid_resolution_one_cell.png)
![](https://lychee.inksoul.top/uploads/original/e4/e7/b311bbb61e70e83a80ec965af6f5.webp)
网格过多时,因需要遍历过多无关网格而低效
![](../../images/grid_resolution_too_many.jpg)
![](https://lychee.inksoul.top/uploads/original/1f/cf/c066eaa2d91271e58650b833d37d.webp)
最佳的网格数量为:
$$cells = C * objs$$
@ -98,8 +98,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
#### 八叉树(Oct-Tree)
将整个场景包围在盒中再将包围盒切分为8份(三维情况下,每面四块),下图展示的是二维下的情况,将整个盒子分为四块,再将每块都分成四块,直到每个格子中无物体或物体数量足够少
![](../../images/Oct-Tree.png)
![](https://lychee.inksoul.top/uploads/original/76/7d/93e3c7b7070dddd2b24f5a36f9d1.webp)
通过这种方式将空间切成了分块并组织成了树状结构(一维下为二叉树,二维下为四叉树,三维下为八叉树,$n维下为2^n叉树$)
@ -109,7 +108,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
该方法是对空间进行二分的方法即每次都选择一个方向将节点划分开与KD-Tree不同在于其并非横平竖直地划分且计算难度随维度升高而增加
![](../../images/BSP-Tree.png)
![](https://lychee.inksoul.top/uploads/original/ba/1f/6c6884e087f5a35420c1c47edbd4.webp)
二维下用一条线划分,三维下用一个平面划分,四维用‘超平面’划分,依次类推
@ -119,7 +118,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
与八叉树几乎相同,但每找到一个格子后总是沿着某一个轴分开使整个空间被划分成类似二叉树的结构,如下图所示,划分是水平竖直交替进行的
![](../../images/KD-Tree.png)
![](https://lychee.inksoul.top/uploads/original/4a/4d/3204bc155df7c4c6518a70c1b490.webp)
三维下划分轴在X,Y,Z轴间轮替就可以在保持二叉树性质的情况下进行划分
@ -127,7 +126,7 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
将整个场景包围在盒子A中先沿着竖直方向划分再将这两个部分横向划分开之后一直交替向下划分形成一棵树
![](../../images/KD-Tree_Pre-Processing.png)
![](https://lychee.inksoul.top/uploads/original/63/59/9ef0aea56f6a5094d3b65b72f039.webp)
如果一个空间已经被划分成了KD-Tree结构则中间节点(A,B,C,D)只需要记录被划分成的各自格子,叶子节点则存储和格子相交的几何形体
@ -147,31 +146,33 @@ $$C \approx 27 \\ \\ in \\ \\ 3D$$
假设有一根光线从左上到右下穿过一个包围盒A
![](../../images/Traversing_a_KD-Tree_step1.png)
![](https://lychee.inksoul.top/uploads/original/59/4f/fa1a12e672f2e5cabe4face2ae8e.webp)
第一次判断是否与A存在交点光线有交点则可能与左右子节点产生交集
![](../../images/Traversing_a_KD-Tree_step2.png)
![](https://lychee.inksoul.top/uploads/original/6b/ba/58d7520d473e12f54b71c121b41e.webp)
检测是否与子节点存在交点发现与左边蓝色区域存在交点按图中划分1不再划分的情况下则认为光线与该叶子节点(蓝色区域内)所有物体求交
![](../../images/Traversing_a_KD-Tree_step3.png)
![](https://lychee.inksoul.top/uploads/original/67/88/b839b3b32d5298601f1680cd0dc0.webp)
检查右子节点发现与右边区域也有交点则光线可能和B的子节点(2和C)相交
![](../../images/Traversing_a_KD-Tree_step4.png)
![](https://lychee.inksoul.top/uploads/original/66/ad/a9ae8b08636d8a7984ba056c0583.webp)
再判定光线与2和C区域相交情况发现与2存在交点此处假设2不再细分2即为一个叶子节点光线需要和2中所有物体求交
![](../../images/Traversing_a_KD-Tree_step5.png)
![](https://lychee.inksoul.top/uploads/original/d4/f4/d65b0bae7ce695a3e3e3b4594199.webp)
发现与C区域存在交点那便要判断光线和C的子节点(D、3)是否有交点发现和3存在交点且3为叶子节点则光线要和3中的所有物体求交D同理一直求到叶子节点(区域5与光线无交点无需求交)
![](../../images/Traversing_a_KD-Tree_step6.png)
![](https://lychee.inksoul.top/uploads/original/0f/01/81be49bf912712fc71ca2869c0d0.webp)
在C中光线和所有物体求交就找到了交点
![](../../images/Traversing_a_KD-Tree_step7.png)
![](https://lychee.inksoul.top/uploads/original/b1/3a/fb09465181d82ad5136ee4ae81b7.webp)
![](https://lychee.inksoul.top/uploads/original/08/f5/8e22629a6b19d5b8a1e67eddfb62.webp)
##### KD-Tree的问题
@ -194,17 +195,18 @@ BVH无论在实时的光线追踪还是离线的结构都解决了KD-Tree的问
同样将场景用一个盒子包围与KD-Tree不同在于后者将物体划分为2个部分
![](../../images/BVH_build_step1.png)
![](https://lychee.inksoul.top/uploads/original/b8/2c/1478b56989d2e948b73223049dbf.webp)
将上图方框中所有三角形分割成两个部分再重新求它们的包围盒
![](../../images/BVH_build_step2.png)
![](https://lychee.inksoul.top/uploads/original/5d/54/5154e66032877f5f30686aba698f.webp)
同样再继续划分,将上图蓝色节点划分为两堆三角形再重新求它们的包围盒,对应下图蓝绿节点
![](../../images/BVH_build_step3.png)
![](https://lychee.inksoul.top/uploads/original/15/cd/11da669fd926cd2e253cf1dc6775.webp)
划分终止条件自定义如一个节点中只有5个三角形存在
![](https://lychee.inksoul.top/uploads/original/3b/0b/206e2697977dba004d4f647666c4.webp)
总结:
1. 找到一个包围盒
@ -269,7 +271,7 @@ BVH无论在实时的光线追踪还是离线的结构都解决了KD-Tree的问
1. 节点本身为叶子节点,此时光线与叶子节点里所有物体求交,放回最近交点
2. 节点本身不是叶子节点,此时光线可能与该节点的两个子节点都有交点,递归地求出它们的交点再返回最近的点
![](../../images/BVH_Traversal.png)
![](https://lychee.inksoul.top/uploads/original/73/29/96c60176fc6d34d987528f1627d8.webp)
##### 空间/物体划分区别
@ -278,13 +280,13 @@ BVH无论在实时的光线追踪还是离线的结构都解决了KD-Tree的问
1. 划分空间,任何一个节点在空间和时间之间不会有交集
2. 有些物体存在横跨边界的可能
![](../../images/eg_spatial_partition.png)
![](https://lychee.inksoul.top/uploads/original/0e/da/05b130c98aa096aaf9cd98997ebe.webp)
* 物体划分(Object partition)
1. 划分物体,物体分为两部分后分别计算包围盒
2. 包围盒存在交集的可能,但不产生影响且无需计算包围盒相交方式
![](../../images/eg_object_partition.png)
![](https://lychee.inksoul.top/uploads/original/40/c9/39c6f69ece8a3caced9f44b5a9ef.webp)
-----------------------------------------

View File

@ -47,7 +47,7 @@ $$f(x,y,z) = (2 - \sqrt{x^2 + y^2})^2 + z^2 - 1$$
对应的几何形状如下图
![](../../images/eg_sample_can_be_hard.png)
![](https://lychee.inksoul.top/uploads/original/c8/04/193583984ebe05f31d8c78e4ec03.webp)
###### 易于判断内外关系
@ -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$$
![](../../images/eg_in_outside_test_easy.png)
![](https://lychee.inksoul.top/uploads/original/be/87/16c2d19a9e52bc2c929ff5d17059.webp)
对于点$(\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中多项式的零集
![](../../images/Algebraic_Surfaces.png)
![](https://lychee.inksoul.top/uploads/original/3e/24/215f8623b87286edd5a1573ed171.webp)
###### 构造实体几何(Constructive Solid Geometry)
通过布尔计算组合构造隐式几何
![](../../images/Constructive_Solid_Geometry.png)
![](https://lychee.inksoul.top/uploads/original/61/39/99a56f90a4b9b63a1c540fe6de8a.webp)
###### 距离函数(Distance Functions)
@ -83,7 +83,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
使用距离函数将两个曲面混合在一起
![](../../images/eg_Distance_Functions.png)
![](https://lychee.inksoul.top/uploads/original/af/eb/9f848687bbc6d63c5c5cba0123bc.webp)
###### 水平集(Level Set Method)
@ -92,7 +92,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
解决方案:存储值相似的函数网格
![](../../images/Level_Set_grid.png)
![](https://lychee.inksoul.top/uploads/original/6e/12/fd8bcae7fdf63e72ed964e155075.webp)
插值为零的值的位置即为表面
@ -105,7 +105,7 @@ $$f(x,y,z) = x^2 + y^2 + z^2 - 1$$
该几何形状表现为所有尺度的细节都存在自相似性(一种描述自然现象的说法),往往难以控制形状
![](../../images/eg_Factals.png)
![](https://lychee.inksoul.top/uploads/original/a5/da/39b6c7fa99f5bc3a07526b391d02.webp)
---------------------------------------
@ -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)$$
![](../../images/eg_explict_mapping.png)
![](https://lychee.inksoul.top/uploads/original/7b/e1/25734db95071886eb41b0cd3c714.webp)
###### 易于采样
@ -137,7 +137,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
若要判定点$f(u,v)$是否位于表面,则只需将$(u,v)$的值相加
![](../../images/eg_sample_can_be_hard.png)
![](https://lychee.inksoul.top/uploads/original/c8/04/193583984ebe05f31d8c78e4ec03.webp)
###### 难以判断内外关系
@ -157,7 +157,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
4. 通常转换为多边形网格
5. 难以用于采样不足的区域
![](../../images/eg_point_cloud.png)
![](https://lychee.inksoul.top/uploads/original/1e/07/6d3f59580c7fe84982e5da88f9a7.webp)
###### 多边形网格(Polygon Mesh)
@ -168,7 +168,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
4. 图形中最常见的表示形式
![](../../images/eg_polygon_mesh.png)
![](https://lychee.inksoul.top/uploads/original/88/24/ef04d08cdb54b2afaa1e748990d0.webp)
@ -176,7 +176,7 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
### 表现形式应根据目标几何模型选择最合适的类型,没有最好的表现形式
![](../../images/David_Baraff.png)
![](https://lychee.inksoul.top/uploads/original/f5/6f/09d2640dd431bff3cc00ca997da5.webp)
------------------------------
@ -187,51 +187,51 @@ $$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$
贝塞尔曲线完全由其控制点决定其形状,$n$个控制点对应着$n-1$阶的贝塞尔曲线,并且可以通过递归的方式来绘制.
![](../../images/Defining_Bezier_Curve_Tangents.png)
![](https://lychee.inksoul.top/uploads/original/95/1c/12cd40c107be62358a9fee9ae113.webp)
#### de Casteljau Algorithm(图形)
假设存在三个点(quadratic Bezier)
![](../../images/de_Casteljau_Algorithm_step1.png)
![](https://lychee.inksoul.top/uploads/original/f1/94/1a5dbb7e377e51bb43535d5c766f.webp)
通过线性插值的方式插入一个点
![](../../images/de_Casteljau_Algorithm_step2.png)
![](https://lychee.inksoul.top/uploads/original/4f/47/ccc6150f5dd2b304a3daeef2fe85.webp)
在另一边也通过同样方式插入一个点
![](../../images/de_Casteljau_Algorithm_step3.png)
![](https://lychee.inksoul.top/uploads/original/29/bf/91f50a55454821350431093bfaa9.webp)
递归重复
![](../../images/de_Casteljau_Algorithm_step4.png)
![](https://lychee.inksoul.top/uploads/original/ef/1c/cd8097c821a05c6286645f4007be.webp)
对于在$[0,1]$区间的每个t点都使用相同算法进行计算
![](../../images/de_Casteljau_Algorithm_step5.png)
![](https://lychee.inksoul.top/uploads/original/5f/92/28616075bc923a3549204fe15b3e.webp)
构造一个三次方贝塞尔曲线需要总共四个输入,都递归使用线性插值
![](../../images/de_Casteljau_Algorithm_step6.png)
![](https://lychee.inksoul.top/uploads/original/0c/6f/5ace13932a2012e6f4233cba10dc.webp)
可视化算法流程
![](../../images/Visualizing_de_Casteljau.png)
![](https://lychee.inksoul.top/uploads/original/2e/51/2f7c8545f2fc5691223c34e7f63a.webp)
#### de Casteljau Algorithm(数学公式)
de Casteljau 算法给出各点间金字塔型的变量关系
![](../../images/de_Casteljau_pyramid_of.png)
![](https://lychee.inksoul.top/uploads/original/3d/7b/bfaede63b9e7e7319f45c97ab3e9.webp)
##### 推导流程
![](../../images/de_Casteljau_Algorithm_step5.png)
![](https://lychee.inksoul.top/uploads/original/5f/92/28616075bc923a3549204fe15b3e.webp)
$$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$$
贝塞尔基本函数
![](../../images/Cubic_Bezier_Basis_Functions.png)
![](https://lychee.inksoul.top/uploads/original/aa/68/3341ee9647d234a8dbae220be242.webp)
插值端点:$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$$
样例:
![](../../images/Demon_Piecewise_Cubic_Bezier_Curve.png)
![](https://lychee.inksoul.top/uploads/original/75/9f/896f75a7e9d1f3008aab1ae4f835.webp)
#### 组合计算
@ -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$$
![](../../images/Continuity_Piecewise_Bezier_step1.png)
![](https://lychee.inksoul.top/uploads/original/45/57/4789c656d1a2c21a41b9385e742d.webp)
$c^0$处的连续性:$a_n = b_0$
![](../../images/Continuity_Piecewise_Bezier_step2.png)
![](https://lychee.inksoul.top/uploads/original/7c/82/3c960f4d3e19fc5807b5738a80dc.webp)
$c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
![](../../images/Continuity_Piecewise_Bezier_step3.png)
![](https://lychee.inksoul.top/uploads/original/e3/89/648a8cd5eb14fbfba1a397b6cc75.webp)
------------------------------------
@ -312,7 +312,7 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
输出:由$[0,1]^2$ 参数化的2D平面
![](../../images/bezier_surface_eg.png)
![](https://lychee.inksoul.top/uploads/original/f5/ec/79ae23f6e2e4530e0ba1f9bc142b.webp)
#### 计算方法
@ -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
![](../../images/evaluation_of_bezier_surface.png)
![](https://lychee.inksoul.top/uploads/original/0b/f0/f4701caa879ab18030b48376b188.webp)
可视化计算流程:
![](../../images/visual_evaluation_of_bezier_surface.png)
![](https://lychee.inksoul.top/uploads/original/36/bf/3bd791c5f5a17d5c3f26f850f3ba.webp)
@ -335,7 +335,7 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
目的:提高分辨率
![](../../images/eg_mesh_subdivision.png)
![](https://lychee.inksoul.top/uploads/original/d0/cc/7333df5660e016d8ffb5a45bfe5a.webp)
通常做法:
@ -350,20 +350,20 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
新顶点:
![](../../images/loop_subdivision_new.png)
![](https://lychee.inksoul.top/uploads/original/57/e2/d786ac3815c29f5d34b67ed0aa19.webp)
白点即为新顶点,其位置为周围四个顶点的权重之和
旧顶点:
![](../../images/loop_subdivision_old.png)
![](https://lychee.inksoul.top/uploads/original/de/79/ecf48bb17496b5b7209ff928a916.webp)
白色旧顶点也是自身及邻接顶点的权重之和,权重的设置与旧顶点度数关联
##### Catmull-Clark Subdivision
![](../../images/catmull-clark_subdivision1.png)
![](https://lychee.inksoul.top/uploads/original/68/24/19d65e885b801b2ed369cabe987c.webp)
定义:
@ -373,7 +373,7 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
第一次细分后结果:
![](../../images/catmull-clark_subdivision2.png)
![](https://lychee.inksoul.top/uploads/original/c4/7f/dabfbdbd6e5429a6ec89984f0af1.webp)
特点:
@ -384,28 +384,28 @@ $c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$
Catmull-Clark 顶点更新规则
![](../../images/Catmull-Clark_Vertex_Update_Rules.png)
![](https://lychee.inksoul.top/uploads/original/c9/49/b26d214ade9cf28881ffe9148b51.webp)
##### 收敛性:整体形状和折痕
![](../../images/convergence_of_loop_and_catmull.png)
![](https://lychee.inksoul.top/uploads/original/25/a0/ea1f9be5d2cf00752d6c72577087.webp)
#### 曲面简化(Mesh Simplification)
目的:降低分辨率的同时尽量保持形状/外观
![](../../images/eg_mesh_simplification.png)
![](https://lychee.inksoul.top/uploads/original/61/09/fa5c1ed4b98a5993b8514fca272d.webp)
##### 边坍缩
边坍缩是曲面简化的常用方法,如上图所示将一条边的两个顶点合成为一个顶点,出于尽量保持形状的目的,需要正确选择不影响或影响最小的边进行坍缩,由此引入二次误差度量(Quadric Error Metrics)
![](../../images/Collapsing_An_Edge.png)
![](https://lychee.inksoul.top/uploads/original/a4/2f/2e494a0a1410ebf9c149840b551b.webp)
###### 二次误差度量(Quadric Error Metrics)
![](../../images/Quadric_Error_Metrics.png)
![](https://lychee.inksoul.top/uploads/original/47/d9/384c2d3346e8783afdae4e02dcfd.webp)
坍缩之后蓝色新顶点所在位置与原来各个平面的垂直距离之和,如此误差最小则整个模型样貌修改一定程度也会较小
@ -418,7 +418,7 @@ Catmull-Clark 顶点更新规则
符合贪心算法标准,无法获得最优解,但效果依旧合适
![](../../images/eg_Quadric_Error_Mesh_Simplification.png)
![](https://lychee.inksoul.top/uploads/original/14/5f/272efa934dd14c57431eb8de7fbc.webp)
-------------------------------------------
@ -436,7 +436,7 @@ Shadow Mapping是一种基于图像的算法
Pass1:render from light
1. 获得从光源视角得到的深度图像
![](../../images/render_from_light.png)
![](https://lychee.inksoul.top/uploads/original/11/ca/7aa9751718ad4f6e0d4b0d35f1a4.webp)
Pass2:render from eye
1. 从观看视角(相机视角)获得带有深度的标准图像
@ -444,7 +444,7 @@ Pass2:render from eye
1. 光源和观看视角的下的深度相同时为可见
2. 光源和观看视角下的深度不相同则为被阻挡
![](../../images/project_to_light.png)
![](https://lychee.inksoul.top/uploads/original/82/17/7a25421d491d38cc5992efc66af1.webp)
----------------------------------------------

View File

@ -24,7 +24,7 @@ date: 2022-08-01T16:38:54+08:00
* 远古人类壁画
![](../../images/animation_part1_1.png)
![](https://lychee.inksoul.top/uploads/original/69/fe/170e7b5edbc9c85c271294596cc4.webp)
* 圆盘转动
@ -32,14 +32,14 @@ date: 2022-08-01T16:38:54+08:00
最早起,有类似圆盘的物体,可固定在某处,可以旋转
![](../../images/animation_part1_2.png)
![](https://lychee.inksoul.top/uploads/original/91/e5/ea335d60172db6b670f2975963af.webp)
* 第一部电影
早期不用于娱乐,是一种科学研究的设备,如下图拍摄奔跑中的马可用于研究马匹运动时四肢动态
![](../../images/animation_part1_3.png)
![](https://lychee.inksoul.top/uploads/original/1b/02/09a715de1112299c19e8217e426e.webp)
* 第一部与电影时长相当的动画
@ -47,28 +47,28 @@ date: 2022-08-01T16:38:54+08:00
每秒播放24帧制作耗时极长
![](../../images/animation_part1_4.png)
![](https://lychee.inksoul.top/uploads/original/09/2a/9fd8b848f4070e6c97dd524e1bfe.webp)
* 第一部计算机生成的动画
可追溯至1963年
![](../../images/animation_part1_5.png)
![](https://lychee.inksoul.top/uploads/original/84/43/2c81a52d7eb11bd5e7de896e8172.webp)
* 早期计算机动画
如下图为人脸的三维结构网格,已经可以做到人物面部表情
![](../../images/animation_part1_6.png)
![](https://lychee.inksoul.top/uploads/original/8c/28/6defda6c706bd27c8d1949c8e25a.webp)
* 电子(计算机生成)恐龙(Digital Dinosaurs)
如下图,侏罗纪公园,真正将计算机生成的恐龙放入电影中
![](../../images/animation_part1_7.png)
![](https://lychee.inksoul.top/uploads/original/15/68/0a248231185adaefa14cea1beb9b.webp)
* 第一部计算机生成的电影时长动画
@ -78,21 +78,20 @@ date: 2022-08-01T16:38:54+08:00
采用光栅化的方式生成阴影效果
![](../../images/animation_part1_8.png)
![](https://lychee.inksoul.top/uploads/original/7c/92/3fcfb3ec1a1670e327ca655b2aae.webp)
* 十年前的计算机动画
依旧缺少一些细节
![](../../images/animation_part1_9.png)
![](https://lychee.inksoul.top/uploads/original/3c/75/b156264407b97a0c032bdf271124.webp)
* 2019-冰雪奇缘2
充满各种细节
![](../../images/animation_part1_10.png)
![](https://lychee.inksoul.top/uploads/original/47/0c/8bb9da7b669554f4c40154b3e227.webp)
## 关键帧动画
@ -102,7 +101,7 @@ date: 2022-08-01T16:38:54+08:00
![](../../images/animation_part1_11.png)
![](https://lychee.inksoul.top/uploads/original/17/a4/5b0122bc208f2b4a25a727c9b5d4.webp)
### 关键帧插值
@ -115,7 +114,7 @@ date: 2022-08-01T16:38:54+08:00
最简单的是线性插值,但下图为非线性插值
![](../../images/animation_part1_12.png)
![](https://lychee.inksoul.top/uploads/original/95/5b/9f9362dca1ce218c25cabd65eb15.webp)
线性插值:
@ -124,7 +123,7 @@ date: 2022-08-01T16:38:54+08:00
有时需要更好的连续性,就需要用到曲线和样条,这说明几何和动画之间时存在联系的
![](../../images/animation_part1_13.png)
![](https://lychee.inksoul.top/uploads/original/1f/ff/55fee0e5831219476b68e7a88a85.webp)
-------------
@ -145,21 +144,21 @@ a物体的加速度
1. 小球在重力影响下抛出时会形成抛物线
2. 衣服可认为由网格形成,任何一个顶点有一定质量,受重力影响,也受其他点作用的力的影响
![](../../images/animation_part1_14.png)
![](https://lychee.inksoul.top/uploads/original/08/1a/b79191b65dfbd839ef5c6da1e58d.webp)
#### 案例
* 布料模拟
![](../../images/animation_part1_15.png)
![](https://lychee.inksoul.top/uploads/original/58/8a/714417b23f6b487ccc8424ce0e04.webp)
* 流体仿真
1. 模拟水的运动和水滴的形成位置
2. 模拟了位置和形状后进行渲染得到样式
![](../../images/animation_part1_16.png)
![](https://lychee.inksoul.top/uploads/original/7b/33/2f39c81ab6141d0b696fe69edd2e.webp)
### 质点弹簧系统
@ -169,25 +168,25 @@ a物体的加速度
将一根绳子模拟成很多小的弹簧,允许其在重力作用下来回摆动
![](../../images/animation_part1_17.png)
![](https://lychee.inksoul.top/uploads/original/f3/87/657ac68a001d4880536edb396222.webp)
* 头发
![](../../images/animation_part1_18.png)
![](https://lychee.inksoul.top/uploads/original/0e/57/6f449c9fad1a7b0dd823140f472d.webp)
* 布料
布料是由网格描述的,可以使用各种不同的质点弹簧系统描述,还可使用一个点进行拖拽
![](../../images/animation_part1_19.png)
![](https://lychee.inksoul.top/uploads/original/41/b7/bfa7f802753527a30b6b249567cf.webp)
建模足够好的情况下,模拟与仿真可以做到与现实几乎一致
![](../../images/animation_part1_20.png)
![](https://lychee.inksoul.top/uploads/original/27/f0/b66d3828257917166731a11d8b58.webp)
上图受限于PDF建议结合games101第21课
@ -197,7 +196,7 @@ a物体的加速度
* 最基础的单元:一个弹簧两侧连着两个质点
![](../../images/animation_part1_21.png)
![](https://lychee.inksoul.top/uploads/original/a1/51/e6476b00d7e011face8ab9cd6d02.webp)
* 理想的弹簧(无长度,产生的力与被拉长的长度成比例)
@ -239,7 +238,7 @@ $$\ddot{x} = a$$
![](../../images/animation_part1_22.png)
![](https://lychee.inksoul.top/uploads/original/21/91/130176d566d333b3404ff75bf4fb.webp)
问题:
@ -253,7 +252,7 @@ $$\ddot{x} = a$$
大小下图红框部分a和b之间的相对速度投影在ab方向上的速度
![](../../images/animation_part1_23.png)
![](https://lychee.inksoul.top/uploads/original/f3/7e/8ccf236c04eb4e5c36830bf4e1ec.webp)
#### 弹簧结构
@ -262,20 +261,20 @@ $$\ddot{x} = a$$
如下图可以每2根共用一个质量表示一张平面也可以在三维空间中进行连接
![](../../images/animation_part1_24.png)
![](https://lychee.inksoul.top/uploads/original/88/ab/11f5e382cf7b68297cbaeb96776a.webp)
##### 使用各种弹簧模拟一块布
1. 问题1切变会受影响
2. 问题2存在一种力让整个形状变得不是一个平面
![](../../images/animation_part1_25.png)
![](https://lychee.inksoul.top/uploads/original/d2/40/e5eb6a92debb32b3bf3a08cea1a4.webp)
* 加入斜的对角线解决切边
在以上的形状中加入斜的对角线,发生切变时,新加的蓝线会被压缩,那弹簧就会向外抵抗它
![](../../images/animation_part1_26.png)
![](https://lychee.inksoul.top/uploads/original/77/7b/edb65b07ed992fe0afa78a8fa6e1.webp)
存在结构不对称问题,无法使模拟的布在任何一个方向拉它,它的行为保持一致
@ -283,7 +282,7 @@ $$\ddot{x} = a$$
不能抵抗非平面的弯曲(沿着竖的或横的线折叠)
![](../../images/animation_part1_27.png)
![](https://lychee.inksoul.top/uploads/original/36/ec/c870575fada9b16b1a7f87f6f310.webp)
* 加上跳过相邻质点的连接线
@ -291,7 +290,7 @@ $$\ddot{x} = a$$
红线的连接是非常弱的,蓝线非常强
![](../../images/animation_part1_28.png)
![](https://lychee.inksoul.top/uploads/original/36/21/396ecf86137251bea18a00409ffa.webp)
* 例子
@ -300,15 +299,14 @@ $$\ddot{x} = a$$
简化的表示,未表示纤维、股和线等之间的力的关系
![](../../images/animation_part1_29.png)
![](https://lychee.inksoul.top/uploads/original/8a/39/fedc0a84a0202488d68659249f90.webp)
* 拓展
除了质点弹簧系统还有其他的方法比如有限元方法FEM (Finite Element Method)),这个方法被广泛应用于车辆碰撞,能够表现力之间的传导作用
![](../../images/animation_part1_30.png)
![](https://lychee.inksoul.top/uploads/original/40/06/d9c07aa2f5018d62c7a23d3658a0.webp)
### 粒子系统
用于描述一些很小很小移动的东西
@ -320,8 +318,7 @@ $$\ddot{x} = a$$
粒子越多模拟得越精细,但是越慢;越少,计算速度越快,但效果差一些
![](../../images/animation_part1_31.png)
![](https://lychee.inksoul.top/uploads/original/37/27/1a0a283451482436fcbfa515c74d.webp)
#### 存在问题
1. 粒子系统可以模拟流体,这样可能需要很多粒子
@ -356,17 +353,17 @@ $$F_g = G\frac{m_1m_2}{d^2}$$
$$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
![](../../images/animation_part1_32.png)
![](https://lychee.inksoul.top/uploads/original/83/19/7949247217022d2a0015b109b7d3.webp)
* 银河模拟
![](../../images/animation_part1_33.png)
![](https://lychee.inksoul.top/uploads/original/fa/6a/f7d05d02b1bf8961b522ca158ae2.webp)
* 基于粒子的流体模拟
模拟的是粒子,渲染的是像玻璃、是否带白沫
![](../../images/animation_part1_34.png)
![](https://lychee.inksoul.top/uploads/original/4a/80/c2d64b96b2589e75a9c809780a56.webp)
#### 粒子间相互作用
@ -382,16 +379,16 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
有了以上的属性就可以通过粒子的方法解出来
![](../../images/animation_part1_35.png)
![](https://lychee.inksoul.top/uploads/original/f5/7a/2b0581f348355d96d40bd7c01919.webp)
* 分子结构
![](../../images/animation_part1_36.png)
![](https://lychee.inksoul.top/uploads/original/6f/dc/8e032f19d236beec8a914fa0a2cb.webp)
* 人群
![](../../images/animation_part1_37.png)
![](https://lychee.inksoul.top/uploads/original/7e/dd/e8451f29329352fba44126fd9e48.webp)
## 运动学
@ -403,13 +400,12 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
用于描述和人骨骼连接拓扑结构类似的结构,可定义不同的关节
![](../../images/animation_part1_38.png)
![](https://lychee.inksoul.top/uploads/original/36/fd/ae79857eaf72feb882adb2cde845.webp)
* Pin
钉子钉住后只能在钉住的平面内往一个方向旋转
![](../../images/animation_part1_39.png)
![](https://lychee.inksoul.top/uploads/original/75/85/a36f2fdf0c94e8b69255530c3695.webp)
* Ball
@ -421,18 +417,18 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
可以拉长,也就是可以有一些移动
![](../../images/animation_part1_40.png)
![](https://lychee.inksoul.top/uploads/original/a1/0d/ba8c57b973d4695b45ea43b42872.webp)
#### 一个简单的关节
如下图,只能在平面内发生旋转,类似于肩和肘的旋转,假设第一段旋转$\theta_1$度,第二段旋转$\theta_2$度,如何确定尖端位置
![](../../images/animation_part1_41.png)
![](https://lychee.inksoul.top/uploads/original/a6/d3/c1756406f6859030a56d6f4e783c.webp)
先算出上方黑点的位置,因为$\theta_2$是在$\theta_1$的基础上旋转的,可以用$\theta_1$加$\theta_2$计算
![](../../images/animation_part1_42.png)
![](https://lychee.inksoul.top/uploads/original/9b/f5/3c75fd3c7a33567c15be40d1c3c8.webp)
因此,正向运动学需要定义好连接方式,定义好它们之间的各种位置,就可以找到各种点的位置
@ -440,7 +436,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
人类行走动作模拟
![](../../images/animation_part1_43.png)
![](https://lychee.inksoul.top/uploads/original/d5/ae/bdd93465a7de8d59fa027b22c343.webp)
@ -462,11 +458,11 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
逆运动学可以手里捏着尖端到处移动,它会自动的调整它的关节的位置,使得尖端就在你要的位置上
![](../../images/animation_part1_44.png)
![](https://lychee.inksoul.top/uploads/original/42/29/fbe4075c1da0e8d24fffff342ba8.webp)
如下图中给出固定点P它就会给出$\theta_1$和$\theta_2$,解出这两个角度的过程比较复杂
![](../../images/animation_part1_45.png)
![](https://lychee.inksoul.top/uploads/original/6f/c4/c745c94384d2dc004d49ddff6a50.webp)
#### 问题
@ -475,17 +471,16 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
如图,尖端位置确定,但存在两个解
![](../../images/animation_part1_46.png)
![](https://lychee.inksoul.top/uploads/original/8a/e5/14d485685bf958565a67a4b0b0ba.webp)
![](../../images/animation_part1_47.png)
![](https://lychee.inksoul.top/uploads/original/c3/5e/ac51c7d4b948e07e334009b88f89.webp)
* 存在无解的情况
最上面的关节点只可能出现在下图的虚线上,尖端通过旋转可以在一个圆上,从而尖端只有可能在外层的圈和内层的圈之间,其他位置到不了
![](../../images/animation_part1_48.png)
![](https://lychee.inksoul.top/uploads/original/cd/8e/060f7740e704519bac9657cb7cfa.webp)
#### 问题优化
一般N维IK问题的数值求解
@ -503,7 +498,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
例子:
![](../../images/animation_part1_49.png)
![](https://lychee.inksoul.top/uploads/original/70/04/97e61b9eb511964de5cdda3d41e8.webp)
### 形状混合
@ -512,8 +507,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
实际为混合控制点及其影响区域
![](../../images/animation_part1_50.png)
![](https://lychee.inksoul.top/uploads/original/81/6d/c0730643c3213c004e9b57f2f083.webp)
### 动作捕捉
@ -521,7 +515,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
![](../../images/animation_part1_51.png)
![](https://lychee.inksoul.top/uploads/original/04/79/66ff05f4a47ff60e9e5596699369.webp)
#### 优缺点
@ -537,7 +531,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
捕捉出来的动作可能不符合艺术家的需求,需要调整(比如真人去演动画人物,动画人物的表情是很夸张的;或者有时捕捉不到好的数据,比如捕捉条件有限制,人在正面的时候看到的控制点,背面也有但正面看不到,那就要在背后加一个摄像机,这就需要成本,而且正常需要更多的摄像机;人物动作的时候还会遮挡)
![](../../images/animation_part1_52.png)
![](https://lychee.inksoul.top/uploads/original/bd/4c/1f3ca8d6dc949f3d375ad9d4fd94.webp)
#### 其他捕捉方法
@ -545,21 +539,21 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
![](../../images/animation_part1_53.png)
![](https://lychee.inksoul.top/uploads/original/59/98/56eb879a88c5faeeb92fc7e52d79.webp)
### 光学动作捕捉
应用最广泛的还是光学的捕捉方法贴一些Maker贴片或小球贴在人身上然后用很多很复杂的摄像机将这些点的位置非常准确的测出来
![](../../images/animation_part1_54.png)
![](https://lychee.inksoul.top/uploads/original/68/ac/2fc485789ad21168d12dfe8c68de.webp)
![](../../images/animation_part1_55.png)
![](https://lychee.inksoul.top/uploads/original/bb/23/ff873171ecca84a018d0595ac5ff.webp)
#### 获取的动作数据
下图曲线就为一个控制点不同时间在三维空间中的位置
![](../../images/animation_part1_56.png)
![](https://lychee.inksoul.top/uploads/original/cb/a5/4013a854cd684673e6a1aff6a3fe.webp)
#### 面部动画的问题
@ -568,21 +562,21 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
恐怖谷效应:人们会对生成的过于真实的人类感到害怕
![](../../images/animation_part1_57.png)
![](https://lychee.inksoul.top/uploads/original/2d/c8/4abd6af2daea89beba79b1e2ad1b.webp)
#### 面部动作捕捉
阿凡达这部电影具有里程碑式的效应,就是因为使用了面部动作捕捉
![](../../images/animation_part1_58.png)
![](https://lychee.inksoul.top/uploads/original/80/25/fecf60186b9ab4ea14b095bbe6aa.webp)
#### 动画/电影的生成过程
分别为Pre-Production、Production、Post-Production三个部分具体工作内容和职责可由下图所示
![](../../images/animation_part1_59.png)
![](https://lychee.inksoul.top/uploads/original/e6/7b/53306e8cb100bd747fac920496c1.webp)
-----------------------------------
@ -595,7 +589,7 @@ $$G = 6.67428 \times 10^{-11}Nm^2kg^{-2}$$
![](../../images/animation_part2_1.png)
![](https://lychee.inksoul.top/uploads/original/3f/78/d47fbc71ea5a776af46a1714ca5d.webp)
此时在任何一个位置x和时间t都有一个速度
@ -613,7 +607,7 @@ $$\frac{dx}{dt} = \dot{x} = v(x,t)$$
已知速度和起始位置,求任意时刻位置
![](../../images/animation_part2_2.png)
![](https://lychee.inksoul.top/uploads/original/66/e5/8fe9cbfdcb4a257f6bc13a97d450.webp)
将时间细分为很多的小块,不断计算$t+\Delta t$的位置
@ -631,7 +625,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t + \Delta t \ddot{x}^t$$
$\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路线偏离得越多
![](../../images/animation_part2_3.png)
![](https://lychee.inksoul.top/uploads/original/19/72/bd4b41472ba7dc8a9d5630b6f7b9.webp)
* 不稳定性
@ -642,7 +636,7 @@ $\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路
事实上,粒子在一个螺旋形的速度场,一定会按照严格的圆周运动
![](../../images/animation_part2_4.png)
![](https://lychee.inksoul.top/uploads/original/c6/09/a030b5565ac2b9b10a18303f06bc.webp)
如下图速度场中,粒子运动轨迹与实际按一根曲线慢慢走到水平存在极大差别
@ -662,7 +656,7 @@ $\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路
如下图对应链接的视频,在绝地求生中,车辆撞上摩托后会出现奇怪的翻滚现象,这在许多存在物理引擎的游戏中普遍存在
![](../../images/animation_part2_5.png)
![](https://lychee.inksoul.top/uploads/original/73/1d/1c757c96daf069c39df6a4ad296b.webp)
#### 解决办法
@ -674,7 +668,7 @@ $\Delta t$分得越细,模拟就会越精确,如果越大,和实际的路
2. 取原始点和a点之间的中点b考虑它所在的速度
3. 再回到原始的出发点应用b点的速度来重新再算一遍欧拉方法到达c点
![](../../images/animation_part2_6.png)
![](https://lychee.inksoul.top/uploads/original/bc/7d/7d0d9859a73e35291d05c6062028.webp)
$$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}$
![](../../images/animation_part2_7.png)
![](https://lychee.inksoul.top/uploads/original/43/aa/6b82c29f0b8f97129b876729724a.webp)
如果$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个值是不同位置和不同时间在速度场中的值
![](../../images/animation_part2_8.png)
![](https://lychee.inksoul.top/uploads/original/fd/d8/d6c5c44255ba594a7bff2ec0bfe1.webp)
#### 非物理方法
@ -752,7 +746,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
如下图,一个刚体的位置、朝向、速度、角速度分别对时间求导后得到速度、角速度、加速度、角加速度
![](../../images/animation_part2_13.png)
![](https://lychee.inksoul.top/uploads/original/91/36/f6dad51170a5a11c86cf01b81a82.webp)
## 流体模拟
@ -765,7 +759,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
3. 给定任何一个时刻这些小球它们分布,都可以知道任何一个地方的密度。如果有任何一个地方的密度变得和水一开始平静的时候的密度不一样,那就需要通过移动小球的位置把这个密度修正
4. 需要知道任何一个点它的密度对所有的小球位置的梯度(导数)
![](../../images/animation_part2_9.png)
![](https://lychee.inksoul.top/uploads/original/ac/95/b644ba28ad6b746fed645ce30b28.webp)
### 欧拉方法和拉格朗日方法
@ -777,7 +771,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
如下图,如果模拟一群小鸟的移动,就只关注某一只
![](../../images/animation_part2_10.png)
![](https://lychee.inksoul.top/uploads/original/18/3e/f9aed53405b03f3d4a6e445a7b74.webp)
* 欧拉方法俗称网格法
@ -785,7 +779,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
如下划分多个网格就知道时间t为黑色的鸟t-1应显示蓝色的鸟
![](../../images/animation_part2_11.png)
![](https://lychee.inksoul.top/uploads/original/62/43/8f06d30341f06291c503ac9e92ab.webp)
### 物质点方法
@ -795,7 +789,7 @@ $$\dot{x}^{t+\Delta t} = \dot{x}^t+\Delta t \ddot{x}^{t+\Delta t}$$
2. 融化的过程在网格中做
3. 再将格子上的信息写回不同的粒子上去
![](../../images/animation_part2_12.png)
![](https://lychee.inksoul.top/uploads/original/79/1f/0fbd55320cd9aeaa38f2ab675943.webp)
-------------------------

View File

@ -17,7 +17,7 @@ date: 2022-07-23T15:05:33+08:00
从某个立体角($\omega$)来的Radiance会打在dA上在dA上转换成能量并以光的形式辐射到另一个方向上去(dLr),即表现为出去的Radiance
![](../../images/reflaction_radiance_irradiance.png)
![](https://lychee.inksoul.top/uploads/original/4e/3b/f59b1b362f5d254cb5f2434d8811.webp)
对于dA来说其接收到的能量只考虑某一方向下立体角的Radiance,在投影后就可以计算dA接收到的Irradiance,Irradiance又会转换成Radiance反射出去
@ -29,7 +29,7 @@ date: 2022-07-23T15:05:33+08:00
BRDF描述了dA表面是如何把一个方向收集到的能量反射到另一个方向去(定义收集到的能量如何如何往各个方向去分配(漫反射还是镜面反射))
![](../../images/BRDF_define.png)
![](https://lychee.inksoul.top/uploads/original/88/4a/78ef6cfac4e1ae0502e6a7e62520.webp)
镜面反射下,反射出去的方向上分布了所有能量
@ -41,7 +41,7 @@ BRDF本质上描述了光线和物体是如何作用的因而BRDF项也定义
反射方程定义的是任意着色点,在不同的光照下,我们考虑任意一个输入的光照的入射方向对出射方向的贡献,并累加所有入射方向的贡献
![](../../images/the_reflection_equation.png)
![](https://lychee.inksoul.top/uploads/original/0d/c5/9e32a1ab711ef024ecdfc77d8866.webp)
公式解释:
@ -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反射到观察方向上去的能量
![](../../images/understanding_flection_equation1.png)
![](https://lychee.inksoul.top/uploads/original/89/97/009085dc53d641ba6496e09ef89b.webp)
* 如果有多个光源,就累加计算每个点光源光线到这个点反射到观测方向上的能量值
![](../../images/understanding_reflection_equation2.png)
![](https://lychee.inksoul.top/uploads/original/40/13/1f07231941c33641f2dfbb837060.webp)
* 如果有一个面光源(一堆点光源的集合),则将面光源上任意一个点的贡献积分起来
![](../../images/understanding_reflection_equation3.png)
![](https://lychee.inksoul.top/uploads/original/bb/21/86238989148e0b316ace84757767.webp)
渲染方程:
* 在考虑其他物体反射过来的光时可以将反射面视为光源由于渲染方程假设所有方向都是向外的所以从x点指向反射面就要变成负的
![](../../images/understanding_rendering_equation1.png)
![](https://lychee.inksoul.top/uploads/original/6f/af/f41aa3b768166899ebd0c69fa7a2.webp)
该点向某一观察方向辐射出去的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)
![](../../images/rendering_equation_simplify.png)
![](https://lychee.inksoul.top/uploads/original/40/27/a80f49fa215b3047fe613728779b.webp)
可利用数学上的一些简单表达式进行简化
@ -147,19 +147,18 @@ $$ L = E +KE+ K^2E +K^3E + \ldots $$
* 直接光照(光源能直接照射的地方有颜色,其余位置为黑的)
![](../../images/Direct_illumination_eg.png)
![](https://lychee.inksoul.top/uploads/original/45/01/e4d2b04314153860d574664a3a76.webp)
* 一次间接光照(光弹射两次)
![](../../images/one-bounce_global_illumination_eg.png)
![](https://lychee.inksoul.top/uploads/original/ba/ce/7f5c8457a1597a33a09ba61d86c9.webp)
* 两次间接光照(光弹射一次,两次,三次累积后的全局光照效果)
![](../../images/two-bounce_global_illumination_eg.png)
![](https://lychee.inksoul.top/uploads/original/59/12/8d59b532e4cdad22cfba59f68927.webp)
* 四次间接光照(玻璃灯内部变亮,在弹射三次时,仅足够进入物体,不足以离开物体)(双层玻璃需要两次弹射进入,两次弹射离开)
![](../../images/four-bounce_global_illumination_eg.png)
![](https://lychee.inksoul.top/uploads/original/03/b7/084c3e06872590d6814406a6341f.webp)
8次弹射和16次弹射只会提高暗处亮度难以感知到

View File

@ -48,12 +48,12 @@ $R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)R_y(\beta)R_z(\gamma)$
此时的三个旋转方向将被称为roll,pich,yaw
![flight_euler](../../images/flight_euler_angle.png)
![flight_euler](https://lychee.inksoul.top/uploads/original/52/df/e2b213f9d423c4fe4f8af20377a3.webp)
-----------------------
对于围绕某一特定点进行旋转的行为,则将该点平移至原点处后视为绕特定轴旋转
![](../../images/rotate_around_point.png)
![](https://lychee.inksoul.top/uploads/original/87/39/68cd5077f0472211bfc0767c6cf8.webp)
---------------------------
@ -110,7 +110,7 @@ view = translate * view;//移动相机位置到顶点
图示
![正交矩阵](../../images/3I~K5PRW$Y5JLF3}RC@RE0P.png)
![正交矩阵](https://lychee.inksoul.top/uploads/original/31/a1/f518d3c258ad3d24e5a7da482875.webp)
--------------------
@ -126,12 +126,12 @@ view = translate * view;//移动相机位置到顶点
将远平面与近平面连线形成的梯形“挤压”到成为一个正方体
![](../../images/X({M{B)24R8DF[AB98E9]@1.png)
![](https://lychee.inksoul.top/uploads/original/bf/ec/1c82a3e8347677b9ad940e6e4266.webp)
挤压的过程对梯形做横切面可知,计算挤压后的坐标点值实质上为计算相似三角形
如下图,可知挤压后的坐标与之前的坐标存在的数学关系为
![](../../images/3O_1NAGAMER%[EP6T91$LBO.png)
![](https://lychee.inksoul.top/uploads/original/5f/24/3495a4351e14cb1afe316e625486.webp)
$$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 表示纵横比,投影平面的长宽比
![](../../images/fovY.png)
![](https://lychee.inksoul.top/uploads/original/b0/1e/8fa99e3d46bca11e03611cef7347.webp)
对应的相似三角形关系不变,参数改变
![](../../images/triangle.png)
![](https://lychee.inksoul.top/uploads/original/f7/ef/fd0e577658660d0b61a2e69cef53.webp)
可得如下关系
$$\tan{\frac{fovY}{2}}=\frac{t}{|n|}$$
$$aspect=\frac{r}{t}$$

View File

@ -14,7 +14,7 @@ date: 2022-05-19T11:55:15+08:00
3. 光线方向(许多光线中的一条)l
4. 模型表面性质(如,颜色,粗糙度等)
![](../../images/shading_light_caculate.png)
![](https://lychee.inksoul.top/uploads/original/3b/80/82f27b9f43d4047471c900ab63a4.webp)
#### blinn-phong
@ -26,7 +26,7 @@ date: 2022-05-19T11:55:15+08:00
2. 漫反射(diffuse reflection):来自于光在物体表面的散射现象
3. 环境光(ambient lighting):光在物体之间弹射,最终在整个环境中形成的一个基本光
![](../../images/light_separete.png)
![](https://lychee.inksoul.top/uploads/original/45/c4/9d9b0c58649358ee84dccd33cd01.webp)
由此可见一个物体在渲染后体现的颜色是这三种光的总和即每个位置的颜色就是specular+diffuse+ambient
@ -37,7 +37,7 @@ date: 2022-05-19T11:55:15+08:00
根据lambert's cosine law,反射点吸收能量的多少与反射点法线和光线的夹角有关,即如图中表现的$\cos{\theta}=l\cdot n$
![](../../images/lambert'scosine_low.png)
![](https://lychee.inksoul.top/uploads/original/fd/d1/7efbbf903548b4adaf2be3715548.webp)
由此我们可以将漫反射总结为如下公式(lambertian Shading)
@ -54,7 +54,7 @@ $L_d=k_d(I/r^2)max(0,n\cdot l)$
高光(Specular)指的是视线在一定的角度区域观看模型表面时会产生一个类似镜面反射的效果
![](../../images/Specular_show.png)
![](https://lychee.inksoul.top/uploads/original/5b/00/be56b6909436b44e177a53537ae0.webp)
如图中黄色区域为可见高光的视线范围
@ -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$$
![](../../images/specular_cacular.png)
![](https://lychee.inksoul.top/uploads/original/da/a7/12ff836659f2b9a613323133f55d.webp)
$ k_s $ : 镜面反射系数
$ p $ : 高光的面积P越大高光面积越小
@ -73,7 +73,7 @@ $ L_s $ : 计算的高光效果光线
高光的效果和范围大小与$k_s$和p有关下图展示了变化效果
![](../../images/specular_value_change_show.png)
![](https://lychee.inksoul.top/uploads/original/69/25/2a5c9c5d1457972bb76591839d57.webp)
##### ambient Term (环境光)
@ -88,7 +88,7 @@ $k_a$ : 环境光系数,确定当前环境的底色
##### Blinn-phong Reflection Model
![](../../images/blinn-phong_model_cacu.png)
![](https://lychee.inksoul.top/uploads/original/e3/27/d25b153de071ae0fedf5b8b7a5d0.webp)
$$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. 对平滑表面的表现力不友好
![](../../images/flat_shading.png)
![](https://lychee.inksoul.top/uploads/original/5a/da/6a8c7a85cb703155f60d1024e856.webp)
逐顶点渲染Gouraud shading
1. 根据三角形顶点对颜色进行插值计算
2. 每一个顶点都有一个法线向量
![](../../images/Gourand_shading.png)
![](https://lychee.inksoul.top/uploads/original/12/8b/28c9f530a7d030cbd614e2ae84f9.webp)
1. 如何获取逐顶点的法线向量
1. 对于标准的几何图形:顶点的法线向量就在顶点位置
2. 对于非标准的几何图形:包含该顶点的周围几个表面的法线取平均值,可由计算公式$$ N_v=\frac{\sum_{i}N_i}{\lVert \sum_{i}N_i \rVert}$$ 得到
![](../../images/average_normal.png)
![](https://lychee.inksoul.top/uploads/original/d4/af/6bdb1aed8c99aa7f2a241aa4424a.webp)
逐像素渲染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反射模型
![](../../images/phong_shading.png)
![](https://lychee.inksoul.top/uploads/original/9d/64/a8c1ea67d1ee30a065ff0add4846.webp)
------------------------------

View File

@ -8,7 +8,7 @@ date: 2022-07-25T15:23:18+08:00
用于描述光线和不同材质间的作用关系
![](../../images/eg_material_in_cg.png)
![](https://lychee.inksoul.top/uploads/original/ef/03/4e545d37dc22fd55792b9e78e475.webp)
上图从左至右分别为三维空间中的网格模型,渲染出的两种不同结果
@ -20,8 +20,7 @@ date: 2022-07-25T15:23:18+08:00
漫反射:任何一根光线打到漫反射位置的点上会被均匀地分散到各个不同的方向上去
![](../../images/diffuse_lambertian_material.png)
![](https://lychee.inksoul.top/uploads/original/3b/d2/2db85af218943b7f39c635158f4f.webp)
* 漫反射材质可定义任何一个不同的点上不同的漫反射系数
经验定义:
@ -35,7 +34,7 @@ date: 2022-07-25T15:23:18+08:00
因此如果如果这个点不发光也不吸收光白的那就意味着所有的光进来多少就发射出去多少。也就是进来多少Irradiance就会出去多少Irradiance因为Radiance是一致的的所以入射和出射的Radiance也要是一样的
![](../../images/caculate_diffuse_material.png)
![](https://lychee.inksoul.top/uploads/original/72/ec/2832c40587fc186bc1a5b307b572.webp)
要使Li等于Lo所以BRDF为$1/\pi$,此时是完全不吸收能量的
@ -48,12 +47,12 @@ $$f_r = \rho/\pi$$
类似于镜面反射又有些粗糙
![](../../images/glossy_material.png)
![](https://lychee.inksoul.top/uploads/original/8e/2b/4cfdd01095381abfc5451144f061.webp)
###### 类玻璃/水的通透材质
![](../../images/Ideal_feflective_material.png)
![](https://lychee.inksoul.top/uploads/original/e0/81/ef6fe47fd72cf17889ed866bb0c9.webp)
左图为玻璃球(水的性质),右图有颜色且来自于玻璃球壳内,说明折射光在玻璃里传播时会被部分吸收
@ -65,7 +64,7 @@ $$f_r = \rho/\pi$$
镜面反射:入射角等于反射角
![](../../images/perfect_specular_reflection_in_physic1.png)
![](https://lychee.inksoul.top/uploads/original/95/75/823e3a389e7c36d6a4a408cffe5b.webp)
##### 计算公式
@ -84,7 +83,7 @@ $$f_r = \rho/\pi$$
所以已知$\theta和\phi$,就可以计算出射方向
![](../../images/perfect_specular_reflection_in_physic2.png)
![](https://lychee.inksoul.top/uploads/original/1a/2c/21daa47d8af02c80f6dd8617a577.webp)
镜面反射:
@ -127,7 +126,7 @@ $$f_r(p,\omega_0,\omega_i) = F_r(\omega_r)\frac{\delta(\omega_i - \omega_r)}{\co
形成原因:光线打到的海水表面时,光线会往不同的方向去折射,对于海底的某一个点来说,有几率接收到来自不同方向打过来的光
![](../../images/eg_specular_refraction.png)
![](https://lychee.inksoul.top/uploads/original/df/4b/4b38de36f8d2cba1167375ee65b9.webp)
@ -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,折射率越高说明光在穿过这个材质时会被折射得非常厉害,折射角会非常小,体现出不同波长的光被折射得不同程度
![](../../images/medium_eg_snell_law.png)
![](https://lychee.inksoul.top/uploads/original/61/fa/d1340eabdaeb965955bf61c6ffb0.webp)
方位角的朝向中,入射光和折射光也是正好相反的
@ -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$$
![](../../images/snell_law_caculation.png)
![](https://lychee.inksoul.top/uploads/original/46/c4/7a4b320b57dacd6560c2ad218e8c.webp)
由斯内尔定律可计算折射角的余弦
@ -173,8 +172,7 @@ $$\frac{\eta_i}{\eta_t} > 1$$
人在水底往各个不同的方向看只能看到一个锥形的区域97.2度。如下图最左边的一根光线的折射角就已经达到90度了如果角度再大一点所有能量都会反射到池子底部
![](../../images/eg_snell_window.png)
![](https://lychee.inksoul.top/uploads/original/d5/e2/1fce82d440b012113988d2070906.webp)
#### BSDF = BRDF + BTDF
@ -184,7 +182,7 @@ BRDF中的R表示反射折射是BTDF其中的T是transmit。BRDF和BTDF加
反射率取决于入射角(和光的偏振)的现象
![](../../images/eg_fresnel_reflection.png)
![](https://lychee.inksoul.top/uploads/original/ea/b7/489ba01f4a362c768f0eace8f732.webp)
如上图中,反射现象随着视角变化而明显
@ -194,7 +192,7 @@ BRDF中的R表示反射折射是BTDF其中的T是transmit。BRDF和BTDF加
下图的另外两根线表示的是极化现象和光线的波动性有关其实光线是沿着各个不同方向有振动的极化就是只沿着某一个方向振动S和P是两个方向的极化
![](../../images/fresnel_term_dielectric.png)
![](https://lychee.inksoul.top/uploads/original/2b/94/7d7de70a90e3fe0f6054daed4632.webp)
##### 导体
@ -203,14 +201,14 @@ BRDF中的R表示反射折射是BTDF其中的T是transmit。BRDF和BTDF加
导体的折射率是复数需要一个N和一个K
![](../../images/fresnel_term_conductor.png)
![](https://lychee.inksoul.top/uploads/original/1d/ee/3cf7ffbf52a2bd25585cb2c78337.webp)
##### 菲涅尔项的公式
一个0到1之间的数有多少能量会被反射2个不同的极化polarizationS和P会告诉你不同的反射率如果考虑不极化的光就将2项平均
![](../../images/fresnel_term_formule.png)
![](https://lychee.inksoul.top/uploads/original/af/37/606850cc49f89417a404b3f857cf.webp)
@ -247,7 +245,7 @@ $$R(\theta) = R_0 + (1 - R_0)(1 - \cos\theta)^5$$
漫反射将光反射到各个方向上就是认为所有的微表面都像一个很小的镜子,分布又各不规则,最后形成的分布就会把光打到各个不同的方向上去
![](../../images/microfacet_theory.png)
![](https://lychee.inksoul.top/uploads/original/a2/77/35b8106acbbe0eecfe5c30a98567.webp)
##### 微表面法线分布
@ -258,13 +256,12 @@ glossy材质
如下图的表面,看起来很平,它们的分布法线差的不太远,基本都是朝上的。所以如果将它们的分布画出来,它们的法线会集中在宏观的表面法线的周围
![](../../images/microfacet_BRDF_glossy.png)
![](https://lychee.inksoul.top/uploads/original/e4/ad/09662c91ab1170984044b4f48a21.webp)
diffuse材质
如下图,如果表面粗糙(意味着所有的微表面会沿着不同的方向),如果将法线画出来,那它的分布就会离中心离的特别远都会有分布的值
![](../../images/microfacet_BRDF_diffuse.png)
![](https://lychee.inksoul.top/uploads/original/b2/fd/991e5d23f8915023df71f9867ddf.webp)
* 微表面模型的BRDF公式
@ -284,13 +281,13 @@ diffuse材质
光线近似平行于表面时更易发生自遮挡,这种入射方向为掠射角(Grazing Angle),阴影遮掩的提出正是用于修正掠影角
![](../../images/microfacet_BRDF_caculate.png)
![](https://lychee.inksoul.top/uploads/original/7b/fd/4ccc5d93d098509056166cd8e0f7.webp)
-------------------
使用微表面材质渲染得到的图像质量很高,且微表面模型可描述的物体种类较多,金属、皮质、木头
![](../../images/microfacet_BRDF_example.png)
![](https://lychee.inksoul.top/uploads/original/44/33/c01366073910a9b214caa0dcb804.webp)
#### 各向同性/各向异性材质
@ -298,18 +295,17 @@ diffuse材质
当金属为拉丝金属,就会产生如图现象
![](../../images/isotropic_inside_an_elevator.png)
![](https://lychee.inksoul.top/uploads/original/99/ec/8162785575ea2fa30c5effc27242.webp)
* 各向同性:认为其微表面不存在一定的方向性,或方向性微弱
下图可见法线在各个方向上的分布是均匀的
![](../../images/isotropic_materials_theory.png)
![](https://lychee.inksoul.top/uploads/original/66/d2/beefecc85cd5250eff8abebeb186.webp)
* 各向异性:认为其法线分布具有明确的方向性
![](../../images/anisotropic_materials_theory.png)
![](https://lychee.inksoul.top/uploads/original/3b/f9/b85076aa85dfd81f25d53d741aef.webp)
* 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
正常尼龙做法为水平方向和竖直方向的一根压一根,其各向异性在对角线上有不同的表现
![](../../images/anisotropic_BRDF_nylon.png)
![](https://lychee.inksoul.top/uploads/original/93/d2/5e676f66c9b5608ba32c7c8eb9b6.webp)
* 天鹅绒
底层有很多伸出去的纤维,如果这些纤维往各个不同方向上分布是均匀的,就可认为是各向异性。但我们可将纤维拨到一边去,认为造出各向异性效果
![](../../images/anistotropic_BRDF_velvet.png)
![](https://lychee.inksoul.top/uploads/original/68/a3/7c80e2c1e6219a708358442a42c2.webp)
#### BRDF属性
@ -382,7 +378,7 @@ BRDF可以用各种各样不同的模型去描述但这些模型都是基于
测量后可以不用推出一些模型,可以直接用测的数据
![](../../images/measuring_BRDF_motivation.png)
![](https://lychee.inksoul.top/uploads/original/56/97/da55f3da49079c5856caba490633.webp)
##### 怎么测量
@ -390,13 +386,13 @@ BRDF可以用各种各样不同的模型去描述但这些模型都是基于
BRDF是2个方向一个入射方向一个出射方向的一个函数如果盯着一个着色点看并改变它的入射方向比如拿一个灯从四面八方照它相机从四面八方去拍它这样就可以覆盖BRDF所有可能的输入方向和可能的输出方向对这样就可以做测量
![](../../images/image-based_BRDF_measurement.png)
![](https://lychee.inksoul.top/uploads/original/9c/f1/35118a0bd7ce369b24e07f46e719.webp)
* 实践仪器
这个器械有2个爪子一个抓相机一个抓光源将样本放在正中间球心这2个爪子可以在球面上任意的旋转
![](../../images/gonioreflectometer.png)
![](https://lychee.inksoul.top/uploads/original/dc/59/6db5c3fb34f320e14c80c325f9ce.webp)
* 算法
@ -453,6 +449,6 @@ BRDF库存储了很多不同的材质大多数是假设各向同性的
存储数据量大(未压缩)
![](../../images/tabular_representation.png)
![](https://lychee.inksoul.top/uploads/original/75/b1/0ebfc70ac64b2ac737443815790a.webp)

View File

@ -12,12 +12,11 @@ $$Image = Synthesis + Capture$$
当然还有很多种成像方法最简单的捕捉成像方法是使用相机。当然现在还在研究很多别的更好成像技术比如光线的传播其实是有时间的有一些研究会研究光在极短时间内的传播就可以看到光线真正在空间中进行传播的过程这个过程叫Transient image瞬息图像
![](../../images/image_synthesis_capture.png)
![](https://lychee.inksoul.top/uploads/original/55/90/c58c54b702b93cda4599859ad519.webp)
## 相机
![](../../images/inside_the_camera.png)
![](https://lychee.inksoul.top/uploads/original/57/54/75bbbeb952152363d5786e15808a.webp)
最早的相机起源子小孔成像
@ -28,7 +27,7 @@ $$Image = Synthesis + Capture$$
生活中常见的则为带透镜的相机
![](../../images/lenses_from_image_on_sensor.png)
![](https://lychee.inksoul.top/uploads/original/ea/a6/8558213ab9234e6b5dff73834794.webp)
### 相机部件
@ -36,17 +35,17 @@ $$Image = Synthesis + Capture$$
下图为去掉了镜头后的相机快门部分,控制光在多少分之一秒内进入相机
![](../../images/Shuntter_exposes_sensor_for_precise_duration.png)
![](https://lychee.inksoul.top/uploads/original/15/2c/14bea629effb105dc4a88d60710d.webp)
* 传感器
记录传感器上任何一个点(像素)的Irradiance
![](../../images/sensor_accumulates_irradiance_during_exposure.png)
![](https://lychee.inksoul.top/uploads/original/31/99/987d38bcd12d7c8d942add3a7080.webp)
如果一个相机没有透镜或针孔是无法拍出照片的,如果将一个感光元件直接放在一个人的面前,任何一个点上都可能收集到来自不同方向的光,而这个点作为传感器无法区分来自各个方向的光线,此时会将各个方向的能量都综合在这个点上,会导致所有东西都是模糊的
![](../../images/sensors_without_lenses.png)
![](https://lychee.inksoul.top/uploads/original/c3/95/0bcf32bfd42a4e35dfd26b634c1d.webp)
前沿中存在传感器可通过方向性的光分开记录的研究但目前依旧认为只能记录Irradiance而非Radianc
@ -54,15 +53,15 @@ $$Image = Synthesis + Capture$$
小孔成像现象在公元前就已经被发现和提出
![](../../images/pinhole_camera.png)
![](https://lychee.inksoul.top/uploads/original/90/0a/f98a6fe661cf66f58ff2da3179eb.webp)
在今天,针孔摄像机拍摄依旧可行,大多数使用的相机都是带有透镜的,
真正做一个如下图的针孔(硬纸板中间有一个6mm直径能透光的地方),也能用这个小针孔拍摄某个场景,记录在胶片上。但拍出来的东西是没有深度可言的,任何地方都不会是虚的,都一定是清楚的
![](../../images/largest_pinhole_photograph.png)
![](https://lychee.inksoul.top/uploads/original/6c/c8/0f90287f18b34f9b2b64688d6331.webp)
![](../../images/largest_pinhole_photograph1.png)
![](https://lychee.inksoul.top/uploads/original/b2/b3/be500ec546d9e7794a862045ed5f.webp)
虚化正是来源于透镜。在计算光线追踪是,我们使用的就是针孔摄像机的模型,所以也得不出不同的地方会有不同的模糊
@ -70,7 +69,7 @@ $$Image = Synthesis + Capture$$
视场往往意味着能够看到多大的范围对于广角镜头通常意味着能够拍到更广的角度可见的FOV更大对于手机上的相机视场就相对比较小
![](../../images/effect_of_focal_length_on_fov.png)
![](https://lychee.inksoul.top/uploads/original/4a/e8/df1ef898e84063ce73977a4e856f.webp)
#### 从小孔成像的针孔摄像机理解视场
@ -90,7 +89,7 @@ $$FOV = 2\arctan(\frac{h}{2f})$$
不同视场决定不同拍照结果。视场和传感器大小及焦距相关,所以人们通常定义视场(FOV)以35mm格式的胶片为基准固定传感器的大小再通过定义焦距的方式来定义FOV
![](../../images/focal_length_vs_filed_of_view1.png)
![](https://lychee.inksoul.top/uploads/original/79/f6/a6ac605eff63664fb29a53206558.webp)
@ -110,13 +109,13 @@ $$FOV = 2\arctan(\frac{h}{2f})$$
当视场越窄,看到的东西越远
![](../../images/focle_length_vs_field_of_view2.png)
![](https://lychee.inksoul.top/uploads/original/29/b8/e9bbf82065feb57e89ddd7bc8ff7.webp)
#### 传感器(Sensor)大小和视场(FOV)
小一点的传感器会对应小一点的视场
![](../../images/effect_of_sensor_size_on_fov.png)
![](https://lychee.inksoul.top/uploads/original/81/81/cbea578b6025cf50e2f1d3f0cdb7.webp)
##### 传感器与胶片
@ -127,7 +126,7 @@ $$FOV = 2\arctan(\frac{h}{2f})$$
大相机有大的传感器也就有大的分辨率,所以不同相机价格各不相同,相机机身越大,镜头越大越长越好,价格也就越高
![](../../images/sensor_size.png)
![](https://lychee.inksoul.top/uploads/original/14/dd/b254638e1e79e58dfe4cef370af1.webp)
#### 曝光
@ -164,7 +163,7 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
* 第二行参数使用分数表示快门速度(1/1000即为快门开放1/1000秒)
* 第三行参数是ISO不同ISO可简单理解为相乘
![](../../images/exposure_aperture_shutter_gain.png)
![](https://lychee.inksoul.top/uploads/original/91/18/dba61de761d839ca7c042ded35d8.webp)
#### ISO简单地放大信号会放大噪声
@ -176,7 +175,7 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
将光认为是光子如果快门时间不足那么进入感光元件的光子数就少光子数少就会造成noisy
![](../../images/ISO_gain_vs_noise_in_canon.png)
![](https://lychee.inksoul.top/uploads/original/28/8a/bc7b10a9a5d9d5430c9597b908b9.webp)
#### 光圈与F数
@ -188,14 +187,14 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
* 如图,调光圈可以直接调出曝光度
![](../../images/F-Number_exposure_levels.png)
![](https://lychee.inksoul.top/uploads/original/da/b8/2d21bff5d252db768502ded367b2.webp)
#### 快门曝光时间对结果的影响
快门
![](../../images/physical_shutter.png)
![](https://lychee.inksoul.top/uploads/original/51/79/f5e780d83a3fcaf2cb708669bde7.webp)
* 调节曝光度
@ -205,11 +204,11 @@ Irradiance往往由光圈大小(影响镜头接收到多少光)和焦距决定
更长的快门时间会造成更严重的运动模糊,对于等长的快门时间,物体运动越快,越容易出现运动模糊
![](../../images/side_effect_of_shutter_speed1.png)
![](https://lychee.inksoul.top/uploads/original/5d/6e/68aebad838105db3d40e539beaae.webp)
但是更短的快门时间曝光度也降低了所以为了达到相同的亮度就要调节ISO或光圈的大小
![](../../images/side_effect_of_shutter_speed2.png)
![](https://lychee.inksoul.top/uploads/original/cf/31/272f8789dd21f2f0ee2e05c96a85.webp)
运动模糊的好处
@ -220,13 +219,13 @@ rolling shutter问题
电子控制的快门可以认为是任何时刻任何位置同步打开但机械快门则需要一个过程如果物体运动比机械快门的速度快就会出现Rolling Shutter问题因为图像上不同位置可能记录的是不同时间进来的光
![](../../images/side_effect_of_shutter_speed.png)
![](https://lychee.inksoul.top/uploads/original/fe/db/0ba8b52efe26a86174b6dbb27acd.webp)
#### 均衡快门和光圈
快门的时间打开得短就会暗那就可以提高光圈的大小用更小的F数。以下的表格上下对应的参数基本可以达到相同的曝光度。但达到的效果并不会一模一样因为大光圈会引起前景深的问题快门时间又会引起运动模糊
![](../../images/f-stop_vs_shutter_speed.png)
![](https://lychee.inksoul.top/uploads/original/ab/67/563b785e68c60078eb84f366cc6c.webp)
-----
@ -236,17 +235,17 @@ rolling shutter问题
每秒拍摄更多帧数然后按正常帧数播放每张照片的快门时间非常少又需要保证每张都清晰且有正常的曝光度可以用更大的光圈和更高ISO
![](../../images/hight-speed_photography1.png)
![](https://lychee.inksoul.top/uploads/original/92/b1/108186184a14ed007598f049ee4d.webp)
#### 超低速(长曝光)摄影
用非常小的光圈慢慢拍,也就是所谓的延迟摄影,摄影界中称为拉丝,也就是长曝光造成的运动模糊
![](../../images/long-exposure_photography1.png)
![](https://lychee.inksoul.top/uploads/original/0e/02/9bb3fb3de9958dff8562086c1aef.webp)
![](../../images/long-exposure_photography2.png)
![](https://lychee.inksoul.top/uploads/original/19/ed/b2bcb5b550500f6ccb5390a4802c.webp)
![](../../images/long-exposure_photography3.png)
![](https://lychee.inksoul.top/uploads/original/56/7b/63cd7c2efb0b45396a1961556a91.webp)
## 镜头
@ -256,13 +255,13 @@ rolling shutter问题
无论相机还是手机,都不使用单个透镜来成像,往往使用一个透镜组
![](../../images/real_lens_dfsigns_are_comples.png)
![](https://lychee.inksoul.top/uploads/original/3c/62/3992136f953815757bd530fad871.webp)
* 真正的镜头元素是不理想的
如下图,一面是凸的,一面是平的,这样就不可能将光聚在一起
![](../../images/real_lens_elements_are_not_ideal.png)
![](https://lychee.inksoul.top/uploads/original/8d/22/3eef19df39ed5e66d87fc3d27c19.webp)
* 我们研究的是理想的薄透镜(忽略厚度)
@ -272,7 +271,7 @@ rolling shutter问题
2. 光路有可逆性,如果光线穿过焦点,被透镜折射后会变成平行的一束光
3. 假设薄透镜可以任意改变焦距(透镜焦距固定,相机能改是因为透镜组)
![](../../images/ideal_thin_lens_focal_point.png)
![](https://lychee.inksoul.top/uploads/original/99/08/4ba57d0448b0aff2204fb0031b65.webp)
* 透镜满足的物理规律
@ -296,19 +295,18 @@ $$\frac{1}{f} = \frac{1}{z_i}+\frac{1}{z_o}$$
平行光必定过焦点,过焦点的光会变成平行光
![](../../images/gauss_ray_diagrams.png)
![](https://lychee.inksoul.top/uploads/original/b0/4f/a5918eda2ce10679c74542efec81.webp)
忽略中间过透镜中心的光
![](../../images/gauss_ray_tracing_construction.png)
![](https://lychee.inksoul.top/uploads/original/9d/8a/47b7cebee296b752684e61913a5c.webp)
可见如下图的几何关系,左侧在光到达透镜前可形成两个相似三角形,右侧也相同
![](../../images/gauss_ray_tracing_construction1.png)
![](https://lychee.inksoul.top/uploads/original/2d/67/c7abebdbdc893b271dc42e1c2a2c.webp)
将两组关系做运算
![](../../images/gauss_ray_tracing_construction2.png)
![](https://lychee.inksoul.top/uploads/original/85/e5/652969f7c6de62a8b1005a0a6b82.webp)
### 散焦模糊(Defocus Blur)(景深)
@ -320,7 +318,7 @@ $$\frac{1}{f} = \frac{1}{z_i}+\frac{1}{z_o}$$
* 如果物体不在Focal Plane上会出现模糊
![](../../images/computing_circle_of_confusion_size.png)
![](https://lychee.inksoul.top/uploads/original/16/3d/c8ebb87313d9ae05688c2cd3ba43.webp)
* 模糊原因
@ -340,7 +338,7 @@ $$\frac{C}{A} = \frac{d'}{z_i} = \frac{|z_s - z_i|}{z_i}$$
下图光圈f数为1.4,为大光圈,可以看到更模糊的效果
![](../../images/coc_vs_aperture_size.png)
![](https://lychee.inksoul.top/uploads/original/71/ee/c9bdf9b8074b5c1b9dc00344ad69.webp)
#### 光圈大小
@ -362,11 +360,11 @@ $$N = f/A$$
* 例子
![](../../images/example_f-stop_caculations.png)
![](https://lychee.inksoul.top/uploads/original/12/e2/3a0c47b2e82b82eb1337cd0ba5d5.webp)
* CoC的大小和F数成反比
![](../../images/size_of_coc_is_inversely_proportional_to_f-stop.png)
![](https://lychee.inksoul.top/uploads/original/c1/e3/db7e13b36ea5c0816d5a8e1fac6b.webp)
$$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}$$
* 实例
![](../../images/eg_of_rendering_with_lens_focus.png)
![](https://lychee.inksoul.top/uploads/original/85/a7/55a383710bea90e4fb602e7ea5af.webp)
#### 具体实现
@ -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$
![](../../images/ray_tracing_for_defocus_blur.png)
![](https://lychee.inksoul.top/uploads/original/87/f9/3e1263bae817d22d6d7e89b59165.webp)
* 使用光线追踪算法渲染
@ -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
![](../../images/ray_tracing_for_defocus_blur1.png)
![](https://lychee.inksoul.top/uploads/original/37/df/54a2efda662ebb450cea4f8d72ee.webp)
* 景深(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一个点会变成更大的圆所以就会更模糊但总归在一些地方是不模糊的即不同光圈大小会影响模糊范围
![](../../images/depth_of_field.png)
![](https://lychee.inksoul.top/uploads/original/38/06/9a75b831ed3c7a43ef76ab01f09f.webp)
如下图中一个光经透镜会打到一个成像平面该成像平面附近区域都认为CoC足够小
![](../../images/circle_of_confusion_for_depth_of_field.png)
![](https://lychee.inksoul.top/uploads/original/15/7a/1e6729c8c3de97d56342f200827f.webp)
景深实际场景中有一段深度该深度经透镜后会在成像平面附近形成一段区域区域内认为CoC是足够小的
@ -426,11 +424,11 @@ $$C = A\frac{|z_s - z_i|}{z_i} = \frac{f}{N}\frac{|z_s - z_i|}{z_i}$$
如下图,考虑景深的最远和最近处,分别让它们穿过透镜,到某一地方可以得到右边的范围
![](../../images/depth_of_filed_fyi.png)
![](https://lychee.inksoul.top/uploads/original/39/93/cb49a3af1bca5f59dcc9b9e1bd73.webp)
DOF参数效果
![](../../images/DOF_demonstration_fyi.png)
![](https://lychee.inksoul.top/uploads/original/66/a6/6faf890929a130d926d5aa623978.webp)
* 修改焦距

View File

@ -10,7 +10,7 @@ date: 2022-07-09T21:49:09+08:00
###### 重心坐标定义
![](/../../images/barycentric_coordinates.png)
![](https://lychee.inksoul.top/uploads/original/d6/cf/1080d9ea973bfb97a4ffeafbdfd6.webp)
对于一个三角形的三点坐标A,B,C,平面内的一点x,y可以写成三点的线性组合式
@ -24,7 +24,7 @@ $$(x,y)=\alpha A + \beta B + \gamma C = \alpha + \beta + \gamma = 1$$
###### 三角形的几何角度下求解
![](../../images/geometric_barycentric.png)
![](https://lychee.inksoul.top/uploads/original/a5/e4/376a881f375e63165edf61e87ab5.webp)
将点与三个顶点相连,三个三角形的面积分别为$A_A,A_B,A_C$对应的重心坐标的计算式,
@ -57,8 +57,7 @@ $$\alpha = 1 - \beta - \gamma$$
对于重心坐标系存在另一种等价视角:
以A点为原点AB,AC分别为新的坐标系的单位向量构建坐标系如图
![](../../images/barycentric_in_coordinates.jpg)
![](https://lychee.inksoul.top/uploads/original/d3/b4/07cd33f461d0694f635f28691a01.webp)
给定的任意点P的坐标可表示为$P(\beta , \gamma)$ ,可推出P点坐标满足以下关系
@ -92,8 +91,7 @@ $$
###### 重心坐标的用处
对顶点处的值进行线性插值,如下图
![](../../images/barycentric_coor_interpo.png)
![](https://lychee.inksoul.top/uploads/original/1e/5b/ca06385584938172a2e29202cf2e.webp)
$$V = \alpha V_A + \beta V_B + \gamma V_C$$
@ -178,7 +176,7 @@ sample's color : 通常为漫反射率值 kd
此时我们会选取红点位置周围的四个采样点,同时计算其与周围四个采样点的偏移值(s,t)如下图
![](../../images/bilinear_interpolation.png)
![](https://lychee.inksoul.top/uploads/original/73/83/9f6d64581eb88b242af7c8ee0447.webp)
可得相应的计算过程:
@ -199,7 +197,7 @@ $$f(x,y) = lerp(t,u_0,u_1)$$
此时在点采样下会产生摩尔纹和锯齿,如下图
![](../../images/moire_and_jaggies.png)
![](https://lychee.inksoul.top/uploads/original/6c/bc/a4152339ed8948e98ef696912e47.webp)
通常处理是进行超采样,同时也会有几个问题
@ -211,24 +209,24 @@ $$f(x,y) = lerp(t,u_0,u_1)$$
所以我们更倾向于使用范围序列而非点序列
![](../../images/point_query_and_range_query.png)
![](https://lychee.inksoul.top/uploads/original/b7/9c/15a53dedfd66ef932aa14cd6b0cd.webp)
###### Mipmap(支持 Range Query)
mipmap 可由下图表示
![](../../images/mipmap_information.png)
![](https://lychee.inksoul.top/uploads/original/42/c2/8eaf8c973e92d343ae36dddce84c.webp)
对应产生的mip层次结构也由下图表示
![](../../images/mip_hierarchy.png)
![](https://lychee.inksoul.top/uploads/original/c5/b2/9014aacac7c41a8c1b22f7b5647c.webp)
在计算对应层次的mipmap时我们需要相邻采样点的纹理坐标来估计纹理内存
![](../../images/compute_mip_level_D.png)
![](https://lychee.inksoul.top/uploads/original/55/df/007523beff976585caeb4566e810.webp)
如上图所示,我们能够得到两个值
@ -239,7 +237,7 @@ $$D = \log_2 L$$
在使用时往往D值会四舍五入为整数这会导致纹理的不连续因此我们还需要进行下图所示的Trilinear Interpolation 从而得到一个连续的D值
![](../../images/Trilinear_interpolation.png)
![](https://lychee.inksoul.top/uploads/original/3c/f5/7b84d7d96078b4d30b8112685b72.webp)
在插值处理后的纹理依旧会存在过度模糊(overblur)的现象,但相比于超采样的高性能开销依旧有很大的提升
@ -260,7 +258,7 @@ EWA filtering
Irregular Pixel Footprint in Texture的产生情况如下图
![](../../images/irregular_pixel_footprint.png)
![](https://lychee.inksoul.top/uploads/original/3c/08/53edc4fa37cc785e86c2344b7983.webp)
#### 纹理的应用
@ -285,23 +283,23 @@ Irregular Pixel Footprint in Texture的产生情况如下图
环境光贴图通常指在贴图上绘制模型周围环境光效,实现某些模型反射环境光的效果
![](../../images/Environment_Map.png)
![](https://lychee.inksoul.top/uploads/original/ce/71/4a6ee29d5f413f0ed65984005aba.webp)
也用于一些镜面反射的物体实现真实光照
![](../../images/Environmental_Lighting.png)
![](https://lychee.inksoul.top/uploads/original/f7/1d/04f1302ecf9069464d3c9f042583.webp)
![](../../images/Spherical_Environment_Map.png)
![](https://lychee.inksoul.top/uploads/original/af/3e/611949aea492fca51f6f31f802c5.webp)
在一些球型表面贴图会存在形变问题,如下图的顶部和底部
![](../../images/Spherical_Map_Problem.png)
![](https://lychee.inksoul.top/uploads/original/a6/3e/497f064dff6c75de5b6b051174f2.webp)
立方体贴图则由球体上一个向量沿自身方向映射到立方体上的点获得
![](../../images/Cube_Map.png)
![](https://lychee.inksoul.top/uploads/original/41/c3/8b5e5c1ea295591b362addd2300f.webp)
一个立方体使用6个方形纹理贴图来生成纹理
@ -321,7 +319,7 @@ Irregular Pixel Footprint in Texture的产生情况如下图
3. 扰动后的法线值为$$n(p) = (-dp,1).normalized()$$
![](../../images/perturb_the_normal.png)
![](https://lychee.inksoul.top/uploads/original/45/5a/1fc7c951e2280225393f7cdb4b38.webp)
扰动法线的计算(3D)
@ -383,20 +381,20 @@ Displacement mapping
2. 与Bump mapping 使用相同纹理贴图
3. 会改变模型顶点坐标
![](../../images/Displacement_mapping.png)
![](https://lychee.inksoul.top/uploads/original/14/0c/c79521f297ef03aa8466285c8b1d.webp)
3D程序化噪声和实体建模
![](../../images/Procedural_noise_and_Solid.png)
![](https://lychee.inksoul.top/uploads/original/f1/0f/3adf99cd54a4d167c3baf92da5fc.webp)
将部分着色效果提前绘制到贴图上
![](../../images/Provide_precomputed_shading.png)
![](https://lychee.inksoul.top/uploads/original/0d/d0/5cd8cf4e2d2cc0e6abe53160b0f4.webp)
3D图像纹理和体绘制
![](../../images/3D_texture_and_volume.png)
![](https://lychee.inksoul.top/uploads/original/e0/1c/9e8e797c1db4e778b33d5eec7c11.webp)

View File

@ -11,7 +11,7 @@ date: 2022-05-12T22:08:22+08:00
屏幕是由一个个像素组成,在光栅化时,只有中心被三角形覆盖的像素会被着色,而且被覆盖的像素点的分布往往是离散的,自然而然地形成如下图斜线形成的阶梯状的锯齿
![](../../images/aliasing_pixel.png)
![](https://lychee.inksoul.top/uploads/original/2f/fd/f4ac3a158b12185953f6c2d7a7ff.webp)
---------------
@ -20,15 +20,15 @@ date: 2022-05-12T22:08:22+08:00
###### 采样(sample)
采样就是将连续信号转换成离散信号(采样信号),经过滤波后会被恢复成重建信号
![](../../images/sample_and_reconstruct.png)
![](https://lychee.inksoul.top/uploads/original/24/04/cec66748134129a978c2afe5601d.webp)
如果采样的频率过低,则会发生走样或混叠(aliasing),如图中,蓝色的为原信号,红色为采样点,绿色虚线为重建后的信号
过低的采样频率会使重建的信号成为低频信号
![](../../images/figure.5.17.png)
![](https://lychee.inksoul.top/uploads/original/43/71/9022119af57198198ccb8afb85d9.webp)
若采样频率恰好是原信号的两倍,重建信号则表现为一条直线
![](../../images/figure5.17.1.png)
![](https://lychee.inksoul.top/uploads/original/85/5c/5a0f59b3fa9839ca607f618fec7e.webp)
采样理论(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以确保恢复的信号不会被放大或缩小
![](../../images/three_filter.png)
![](https://lychee.inksoul.top/uploads/original/19/7c/90c0d14931f87653a83e88829735.webp)
box filter 对信号进行滤波并重建信号的过程如下图
<br>直接将采样点位置替换为box filter波形的方式会因 box filter 本身的不连续使重建信号产生不平滑的现象<br>
但仍然因其易于实现的特性被用于重建
![](../../images/box_filter_construct.png)
![](https://lychee.inksoul.top/uploads/original/c5/d8/3668ae8f6f7814d4559fcb5011e3.webp)
-----------
tent filter 在滤波时会对每个相邻的采样点之间使用线性插值一次重建的信号更加平滑但采样点位置会发生斜率突变所以tent filter 并不完美
![](../../images/tent_filter_constructed.png)
![](https://lychee.inksoul.top/uploads/original/c8/96/51c13da3ef8cf495ee912b2dca95.webp)
-------------
出于让重建信号保持平滑的目的,我们必须使用一个理想低通滤波器
基于傅立叶变换理论的解释理想低通滤波器在频域中的表现类似于box filter,在频域中相乘时会过滤掉所有超过这个滤波器宽度的频率在频域的box fliter 转换到空域的时候会是一个sinc filter ,在频域相乘也等价于在空域中进行卷积,卷积即为滤波
![](../../images/convolution_theorem.png)
![](https://lychee.inksoul.top/uploads/original/27/99/3e7a7f9819f05d4cf3e79b8e8215.webp)
例如sinc filter就能够实现过滤高频信号保留低频信号的理想低通滤波器效果
![](../../images/sinc_filter_process.png)
![](https://lychee.inksoul.top/uploads/original/78/f8/6db559f3ffe8924bcad55392e80a.webp)
对于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)
如图,对重建信号使用双倍采样率进行重采样便实现了信号放大
![](../../images/resample_upsample.png)
![](https://lychee.inksoul.top/uploads/original/00/f8/dbfa6ec4730acc3790404fa8c360.webp)
这种方法不适用于信号缩小,易使信号过于高频
对于信号缩小的情况我们需要先对1间隔采样信号使用$sinc(\frac{x}{2})$ filter 滤波产生一个连续信号再重采样2间隔由于频谱范围更大的低通滤波器才能过滤更多的高频信号类似于对图像进行第一次模糊再重采样产生一个低分辨率图像
![](../../images/resample_downsampling.png)
![](https://lychee.inksoul.top/uploads/original/7a/07/1242315ae8342cf4a1107646d63b.webp)
由下图可见,滤波可以对三角形的边缘产生模糊,进而产生一定的反走样效果
![](../../images/sample_resulst.png)
![](../../images/pre-filter_sample.png)
![](https://lychee.inksoul.top/uploads/original/b7/d4/c1ecd4f7edd993ffe0507664d3ac.webp)
![](https://lychee.inksoul.top/uploads/original/63/42/0e1955ad45d1d3da7a0fe11f08ab.webp)
### 反走样
@ -93,7 +93,7 @@ tent filter 在滤波时会对每个相邻的采样点之间使用线性插值
对于我们之前提到的采样我们只对像素正方形的中心进行是否在三角形内部的判断这意味着对于边缘的像素正方形无论覆盖面积有多大只要不包含中心点都会被判定在三角形外从而不被渲染当采样率提升如下图的4spp(sample per pixel)以某种方式混合计算获得更好的像素效果
![](../../images/Screen-Based.png)
![](https://lychee.inksoul.top/uploads/original/2d/5d/a1873c3c82fe4fa9784a1c8d6bd2.webp)
Screen-Based Antialiasing 通常在屏幕空间区域使用采样图案来采样从而对颜色进行如下的加权计算
@ -129,7 +129,7 @@ SSAA又被称为全屏幕抗锯齿(full-screen antialiasing,FSAA),也叫超采
实现方式简单只需要一个高分辨率图像和box filter就可以实现
下图是采样点在像素点内位置类型
![](../../images/sample_point_position.png)
![](https://lychee.inksoul.top/uploads/original/b4/3a/66b01c0f5b91662230778d7309cc.webp)
案例NAVIDIA's DSR(dynamic super resolution)
@ -142,11 +142,11 @@ SSAA又被称为全屏幕抗锯齿(full-screen antialiasing,FSAA),也叫超采
MSAA同样在一个像素中设置多个采样点在光栅化时计算三角形在像素内对采样点的覆盖率之后只计算每个片元的像素着色器采样中心点的位置计算颜色信息再乘上覆盖率最后输出这个像素的颜色
颜色计算与深度判断
![](../../images/MSAA.png)
![](https://lychee.inksoul.top/uploads/original/ec/7b/cd1212607225b575b5abfb2ddddb.webp)
总体流程如下
![](../../images/MSAA_sample.png)
![](../../images/MSAA_color.png)
![](https://lychee.inksoul.top/uploads/original/7b/df/e0196cbf62b91996caa8fc78f985.webp)
![](https://lychee.inksoul.top/uploads/original/87/cd/4b1f31ea1c6d1ee7fe4817ee9f32.webp)
与SSAA不同的是MSAA只对每个像素计算一次采样而非对整个图像进行渲染但计算量依旧倍增
@ -159,6 +159,6 @@ MSAA同样在一个像素中设置多个采样点在光栅化时计算三角
例如EQAA在2f4x模式下会对每四个采样点计算并通过表的形式存储颜色和深度值(如下图)这使得四个采样点只需1bit空间就可以确认像素位置的着色颜色值
![](../../images/EQAA_color_table.png)
![](https://lychee.inksoul.top/uploads/original/65/f8/fca2f60f4ea7704f21dc502f683d.webp)

View File

@ -32,7 +32,7 @@ $$\sum_{i = 1}^n p_i = 1$$
如图,对于这四个可供选择的长方形,每一个选择有一个值为$X_i$,每一个选择都对应一个概率为$p_i$,那么期望则为将所有值乘以其对应的概率后累加得到的数值
![](../../images/eg_expected_value.png)
![](https://lychee.inksoul.top/uploads/original/1b/85/445fd46f4b0b960b4da4e8a5f2fb.webp)
可见上图的期望值为
@ -47,7 +47,7 @@ $$E[X] = \sum_{i=1}^n \frac{i}{6} = (1+2+3+4+5+6)/6 = 3.5$$
随机变量的取值可以是一些固定的值(离散型),也可以是下图所示一些连续的值(连续型)
![](../../images/probability_distribution_function.png)
![](https://lychee.inksoul.top/uploads/original/d8/86/8208be63369a6fc6b6b1cf1b08ac.webp)
某一位置的概率为其周围一小段微元与曲线相连线形成的梯形面积
@ -88,7 +88,7 @@ $$E[Y] = E[f(X)] = \int f(x)p(x)dx$$
若函数较为复杂,如下图所示,不便于使用解析方法,就要使用数值的方法计算(蒙特卡洛积分)
![](../../images/reason_for_monte_carlo_integration.png)
![](https://lychee.inksoul.top/uploads/original/d8/a4/f02c37ab782b69101cf6345b0336.webp)
#### 大致流程
@ -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)}$
![](../../images/uniform_monte_carlo_estimator.png)
![](https://lychee.inksoul.top/uploads/original/17/4f/646c3702cfce4dd52a971d66ac63.webp)
* 采用蒙特卡洛积分计算时需要知道f(Xi)和p(Xi),随机采样得到的值为Xi,蒙特卡洛积分只需计算f(Xi)除以p(Xi)的平均值p(Xi)的值始终为$\frac{1}{(b-a)}$
@ -150,7 +150,7 @@ Specular材质光线在物体表面能发生镜面反射则称为此材质
Glossy材质有镜面反射的样子但又有些许模糊类似毛玻璃效果有一定粗糙度但能产生高光
![](../../images/mirror_and_glossy_reflection.png)
![](https://lychee.inksoul.top/uploads/original/df/03/8be9c945f429d52e91283b51c250.webp)
* whitted-style ray tracing 在遇到漫反射时会停止光线弹射直接做相应的shading
@ -159,7 +159,7 @@ Glossy材质有镜面反射的样子但又有些许模糊类似毛玻
两个示例中左侧为直接光照,右侧为全局光照,都采用路径追踪的方式计算得到
![](../../images/path_traced_direct_global_illumination.png)
![](https://lychee.inksoul.top/uploads/original/fc/60/dc88e41628ea3157b532fad0e5fc.webp)
可见在场景中只有上面一个光源的情况下,在直接光照里,天花板为黑色,但实际上光线会发生多次弹射,天花板应是亮的,右侧才是我们想要的效果
@ -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$ 均匀分布在球面上
![](../../images/suppose_scene_1.png)
![](https://lychee.inksoul.top/uploads/original/7a/e6/bb64650c97018fcd3bb362371641.webp)
* 假设该点不发光,因而直接光照强度结果来自于四面八方入射来的光照强度
@ -263,8 +263,7 @@ shade(p, wo)
##### 全局光照
全局光照下我们需要考虑反射面反射过来的光计算从Q反射到P点反射了多少辐射能
![](../../images/introducing_global_illumination.png)
![](https://lychee.inksoul.top/uploads/original/9b/a3/0a8eaf77e412df331b648efd3d52.webp)
只需在直接光照的算法中添加分支便可支持全局光照
@ -311,7 +310,7 @@ Return Lo
如下图打到第一个物体上后反射出N根光线打到第二个物体后会再发出N个光线即变成$N^2$条光线,会超出处理能力
![](../../images/explosion_of_ray_as_ray_go_up.png)
![](https://lychee.inksoul.top/uploads/original/4b/52/afc2709eed22c4e9127dc3871fb3.webp)
解决方法:
@ -389,12 +388,12 @@ low SPP下计算速度快图片噪声多
High SPP下计算速度慢图片噪声少
![](../../images/High_and_low_spp_result.png)
![](https://lychee.inksoul.top/uploads/original/0e/e7/d9bd6bbbc1ee248524a6e2268d3f.webp)
##### 算法依旧不高效的原因
![](../../images/reason_of_being_inefficient.png)
![](https://lychee.inksoul.top/uploads/original/21/9e/564b950df883fe586275992f3271.webp)
光线能否打到光源上取决于运气当光源小时往往会浪费过多光线需要改用更好的PDF用来采样而非简单的均匀采样
@ -402,7 +401,7 @@ High SPP下计算速度慢图片噪声少
蒙特卡洛允许许多采样方法,我们可以直接在光源上采样
![](../../images/sample_the_light.png)
![](https://lychee.inksoul.top/uploads/original/66/98/373dd2eac2e59fedbf7457b39267.webp)
n'为光源本身朝向,在与着色点连线后可得$\theta$(连线和着色点法线的夹角) $\theta$'(连线和光源法线的夹角)此时若在视为二维平面的光源上均匀采样则PDF为$\frac{1}{A}$
@ -464,7 +463,7 @@ shade(p, wo)
发生下图蓝色物体遮挡在光源和着色点之间时,需要判断光源能否贡献到着色点
![](../../images/light_source_blocked_judge.png)
![](https://lychee.inksoul.top/uploads/original/01/55/10a08212d2c42cede1b8af8e3aeb.webp)
判断方式:
@ -495,7 +494,7 @@ shade(p, wo)
最终path tracing的出的效果
![](../../images/is_path_tracing_correct.png)
![](https://lychee.inksoul.top/uploads/original/95/44/6f617b6302a955968229df719faa.webp)
可见path tracing 与照片相比能够做到几乎百分百相似

View File

@ -36,13 +36,13 @@ $$\Phi \equiv \frac{d_Q}{d_t} [W = Watt] [lm = lumen]$$
辐射通量同时可以表示为在单位时间内通过一个感光平面的光子数量
![](../../images/another_defination_of_flux.png)
![](https://lychee.inksoul.top/uploads/original/9f/01/a260a6cd54d62b20d07ca9465164.webp)
#### 辐射强度(Radiant Intensity)
定义:单位时间内,单位立体角辐射的能量
![](../../images/Radiant_Intensity_define.png)
![](https://lychee.inksoul.top/uploads/original/c4/6c/91bb8feb9759558aae00fc55a83a.webp)
坎德拉(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$)发生改变时,会在对应方向的球面上框出一片区域,该区域对应的立体角即为微分立体角
![](../../images/differential_solid_angles1.png)
![](https://lychee.inksoul.top/uploads/original/02/9b/8091cdfd57bde658f98557e31105.webp)
对于球体$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}$来计算微分立体角
![](../../images/differential_solid_angles_w.png)
![](https://lychee.inksoul.top/uploads/original/ac/99/87db564d254f03c040c13f8f3beb.webp)
#### 光强(Intensity)
@ -79,7 +78,7 @@ $$\Phi = \int_{S^2} {Id\omega} = 4\pi I$$
$$I = \frac{\Phi}{4\pi}$$
![](../../images/Isotropic_Point_source.png)
![](https://lychee.inksoul.top/uploads/original/a1/fc/033503be0c3519f8bf99cb7d0833.webp)
#### 现代LED灯实例
@ -91,20 +90,19 @@ $$I = \frac{\Phi}{4\pi}$$
Itensity = 815 lumens / 4pi sr = 65 candelas
![](../../images/modern_LED.png)
![](https://lychee.inksoul.top/uploads/original/fe/48/86834d505462e010328094c5c577.webp)
#### 辐照度(Irradiance)
定义:单位面积内的能量
![](../../images/Irradiance_define.png)
![](https://lychee.inksoul.top/uploads/original/8b/db/5a4909e2ac00a54b0b06735bdab2.webp)
单位面积需与入射光线垂直才算是接收到的范围,否则要将其投影到垂直的方向
例如Lambert's Cosine Law中平行光打到单位面上如果垂直则可以接收到6根光线平面若倾斜则只能接收到三个光线接收到的能量要乘以$\cos \theta$
![](../../images/Lambert_cosine_law_irradiance.png)
![](https://lychee.inksoul.top/uploads/original/df/67/0db07b748f5e0a94e93cf40e9be3.webp)
--------------------------
@ -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$
![](../../images/Irradiance_Fallof.png)
![](https://lychee.inksoul.top/uploads/original/2d/6d/e2e845939e03b3635c09bc713253.webp)
由此可得出并非Idensity在衰减而是Irradiance在衰减
@ -125,7 +123,7 @@ Itensity = 815 lumens / 4pi sr = 65 candelas
定义单位立体角下每单位面积下的power
![](../../images/radiance_define.png)
![](https://lychee.inksoul.top/uploads/original/1f/72/e542bc968afefcc256b25c4f3a75.webp)
由此可知power需要进行两次微分一次立体角一次投影后单位面积
@ -144,7 +142,7 @@ Radiance: 每单位角的Irradiance
从一个方向打到一个很小的面上的能量,即为入射辐射
![](../../images/Incident_radiance_define.png)
![](https://lychee.inksoul.top/uploads/original/59/4a/25a8ea1c9a849db297b3fd953b6e.webp)
是沿着给定光线到达表面的光(给定表面上的点和入射方向)
@ -152,7 +150,7 @@ Radiance: 每单位角的Irradiance
王某一个方向(立体角)辐射的能量即为出射辐射
![](../../images/Exiting_radiance_define.png)
![](https://lychee.inksoul.top/uploads/original/f9/6a/93154dddba9d2e5e6765b98ea3aa.webp)
是沿着给定光线到达表面的光(给定表面上的点和出射方向)
@ -165,6 +163,6 @@ radiance: dA从某一个方向收到的能量
E(p)即为irradiance,等于所有方向上的Radiance的和
![](../../images/Irradiance_vs_radiance.png)
![](https://lychee.inksoul.top/uploads/original/05/2f/954ca3852b675d629ec6d5c83534.webp)

View File

@ -8,7 +8,7 @@ date: 2022-05-12T09:10:25+08:00
#### 屏幕空间
屏幕空间可以被看做是由一组像素点构成,每个像素点可以被视为中心为$(x+0.5,y+0.5)$的一个正方形,
![](../../images/pixel_and_screen_space.png)
![](https://lychee.inksoul.top/uploads/original/d3/31/0b2fe9d7b24574f29da743230245.webp)
--------------
@ -32,8 +32,7 @@ for(int x = 0 ; x < xmax; ++x)
可视化过程如图
![](../../images/sample_progress.png)
![](https://lychee.inksoul.top/uploads/original/d6/ca/5087ef62bbaa6461505723430944.webp)
----------------
#### 判断像素点在三角形内部
@ -94,7 +93,7 @@ static bool insideTriangle(int x, int y, const Vector3f* _v)
使用包围盒将三角形包围后,只判断包围盒内的像素点是否在三角形内能够减少这种情况的出现
![](../../images/BoundingBox.png)
![](https://lychee.inksoul.top/uploads/original/c2/18/c98a1d63786f6a86ed0f41877f99.webp)
代码实例
@ -110,5 +109,5 @@ static bool insideTriangle(int x, int y, const Vector3f* _v)
##### incremental triangle Traversal
对于每一行像素点,只遍历三角形最左到最右的像素点,只适用于较窄的且经过旋转的三角形
![](../../images/IncrementalTriangleTraversal.png)
![](https://lychee.inksoul.top/uploads/original/0c/49/3c2f055416f430cf8cfc90076f13.webp)

View File

@ -12,13 +12,13 @@ date: 2022-07-27T22:55:53+08:00
从光源打出一些sub-path从摄像机出发也可以生成另外一系列的子路径。双向路径追踪会将这些子路径的端点连接起来形成一条完整的路径
![](../../images/bidirectional_path_tracing_theory.png)
![](https://lychee.inksoul.top/uploads/original/b3/ec/ae269c20b4786a80222c5b1f5241.webp)
### BDPT适用的场景
图例中左图为路径追踪右图为双向路径追踪适用的都是每个像素32个采样点但可见双向路径追踪能产生更好的效果
![](../../images/eg_bidirectional_path_tracing.png)
![](https://lychee.inksoul.top/uploads/original/a6/4d/b232832f4d2122f2368489a9f921.webp)
原因:
@ -50,7 +50,7 @@ date: 2022-07-27T22:55:53+08:00
不断在一个path周围产生更多path就可以找到所有的path
![](../../images/MLT_caculate.png)
![](https://lychee.inksoul.top/uploads/original/34/d7/e5849e9bbaccfb17dcc1becfb2ce.webp)
#### MLT方法与BDPT的效果对比
@ -58,7 +58,7 @@ date: 2022-07-27T22:55:53+08:00
在下图中类似的场景下MLT的效果很好其适合做复杂、困难的光线传播
![](../../images/MLT_pros.png)
![](https://lychee.inksoul.top/uploads/original/51/65/5849f272b5d95713e93b7fbc47dd.webp)
Caustics是光线经过聚焦打在游泳池底然后被人眼看见。光线要穿过水的表面凹凸不平还有浪会被聚焦到一系列的地方水面有办法将光线聚焦到一系列的线上。这种情况渲染起来非常困难因为假设游泳池底是diffuse的光线会先经过一个specular的水面游泳池底被我们看见也要经过一个specular这种路径简称SDSspecular-diffuse-specular
@ -69,7 +69,7 @@ MLT难以在理论上预估最后收敛的速度(path tracing中使用的蒙特
所有操作都是局部的,有些像素收敛快,有的像素收敛慢,使渲染出来的结果图像看上去比较脏
![](../../images/MLT_cons.png)
![](https://lychee.inksoul.top/uploads/original/a6/3f/c6bef5b0868928fb21cdfb381572.webp)
不适用于渲染动画,因为不同连续帧的收敛速度不同,画面会产生严重抖动
@ -82,13 +82,13 @@ MLT难以在理论上预估最后收敛的速度(path tracing中使用的蒙特
尤其适用于渲染Caustics和Specular-Diffuse-Specular(SDS)
![](../../images/photon_mapping_theory.png)
![](https://lychee.inksoul.top/uploads/original/03/2b/6d15522800753281e0107f614696.webp)
#### 实现方法
* 从光源出发光子碰到物体后计算所有反射和折射直到光子打到diffuse的物体上停止此时整理所有光子即可得到光子位置信息
![](../../images/photon_mapping_approach.png)
![](https://lychee.inksoul.top/uploads/original/56/5b/43f50e73bae3754c21e111c99aed.webp)
* 从眼睛或相机开始往各个不同方向打出各种各样的子路径计算反射和折射直到打在diffuse的物体上
@ -102,15 +102,14 @@ MLT难以在理论上预估最后收敛的速度(path tracing中使用的蒙特
* 计算N个光子所占的面的面积
* 计算密度用光子的数量N除以它们占的面积
![](../../images/photon_mapping_cacul.png)
![](https://lychee.inksoul.top/uploads/original/1c/c6/d24b9e195cc3458c0a5c0df0b12b.webp)
#### N的取值
如果用很少的光子的数量,就会得到一个很有噪声的图,如果用更多的光子,结果虽然会好一些,但是得到的结果会糊
![](../../images/photon_mapping_biased.png)
![](https://lychee.inksoul.top/uploads/original/e3/1d/fc30e892a773f715814012711e54.webp)
##### 产生取值问题的原因(有偏的原因)
* 计算密度时我们认为密度时当前这个点的周围取一个微小的面积dA,它里面有多少个光子
@ -146,7 +145,7 @@ BDPT中生成两个sub-path再将端点连起来如果有的path满足下
往往用于电影行业渲染
![](../../images/vertex_connection_and_merging.png)
![](https://lychee.inksoul.top/uploads/original/b9/9a/57cad24cc9f71813b7024feef62a.webp)
### 实时辐射度算法(Instant Radiosity(IR))
@ -160,7 +159,7 @@ BDPT中生成两个sub-path再将端点连起来如果有的path满足下
* 看到如下图中的着色点后就用新的光源来照亮(相当于实际考虑光线弹射两次)
![](../../images/instant_radiosity.png)
![](https://lychee.inksoul.top/uploads/original/c2/e2/e1f79562d4e820573c45aaa80c13.webp)
#### 优缺点
@ -176,7 +175,7 @@ VPL不能做glossy的物体
窄缝发光问题与距离平方向有关在计算light sampling时更改立体角的采样为对面积的采样所以产生了面积乘以cos除以两个点之间的距离的值当两个点距离极近时就会得到一个非常大的结果
![](../../images/instant_radiosity_eg.png)
![](https://lychee.inksoul.top/uploads/original/af/01/d800bf769b38b5998a2e8d5db474.webp)
## 高级外观建模
@ -187,11 +186,11 @@ VPL不能做glossy的物体
![](../../images/participating_media_fog.png)
![](https://lychee.inksoul.top/uploads/original/f8/a8/b550df6c3b71c3f5716cf33ddb9e.webp)
![](../../images/participating_media_cloud.png)
![](https://lychee.inksoul.top/uploads/original/c9/14/c4278421312196371e2c1c5b2a3e.webp)
--------------------
@ -201,7 +200,7 @@ VPL不能做glossy的物体
2. 光线路径上如果有很多小的晶体则会把光线随机反射到其他方向上去
3. 传播的过程中也可能会接收到从其他方向反射过来的光
![](../../images/participating_media1.png)
![](https://lychee.inksoul.top/uploads/original/e7/1a/6630bd63b42387af50092859d19e.webp)
#### 散射计算
@ -209,7 +208,7 @@ VPL不能做glossy的物体
下图相位函数决定了散射的方式和方向(与BRDF类似BRDF决定如何反射相位函数决定如何散射)
![](../../images/participating_media2.png)
![](https://lychee.inksoul.top/uploads/original/15/36/22d86089125691f8187ec5a8ef2a.webp)
#### 散射介质渲染
@ -219,15 +218,15 @@ VPL不能做glossy的物体
超能特工队
![](../../images/participating_media_application1.png)
![](https://lychee.inksoul.top/uploads/original/51/f3/1f163b40d1db3d34da1c0f16876e.webp)
游戏:刺客信条
![](../../images/participating_media_application2.png)
![](https://lychee.inksoul.top/uploads/original/c6/97/ad94a265fd244722e0427765a5a1.webp)
巧克力(流体模拟)
![](../../images/participating_media_demo.png)
![](https://lychee.inksoul.top/uploads/original/6f/5a/f157663caa2028706c50716cf638.webp)
### 毛发建模(Hair/fur/fiber)缩写BCSDF
@ -235,7 +234,7 @@ VPL不能做glossy的物体
可见头发会有两种高光,一种无色发白,一种有色
![](../../images/hair_appearance.png)
![](https://lychee.inksoul.top/uploads/original/2b/d8/65a814af06ffea58689fff67809c.webp)
#### 高光计算
@ -243,11 +242,11 @@ VPL不能做glossy的物体
* kajiya-Kay Model
![](../../images/kajiya-kay_model.png)
![](https://lychee.inksoul.top/uploads/original/0b/ac/6527e1d190001d08324cd447bee2.webp)
但表现却不太符合现实与Blinn-Phong类似
![](../../images/eg_kajiya-kay_model.png)
![](https://lychee.inksoul.top/uploads/original/5d/38/8469ad5b606c420d3484c8efe466.webp)
* Marschner Model
@ -257,19 +256,19 @@ VPL不能做glossy的物体
2. 一部分会穿透到头发里发生折射可记为T一根光线要穿透一根头发需要穿透两次因而产生TT的光线传播方式
3. 光线发生一次穿透进入头发内部在头发内壁上发生一次反射后返回返回时再发生一次穿透记为TRT
![](../../images/marschner_model1.png)
![](https://lychee.inksoul.top/uploads/original/6a/4b/60fd385397e03ba43d7d0113180e.webp)
在这一模型中(下图左),我们会将头发认为是一个玻璃的圆柱(总体可认为是扭曲,但局部必定是直的)包含两种结构外层cuticle(表层)内层cortex(皮层)
头发内部存在有色素,光线穿透后会有部分被吸收再向外传播
![](../../images/marschner_model2.png)
![](https://lychee.inksoul.top/uploads/original/95/ca/c57492910d90989d8eb3848ea0ca.webp)
该模型也考虑了三种光线和模型之间的相互作用(上图右)
将计算结果综合后可得到一个十分拟真的效果
![](../../images/eg_marschner_model.png)
![](https://lychee.inksoul.top/uploads/original/a7/51/c381db07aac296b60a5418481009.webp)
当然上述过程只定义了单根头发与光线的相互作用,与多根头发作用时需要额外计算多次散射
@ -279,11 +278,11 @@ VPL不能做glossy的物体
最终幻想15(ff15)
![](../../images/hair_appearance_model_application1.png)
![](https://lychee.inksoul.top/uploads/original/16/e8/06d8536c0633fcdc6b8d20832110.webp)
疯狂动物城
![](../../images/hair_appearance_model_application2.png)
![](https://lychee.inksoul.top/uploads/original/c3/95/9d499073066de4814fded59f1894.webp)
-------------------------
@ -291,7 +290,7 @@ VPL不能做glossy的物体
人的毛发计算模型往往不能用于动物毛发计算,如下图,左侧为人的毛发模型计算结果,可见其不足以描述光线与动物毛发的相互作用
![](../../images/fur_appearance_as_human_fur.png)
![](https://lychee.inksoul.top/uploads/original/53/d9/5a6d259d773e470393fa22d3cd9e.webp)
* 生物结构
@ -303,62 +302,61 @@ VPL不能做glossy的物体
动物毛发中的髓质更大,光线进入后更容易发生反射
![](../../images/human_fur_vs_animal_fur.png)
![](https://lychee.inksoul.top/uploads/original/6e/e4/864d6251453739e020d6b5f57aef.webp)
由此可见Marschner Model中忽略髓质在动物毛发计算中并不适用
![](../../images/importance_of_medulla.png)
![](https://lychee.inksoul.top/uploads/original/9b/fa/608ec7f60827213cdda47ee37e5d.webp)
有无髓质的对比
![](../../images/importance_of_medulla2.png)
![](https://lychee.inksoul.top/uploads/original/75/3d/938cfad2d1c48064d5e307035799.webp)
#### 双层圆柱模型(Double Cylinder Model)
该模型中加入了对髓质的精确描述
![](../../images/double_cylinder_model.png)
![](https://lychee.inksoul.top/uploads/original/2c/6c/daaa30892e6e0c552e1f993f7eaf.webp)
光线在打到表面后依旧会发生反射穿过结构后也可能无法到达髓质或是到达后没有发生反射与Marschner Model中一样存在R、TT、TRT
同样会有部分光穿过髓质的时候发散到各个方向上去(TTs),TRT也相同在穿过髓质的过程中两次都有可能被散射形成TRTs
![](../../images/double_cylinder_model_lobes.png)
![](https://lychee.inksoul.top/uploads/original/bc/0b/126b94a374d0023e15e7019812e8.webp)
可以使用5个不同的分量在原来的3个模型上加上2个散射的结果
![](../../images/double_cylinder_model_lobes2.png)
![](https://lychee.inksoul.top/uploads/original/6c/b0/15d3d4f6f7f832612ad5381fe1d1.webp)
##### 应用
下图中的仓鼠由60万根毛发组成在每像素中有1024个采样点的采样率下每帧需要渲染36.9分钟
![](../../images/60000_fur_fibers_hamster.png)
![](https://lychee.inksoul.top/uploads/original/c8/5c/40c4480a20c43d37b82939059a57.webp)
猩球崛起
![](../../images/double_cylinder_model_application1.png)
![](https://lychee.inksoul.top/uploads/original/fc/92/1285110c538c379f031e8d295958.webp)
狮子王
![](../../images/double_cylinder_model_application2.png)
![](https://lychee.inksoul.top/uploads/original/7c/48/223fa91777509033cadc421a4f1b.webp)
#### 颗粒材质(Granular Material)
如香料、盐、糖等等
![](../../images/granular_material.png)
![](https://lychee.inksoul.top/uploads/original/33/7c/db23cf13da953c996a573210d21f.webp)
计算量很大,但可以做些简化
比如一个沙子城堡,每一单元上由不同石子构成,各自成分占比也可得出,渲染结果在离得近的时候可以看到一粒一粒的,离得远的情况下就会是一个沙丘
![](../../images/granular_material_1.png)
![](https://lychee.inksoul.top/uploads/original/66/ee/6071fe6b1c275a92e9779bd7a5c2.webp)
![](../../images/granular_material_application1.png)
![](https://lychee.inksoul.top/uploads/original/75/e3/ed179c1d37bd38484dec37eb260d.webp)
![](../../images/granular_material_application2.png)
![](https://lychee.inksoul.top/uploads/original/7a/61/f7289911e7550ee4461cc7e83a20.webp)
--------------------
@ -372,13 +370,13 @@ VPL不能做glossy的物体
即并非沿着一个方向传播并被吸收,可以被传导到其他方向上去
![](../../images/translucent_material_jade.png)
![](https://lychee.inksoul.top/uploads/original/72/4e/9570049495b26c2e32c7a099d9b2.webp)
![](../../images/translucent_material_jellyfish.png)
![](https://lychee.inksoul.top/uploads/original/cb/2d/e1d69e37b077ca6988a22d7f75cf.webp)
在物理上,常常认为光线在某一个点进入某一个表面,在里面发生了大量散射,从另一个点钻出
![](../../images/subsurface_scattering.png)
![](https://lychee.inksoul.top/uploads/original/14/80/39ebf47259234405cda4e52c814b.webp)
#### 次表面散射(Subsurface Scattering)
@ -390,7 +388,7 @@ BRDF: 光线打到这个点,并从这个点出来,所有作用都发生在
BSSRDF可理解为吧BRDF的概念延伸到从一个点以任意方向进来再从任意一个其他的地方以任意方向出去
![](../../images/BRDF_vs_BSSRDF.png)
![](https://lychee.inksoul.top/uploads/original/45/93/7e064e01e7ccd475fd9d7943262c.webp)
* 定义
@ -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
光线打到物体上与物体底部出现光源类似,会从底部照亮着色点周围的一片,为了物理上的真实,推出一个光源不够,还要对应上方有一个光源,还要对应上方存在一个光源,相当于有两个光源照亮周围着色点的一块
![](../../images/dipole_approximation.png)
![](https://lychee.inksoul.top/uploads/original/68/94/912de5abb274627820e713f48954.webp)
* 效果
BRDF类石膏材质效果
![](../../images/eg_BRDF_caarve.png)
![](https://lychee.inksoul.top/uploads/original/65/06/030960946bb4d5467683cc48e162.webp)
BSSRDF,类大理石
![](../../images/eg_BSSRDF_carve.png)
![](https://lychee.inksoul.top/uploads/original/6d/da/13a6453f419cf89c096f303da44f.webp)
如图,BRDF渲染的皮肤效果显得干燥BSSRDF则能有很好的效果
![](../../images/BRDF_vs_BSSRDF.png)
![](https://lychee.inksoul.top/uploads/original/45/93/7e064e01e7ccd475fd9d7943262c.webp)
* 应用
人脸渲染
![](../../images/BSSRDF_application.png)
![](https://lychee.inksoul.top/uploads/original/91/79/fde151b0b8e3a2cc66d0f9cc0b6a.webp)
### 布料(cloth)
@ -442,7 +440,7 @@ BSSRDF,类大理石
纤维(fiber)是最基础的,纤维可以缠绕成不同的股(ply),不同的股再经过不同的缠绕形成线(yarn)
![](../../images/cloth_yarn_and_ply.png)
![](https://lychee.inksoul.top/uploads/original/a3/a1/483fa2bab254bf1305b33b763d91.webp)
Woven or Knitted(编织或针织)
@ -458,7 +456,7 @@ Woven or Knitted(编织或针织)
布料模型大多数并非在一个表面上难以使用BRDF来表示
![](../../images/render_as_surface_limitation.png)
![](https://lychee.inksoul.top/uploads/original/4c/ad/2d1cf744213554a1b49276f2c043.webp)
* 解决方案1
@ -466,114 +464,112 @@ Woven or Knitted(编织或针织)
计算量庞大,计算时间长
![](../../images/cloth_render_as_participating_media.png)
![](https://lychee.inksoul.top/uploads/original/59/e1/67e079b188b1678cdff3f8b1b69a.webp)
* 解决方案2
布料本身是纤维,渲染每一根纤维也能产生很好的效果,计算量同样惊人
![](../../images/cloth_render_as_actual_fibers.png)
![](https://lychee.inksoul.top/uploads/original/b9/9b/24c2fed05a633d1a50ddb2b8bfd5.webp)
* 应用
![](../../images/cloth_application.png)
![](https://lychee.inksoul.top/uploads/original/c3/6c/ab4126a0c1078152f0d0f2951cbc.webp)
#### 有细节的材质(Detailed Appearance)
如下图,渲染结果不错但并不真实,因为结果过于完美
![](../../images/detailed_appearance_motivation.png)
![](https://lychee.inksoul.top/uploads/original/5d/25/0c3a17252ea7d36c53de3fad3021.webp)
真实情况下车上会有高光,高光周围会有类似于蜘蛛网结构的划痕。鼠标上则会有由很多小的凸起形成的高光
![](../../images/detailed_appearance_motivation1.png)
![](https://lychee.inksoul.top/uploads/original/ac/1c/3fbc8b834f290f5f2b71f070e1e7.webp)
下图由微表面模型渲染得出,结果完美但不真实
![](../../images/detailer_appearance1.png)
![](https://lychee.inksoul.top/uploads/original/62/c4/abaadf64a9b65e712c0be3050de9.webp)
加入了实际可能产生不完美的地方
![](../../images/detailer_appearance2.png)
![](https://lychee.inksoul.top/uploads/original/a5/50/00366d23a800622358565d3c436b.webp)
模拟被同方向刷出的各项异性材质
![](../../images/detailer_appearance3.png)
![](https://lychee.inksoul.top/uploads/original/ac/d5/1270da2078bbe6b490f6436dd419.webp)
* 微表面模型中的法线分布
微表面模型中重要的是微表面的法线分布,描述分布时,往往使用非常简单的模型(正态分布、高斯),得到的自然是没有什么细节的结果(法线分布没有体现各种各样的变化和细节)
![](../../images/distribution_of_normals.png)
![](https://lychee.inksoul.top/uploads/original/ef/d9/943daa1a44ef770e916df752bc53.webp)
在蜗牛壳上贴了一个大的法线贴图,每个面都可以产生高光,所有高光形成一起就可以变成一个大高光
![](../../images/define_detail1.png)
![](https://lychee.inksoul.top/uploads/original/b6/22/7e5a2e8e9b0dcc35b3a1cac961d6.webp)
Metallic flakes:可替换别的模型,例如很多人在车漆中添加的亮片,亮片会形成很多不同的方向,不同方向会形成不同的反光
![](../../images/different_details2.png)
![](https://lychee.inksoul.top/uploads/original/2a/cc/3c2ebccc7420f379a7e4f6222bde.webp)
虽然能够定义各种细节,但渲染十分困难,需要渲染接近一个月才能得到这个结果
![](../../images/details_apperance_3.png)
![](https://lychee.inksoul.top/uploads/original/ee/5f/5f3290a74d674a9e06b016544a1e.webp)
* 渲染困难的原因:
认为每一个微表面是一个镜面,如下图场景中有一个针孔摄像机和一个点光源,那从摄像机打根光线过去,打到哪个表面,就可以知道它的法线,也就可以知道它的镜面反射方向,所以也就很难通过反射的方式让光线打到光源上。从光源打过来也是同理,打到一个微表面,并且知道如何反射,但就是反射不到摄像机上去
![](../../images/difficult_path_sampling_problem.png)
![](https://lychee.inksoul.top/uploads/original/fe/f1/28646a30e1a2607b01b1c244c5ff.webp)
解决:
由于一个像素会覆盖很多的微表面,如果将一个小的范围内的微表面的法线分布计算出来便可代替原本光滑的分布并用在微表面模型里
![](../../images/BRDF_over_a_pixel.png)
![](https://lychee.inksoul.top/uploads/original/49/8a/df174b57ddd49e330a6b145c8fe4.webp)
* P-NDF的形状
如果考虑像素覆盖的范围,就可以得到各种各样神奇的法线分布(NDF)。可以想象一个像素覆盖了非常多的微表面,那这些微表面自然会显示出一些统计学的规律,那如果覆盖的范围小,就会显示出一些很独特的性质,法线分布就会看上去很有特点
![](../../images/p-NDFs_have_sharp_features.png)
![](https://lychee.inksoul.top/uploads/original/54/49/50c98e55c668213322d5a3e68815.webp)
不同类型的法线贴图会引起不同的法线分布
![](../../images/p-NDF_sharps.png)
![](https://lychee.inksoul.top/uploads/original/ce/10/22430b3ea9af1dd710fd6c3c4588.webp)
* 例子和应用
![](../../images/blender_detail.png)
![](https://lychee.inksoul.top/uploads/original/4a/26/03ccda75aef26147514e6ad8a66d.webp)
![](../../images/ocean_wave_detail.png)
![](https://lychee.inksoul.top/uploads/original/75/76/b837ef345ba1d5a2d75f6bf4340c.webp)
游戏中的应用-古墓丽影中的雪地
![](../../images/detailed_material_application.png)
![](https://lychee.inksoul.top/uploads/original/eb/93/fded778c088b9fc279cebfcc196a.webp)
#### 波动光学
引入细节后,还用几何光学解释就不对,物理上当物体非常小,小到和光的波长相当时,就不能假设光线是沿直线传播的,而必须假设这个光是一个波,这就会涉及到衍射和干涉现象的发生
![](../../images/wave_optics_application.png)
![](https://lychee.inksoul.top/uploads/original/b8/25/569888bb704a2ea4441cae507451.webp)
比如在黑屋里,用点光源照亮一个金属片,会在本身只有一个颜色的金属片上看到各种各样的颜色
![](../../images/Observations_1.png)
![](https://lychee.inksoul.top/uploads/original/18/dd/adfbf07c74c9113523022c4f914e.webp)
![](../../images/Observations_2.png)
![](https://lychee.inksoul.top/uploads/original/f9/d5/c5ac90dc951826d614a93a434de0.webp)
白光照射后反射出来的便为白光,如果不是白的就一定有波动光学(Wave Optics)
波动光学得出的BRDF与几何光学的BRDF很像但具有不连续的特点(光会发生干涉,会引起部分区域加强或减弱)
![](../../images/detailed_material_under_wave_optics.png)
![](https://lychee.inksoul.top/uploads/original/d7/d9/fdf12d0324ca94974481fb8a7e90.webp)
以下为波动关系渲染的结果
![](../../images/wave_optics_application.png)
![](https://lychee.inksoul.top/uploads/original/b8/25/569888bb704a2ea4441cae507451.webp)
![](../../images/wave_optics_application%202.png)
![](https://lychee.inksoul.top/uploads/original/8b/47/3cb0472a7c3198eeb00f759c8315.webp)
--------------------
@ -583,33 +579,32 @@ Metallic flakes:可替换别的模型,例如很多人在车漆中添加的亮
如下图可定义各种各样的花纹,花瓶打碎后可见花瓶内部纹理,可定义一个三维纹理
![](../../images/procedural_appearance1.png)
![](https://lychee.inksoul.top/uploads/original/48/e8/c15d1354c446f0c72e72bba98cb4.webp)
存储量在三维下会变得很大可利用noise函数(x,y,z)给定任何x,y,z可得到对应的值,这样可以实现什么时候用就什么时候去查
![](../../images/procedural_appearance2.png)
![](https://lychee.inksoul.top/uploads/original/50/16/acf7fcab76fcbc0ba6be61f93399.webp)
procedural更多意味着不生成需要时再查询
* 车上的锈
可生成一系列噪声,可对噪声做出一系列操作(二值化(binary noise))铁锈往往是不同区域有不同分布这个噪声如果为0到1当函数值大于0.8时认为是1小于0.8就认为是0
![](../../images/procedural_appearance3.png)
![](https://lychee.inksoul.top/uploads/original/1b/10/6ca80482924300de5a1ec4f630c9.webp)
应用最广泛的是柏林(Perlin)噪声
* 生成地形
![](../../images/procedural_appearance4.png)
![](https://lychee.inksoul.top/uploads/original/ec/8d/8203399e1eb1847325d8339b3c37.webp)
* 生成海浪
![](../../images/procedural_appearance5.png)
![](https://lychee.inksoul.top/uploads/original/3a/17/84ebd8d90a09f91c48118b9258da.webp)
* 生成木头纹理
![](../../images/procedural_appearance6.png)
![](https://lychee.inksoul.top/uploads/original/da/83/be257025cd8b7ee391166f9dd23c.webp)
常用Houdini来做程序化材质且是先程序化生成再拿去使用

View File

@ -1,6 +0,0 @@
---
title: "Hello World"
date: 2022-05-10T09:01:33+08:00
draft: true
---
this is a test post

View File

@ -12,7 +12,7 @@ date: 2023-08-07T19:09:08+08:00
首先需要在gitea上创建OAth2应用令牌并设置应用的重定向URL
![](../../images/%E6%9D%82%E7%89%A9/Drone%E9%83%A8%E7%BD%B2%E5%92%8C%E4%B8%8Egitea%E7%9A%84%E9%9B%86%E6%88%90/OAth2.png)
![](https://lychee.inksoul.top/uploads/original/8c/4c/3a042862e73ebf707bcf9e4998bd.webp)
重定向URL必须为http(s)://域名/login形式视ssl情况是否有s
@ -103,18 +103,18 @@ docker-compose中环境变量设置在等于号后面不要输入空格再接参
实在不懂可以找一个github授权的网页查看URL结构就可以模仿github授权的URL结构在404页面的URL中截取
![](../../images/%E6%9D%82%E7%89%A9/Drone%E9%83%A8%E7%BD%B2%E5%92%8C%E4%B8%8Egitea%E7%9A%84%E9%9B%86%E6%88%90/OAthURL.png)
![](https://lychee.inksoul.top/uploads/original/2a/be/a98170bd0bb49d0bf9bd957e33e1.webp)
---
一切正常地部署完成后便可以在drone的首页看到自己在gitea上的所有项目可以查看build情况和设置对应的选项
![](../../images/%E6%9D%82%E7%89%A9/Drone%E9%83%A8%E7%BD%B2%E5%92%8C%E4%B8%8Egitea%E7%9A%84%E9%9B%86%E6%88%90/drone%E9%A6%96%E9%A1%B5.png)
![](https://lychee.inksoul.top/uploads/original/ed/98/c53079b9fefd6f4f1f40c2fc430e.webp)
这里展示的是这个便是这个博客在我的drone上的设置
![](../../images/%E6%9D%82%E7%89%A9/Drone%E9%83%A8%E7%BD%B2%E5%92%8C%E4%B8%8Egitea%E7%9A%84%E9%9B%86%E6%88%90/drone%E8%AE%BE%E7%BD%AE.png)
![](https://lychee.inksoul.top/uploads/original/7e/ea/11f7f3834eec9d740dbab2f9460a.webp)
单有流水线设置还不够流水线流程的定义还需要在项目中使用yaml文件来定义对应的文件就在drone上设置
@ -126,7 +126,7 @@ webhook在完成drone的集成时就由drone在对应gitea项目下自动创建
如图,我只选择了一些会导致博客内容发生改变的选项
![](../../images/%E6%9D%82%E7%89%A9/Drone%E9%83%A8%E7%BD%B2%E5%92%8C%E4%B8%8Egitea%E7%9A%84%E9%9B%86%E6%88%90/webhook%E8%AE%BE%E7%BD%AE.png)
![](https://lychee.inksoul.top/uploads/original/d1/8e/e9362511bbed8d0cb1365cbfeed9.webp)
既然drone是在容器内执行任务那么容器镜像则十分重要为了确保足够轻量内存溢出的教训印象深刻我选择了自行配置一个镜像使用alpine + git + hugo + rsync来配置尽可能减少容器占用
@ -180,4 +180,6 @@ volumes: #声明数据卷
流水线配置依旧存在一些问题每次build都需要clone一遍导致耗时比较长尤其大型项目下一步考虑引入drone-volume-cache缓存项目来加快速度
2024现在已经改成了自部署lychee作为图床并全面转入webp格式图片缓存将在下次编译有大量依赖的项目时使用
整体下来轻量化十分明显原来溢出的内存现在只占用了1GB不止nginx + gitea + drone三项服务也节省了不少服务器的开支毕竟云服务对于我这种学生党还是比较贵的

View File

@ -5,6 +5,7 @@ date: 2022-08-22T21:53:27+08:00
---
由于王道停止在bilibili更新每日一题随之停更
该题更新于2022-09-02 18:45:36

View File

@ -8,6 +8,7 @@ clone:
steps:
- name: build
pull: if-not-exists
image: inksoul/hugo-rsync
depends_on: [clone] # 依赖的步骤,
volumes: #挂载数据卷

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1003 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Some files were not shown because too many files have changed in this diff Show More