Skip to content

Commit d3b7487

Browse files
committed
add more to notes16
1 parent 178a6ba commit d3b7487

File tree

14 files changed

+158
-36
lines changed

14 files changed

+158
-36
lines changed

.DS_Store

0 Bytes
Binary file not shown.

.dnconfig

60 KB
Binary file not shown.

Notes13.md

+65-9
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ Read More
99

1010
## why
1111

12+
光线追踪和光栅化, 是两种不同的成像方式。
13+
1214
光线追踪能解决全局效果的场景 (尤其是间接光照很合适, 当然并不是说光栅化就不能做全局光照)
1315

14-
一般认为光栅化是属于快速近似. 并不是那么精细. 而光线追踪追求更加真实.
16+
一般认为光栅化是属于快速近似. 并不是那么精细. 而光线追踪追求更加真实. 光栅化对于全局的情况处理的不好, 比如半影,全局光照等。
1517

1618
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing3.png)
1719

@@ -28,6 +30,12 @@ PS:所以光线追踪的思想是感知光线
2830

2931
光线追踪是跟踪眼睛发出的光线( 这点似乎和常识有点不同, 是由于光路可逆 ) 到达物体的过程
3032

33+
34+
PS: 在这里的光线追踪基于下面三个假设
35+
- 光线直线传播(尽管物理上并不是)
36+
- 光线不会发生碰撞 (或者说光线相交了但是互不影响 尽管物理上不是)
37+
- 光线从光源传播到人的眼睛
38+
3139
光线的一个性质: 光路可逆 (也就是追踪的意思)
3240

3341
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing4.png)
@@ -40,44 +48,78 @@ PS:所以光线追踪的思想是感知光线
4048
光线追踪因为 ray 是从眼睛( 摄像机 ) 发出, 因此天然的解决了遮挡(深度测试)的问题,
4149

4250

51+
早期人类认为人们能看见东西是因为从眼睛发射出射线, 尽管这并不符合现在的认知,但是根据光路的可逆性,是可以这样理解的。
52+
4353

4454
## Whitted Style Ray tracing
4555

4656
Whitted Style: 多次递归反射, 就是在模拟光线在不断弹射的过程.
4757

4858
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing2.png)
4959

60+
eye ray 永远考虑和场景中的物体最近的点 (完美解决了深度问题)
61+
5062
下面是一个玻璃球, 既有折射, 又有反射. 同时还要计算和光源的情况.
5163

5264
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing5.png)
5365

5466
其实从这个图可以看到 光路有很多条, 最终我们要计算的是他们的和 (每条光路存在能量损失, 不然加起来光线亮度就很亮了)
5567

68+
whitted style 是递归的
5669

5770
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing6.png)
5871

72+
在任意一个点可以继续传播射线,只要计算好反射和折射方向。
73+
74+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing10.jpg)
75+
在射线和物体的每一个交点,都和光源连线, 计算着色, 最终把这些着色加起来, 反映在像素点上。(被挡住的除外)
76+
77+
## 射线的定义
5978

79+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing12.jpg)
80+
O + td
6081

61-
### 和球的交点
82+
O 是光源位置
83+
84+
d 是光线方向
85+
86+
## 和球的交点
6287

6388
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing7.png)
6489

90+
最后解除的 t 一定是正数
91+
92+
93+
## 推广到和所有隐式表面f(p) = 0求交
94+
95+
对于任何一种隐式表面 现在有很多工具可以利用数值法求解 甚至无需解方程
96+
6597
### 和显式表面求交点怎么做呢?
98+
99+
66100
刚才 f(xx) = 0 是一个隐式表面的几何表达形式.
67101

68102
显式表面其实是求光线和三角形面的交点.
69103

70-
PS
104+
PS 通过光线和三角形求交点,可以判断是点否在物体内部。
71105

72106
如果一个点在封闭物体内部, 不论物体形状如何, 从这个点出发任意一条射线, 与物体的交点一定是奇数. 偶数的话一定是在物体外。
73107

74108
根据这个性质,可以用来判断是否在一个点是否在物体内部
75109

76110
该性质2D 3D 都满足
77111

