完成计算机基础和图形学的webp图片替换和删除
continuous-integration/drone/push Build is passing Details

switch-png-to-webp
InkSoul 2024-01-19 23:00:30 +08:00
parent 871a2a082b
commit fe05a1acfe
516 changed files with 476 additions and 503 deletions

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

@ -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

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: 523 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

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