78-
More 奇偶规则和非零缠绕规则 https://blog.csdn.net/g0ose/article/details/54933038
112+
Read More 奇偶规则和非零缠绕规则 https://blog.csdn.net/g0ose/article/details/54933038
113+
114+
115+
### 光线是否和物体相交
116+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing13.png)
117+
118+
假设屏幕分辨率4K 我们要做的就是每一个像素都发出一条射线和模型的每一个三角形面求交点。
79119

80-
### 和三角形面的交点
120+
每一个三角形都计算一遍会很慢。 后面会介绍一些加速方法
121+
122+
## 和三角形面的交点
81123

82124
先判断和平面相交, 再判断交点是否在三角形中.
83125

@@ -114,17 +156,21 @@ Möller Trumbore MT 算法
114156
图中底下一大串是用来判断方程组是否有解
115157
More 克莱姆法则 https://zh.wikipedia.org/wiki/%E5%85%8B%E8%90%8A%E5%A7%86%E6%B3%95%E5%89%87
116158

159+
# 加速
160+
刚才说到和每一个三角形求交点很慢 如何加速呢
161+
162+
## 包围盒 Bounding Volume
117163

118164
## AABB 轴对齐包围盒
119165
用来减少没有必要的计算
120166

121167
我们的摄像机, 也就是你所看到的屏幕. 每个像素都要发出一条光线, 和场景中所有的三角形求交点, 然后光线还要不断反射. 这样太慢了 怎么帮
122168

123169

170+
### 原理
171+
AABB能加速是基于这么一条结论: 如果光线都不和包围盒相交, 那么光线更不和可能和包围盒中的物体相交. 所以可以利用包围盒做加速
124172

125-
基于这么一条结论: 如果光线都不和包围盒相交, 那么光线更不和可能和包围盒中的物体相交. 所以可以利用包围盒做加速
126-
127-
上下左右前后 3对对面, 形成一个包围盒.
173+
这个立方体上下左右前后 3对对面, 形成一个包围盒.
128174

129175
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/aabb3.png)
130176

@@ -135,6 +181,16 @@ More 克莱姆法则 https://zh.wikipedia.org/wiki/%E5%85%8B%E8%90%8A%E5%A7%86%
135181

136182
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/aabb1.png)
137183

184+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/aabb3.png)
185+
138186
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/aabb2.png)
139187

140-
最终的包围盒中的射线, 是这三者求交集
188+
Tenter Texit 是射线和盒子交汇的时机, 没有交点通过延长线求交点。
189+
190+
任何一组对面, 都可以求出光线进入和出去的时间 (即便是负数也OK, 有负数解是其中一种情况光源在这组对面内)
191+
192+
最终的包围盒中的射线, 是这三者求交集
193+
194+
如果 Texit < 0 表示没有交点 这里隐含的说明了 Tenter < 0 (因为 Tenter < Texit )
195+
196+
如果 Tenter < Texit 表示光线在盒子中停留过一段时间,可能有交点

Notes14.md

+12-3
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,22 @@ BVH 是对物体划分(更形象点说是分组) 但是空间上组与组之间
134134

135135
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/radiance.png)
136136

137-
- Radiant flux 辐射通量 (又称为 power)
137+
- Radiant flux 辐射通量 (又称为 power) 也称为功率
138138
- Radiant intensity 辐射强度 (和方向有关) power per solid angle 在单位立体角中的能量
139-
- irrediance 辐照度 OR 辐射照度 power per projected unit area (物理学: 单位面积接收到的辐射通量 图形学:一个物体表面单位面积接收到的光的能量)
140-
- radiance 辐射亮度 (物理学:单位投影面积, 单位立体角上的辐射通量 图形学:光线在传播过程中度量能量)
139+
- Irrediance 辐照度 OR 辐射照度 power per projected unit area (物理学: 单位面积接收到的辐射通量 图形学:一个物体表面单位面积接收到的光的能量)
140+
- Radiance 辐射亮度 (物理学:单位投影面积且单位立体角上的辐射通量 图形学:光线在传播过程中度量能量) 和方向有关
141141

142142
PS 图形学中所说到的能量一般都是单位时间内的能量 也就是power 功率 Joule 焦耳在图形学中很少使用
143143

144+
Read More https://zhuanlan.zhihu.com/p/52497510
145+
146+
这篇文章有有一些更形象的说法
147+
- Radiant flux 光子每秒击中物体的量 功率,单位是瓦特 通常使用字母 Φ 表示
148+
- Radiant intensity
149+
- Irradiance 每秒每单位面积的击中
150+
- Radiance 辐射度是沿着由原点p和方向 ω 定义的射线的能量
151+
152+
144153

145154
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/radiance2.png)
146155

Notes15.md

+29-14
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,29 @@ Whitted Style 光线打到某一个物体上, 然后被弹走了(方向改变了
6767

6868
## The Reflection Equation 反射方程
6969

70-
ωi 表示不同方向的入射光 (从内到外)
7170

72-
p 表示反射点 point
71+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/brdf.png)
7372

74-
Li(p, ωi) 是入射光的 radiance
73+
PS: Li(p, ωi)cos(θi)dωi 是图中那一个小块区域dA得到的 Irradiance 其中Li(p, ωi)是入射能量
7574

76-
fr 对于每一个入射方向都会对应一个着色点和出射方向 这样的BRDF 函数
75+
PS: 然后乘以BRDF 函数fr(p, ωi -> wr) 就得到出射的Radiace, 最后整体做积分
7776

78-
反射方程
77+
PS: 这里的H 表示半球面
7978

80-
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/brdf.png)
79+
关于此渲染方程 Read More https://zh.wikipedia.org/wiki/%E6%B8%B2%E6%9F%93%E6%96%B9%E7%A8%8B
8180

82-
PS: Li(p, ωi)cos(θi)dωi 是图中那一个小块区域dA得到的 Irradiance 其中Li(p, ωi)是入射能量
81+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rendering1.png)
8382

84-
PS: 然后乘以BRDF 函数fr(p, ωi -> wr) 就得到出射的Radiace, 最后整体做积分
8583

84+
Lo(p, ω0) 是点p在出射ω0方向的最终渲染结果
8685

86+
Le(p, ω0) 是点p在ω0方向的自发光
87+
88+
fr(p, ωi, ω0) 点P和入射方向 ωi 到出射方向 ω0 的比例。也就是出射的分布函数。
89+
90+
Li(p, ωi) 是点p 和入射光方向ωi
91+
92+
n.ωi 是入射角带来的衰减系数。
8793

8894

8995
## The Rendering Equation 渲染方程
@@ -94,18 +100,25 @@ PS: 然后乘以BRDF 函数fr(p, ωi -> wr) 就得到出射的Radiace, 最后整
94100

95101
射出的radiance 可能成为其他点的入射radiance (此刻被照亮的物体本身作为光源存在了), 因此入射光不仅仅是单一的光源.
96102

97-
98103
### 渲染方程
99-
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rendering2.jpg)
104+
105+
```
106+
对于不发光物体,渲染方程就是反射方程。
100107
108+
发光物体,渲染方程 = 自发光 + 反射方程。
109+
```
101110

102-
所看到的光 等于物体自己发出的光 + 从四面八方反射过来的光
103111

112+
反射的光线取决于入射的光线 但是入射光线又取决于其他物体的反射光线, 因此存在递归问题。
104113

105-
Le(p, ωo) 表示自发光
114+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rendering2.jpg)
106115

116+
公式说明
117+
```
118+
Le(p, ωo) 表示自发光
107119
Ω+ OR H^2 表示半球
108-
120+
```
121+
所看到的光 等于物体自己发出的光 + 从四面八方反射过来的光
109122
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rendering.jpg)
110123

111124
PS : 这里的积分是因为面光源 面光源就是点光源的积分
@@ -132,6 +145,8 @@ PS: 渲染方程是定义在立体角上的
132145

133146

134147
但是对于其他物体反射过来的光应该怎么整?
148+
## 递归
149+
135150

136151
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rendering3.jpg)
137152

@@ -181,7 +196,7 @@ https://www.cnblogs.com/mengdd/p/3237991.html
181196

182197

183198

184-
## (Radiance versus irradiance
199+
## (Radiance versus irradiance)
185200
(Radiance versus irradiance)[http://sites.sinauer.com/animalcommunication2e/chapter04.02.html]
186201

187202
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/radiance11.jpg)

Notes16.md

+52-10
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,54 @@ PS: 蒙特卡罗适合任何形式的积分.
5555

5656

5757
## Path tracing
58-
59-
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing2.jpg)
60-
6158
Whitted Style 有错误,但是渲染方程是正确的
59+
60+
求渲染方程的解
6261
- 首先需要求出半球上的积分
6362
- 另外解决递归问题
6463

64+
再次回忆一下渲染方程的定义
65+
66+
Lo(p, ω0) 是点p在出射ω0方向的最终渲染结果
67+
68+
Le(p, ω0) 是点p在ω0方向的自发光
69+
70+
fr(p, ωi, ω0) 点P和入射方向 ωi 到出射方向 ω0 的比例。也就是出射的分布函数。
71+
72+
Li(p, ωi) 是点p 和入射光方向ωi
6573

66-
一个收集光源发出的光线的 蒙特卡洛积分求解
74+
n.ωi 是入射角带来的衰减系数。
75+
76+
关于此渲染方程 Read More https://zh.wikipedia.org/wiki/%E6%B8%B2%E6%9F%93%E6%96%B9%E7%A8%8B
77+
78+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing2.jpg)
79+
80+
81+
## 蒙特卡洛积分求解
6782
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing3.jpg)
6883

6984
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing4.jpg)
7085

86+
```
87+
注意⚠️ 此公式分母中的P略有歧义 分母中的P 表示PDF 函数,其他的p表示点p
88+
```
89+
7190

7291
如果是物体反射的光线怎么做?
92+
93+
## 递归
94+
假设入射光是来自点q 的反射光线
95+
7396
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing5.jpg)
7497

98+
⚠️
99+
```
100+
这里的红色部分shade(q, -ωi) 点p的入射方向 ωi 对于点q 来说,就是q 点的出射方向,因此加上负号
101+
```
102+
103+
看起来很完美了!但是还没有结束。
104+
105+
根据上面的做法 存在爆炸问题
75106

76107
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing6.jpg)
77108

@@ -85,18 +116,23 @@ N = 1时就是路径追踪, N !=1 分布式路径追踪, 存在指数爆炸
85116

86117
但是这样会造成很多噪声,毕竟采样不够。
87118

88-
那么对每一个像素, 多尝试几次光线,且每次光线打到物体反射都只再发出一条射线
119+
那么对每一个像素, 在每次光线打到物体反射都只再发出一条射线的基础上,多射出几条射线
89120
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing8.jpg)
90121

122+
### RayTracing && RayCasting 光线追踪和光线投射相似的地方
123+
124+
从参数可以看出 都是从一个相机位置出发, 向每一个像素所在方向发出射线。
91125

92126
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing9.jpg)
93127

94-
目前有两个问题
95-
TODO
96-
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing10.jpg)
128+
不过目前仍有两个问题
97129

130+
1.
131+
2. 递归没有停止
132+
133+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing10.jpg)
98134

99-
关于俄罗斯轮盘赌 RR
135+
## 俄罗斯轮盘赌 RR
100136
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing11.jpg)
101137

102138
上面提到递归没有停止条件, 现在通过俄罗斯轮盘赌方式,每次路径打到某一个点之后, 通过轮盘赌的方式决定路径追踪是否继续。
@@ -112,7 +148,9 @@ TODO
112148

113149

114150

115-
### 浪费
151+
### 浪费问题
152+
153+
现在的实现存在计算浪费的问题
116154

117155
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing13.jpg)
118156

@@ -124,6 +162,10 @@ TODO
124162
根据前面的定义, 蒙特卡洛积分要求是在X上面采样 最后就在X 上面积分 (这里的X是积分域)
125163

126164
我们能否在光源上采样, 并且不是像之前那样在立体角上积分,而是也在光源上积分呢?
165+
166+
## Sampling the light
167+
PS: 有的地方也称为面积形式的的渲染方程, 并且将前面介绍的方程称为半球面形式。
168+
127169
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/tracing14.jpg)
128170

129171
来自于光源的部分, 可以使用对光源采样。其他非光源的贡献,继续使用RR

images/aabb3.jpg

224 KB
Loading

images/raytacing12.jpg

164 KB
Loading

images/raytracing10.jpg

171 KB
Loading

images/raytracing11.jpg

147 KB
Loading

images/raytracing13.jpg

330 KB
Loading

images/rendering1.jpg

531 KB
Loading

0 commit comments

Comments
 (0)