Skip to content

Commit 0c17900

Browse files
fresnel 定律公式提交
1 parent 4d65412 commit 0c17900

File tree

6 files changed

+307
-4
lines changed

6 files changed

+307
-4
lines changed
2.3 MB
Loading

PathTracing/src/RT_in_OneWeekend/ray_camera.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,8 @@ color ray_color(const ray& r) {
170170
171171
这样就得到了一个从白色渐变到蓝色的背景效果。
172172
173-
![alt text](image-3.png)
173+
![alt text](image-3.png)
174+
175+
176+
![alt text](image-4.png)
177+

raytracing_book/book.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ src = "src"
55
title = "光线追踪"
66

77
[output.html]
8-
mathjax-support = true
8+
# mathjax-support = true
99
additional-css = ["theme/custom.css"]
1010
additional-js = ["theme/custom.js"]
1111

@@ -15,4 +15,5 @@ additional-js = ["theme/custom.js"]
1515
enable = true # 启用目录折叠
1616
level = 1 # 设置折叠深度(例如:1 表示第一级目录开始折叠)
1717

18-
18+
[preprocessor.katex]
19+
after = ["links"]
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
2+
一、斯涅尔定律(Snell's Law)简介
3+
----------------------
4+
5+
当光线从一种介质进入另一种介质时(如从空气进入水中),光的传播方向会发生改变,这种现象称为**折射**。斯涅尔定律描述了这种折射过程中的**入射角****折射角**之间的关系。
6+
7+
### 数学表达:
8+
9+
$$n_1 \sin\theta_1 = n_2 \sin\theta_2$$
10+
11+
* $n_1$:入射介质的折射率
12+
13+
* $n_2$:折射介质的折射率
14+
15+
* $\theta_1$:入射角(光线与法线的夹角)
16+
17+
* $\theta_2$:折射角(折射光线与法线的夹角)
18+
19+
20+
> 角度都是相对于法线(而不是表面)来定义的。
21+
22+
* * *
23+
24+
二、折射向量的推导与计算
25+
------------
26+
27+
在图形学中,我们常常需要从入射光线向量和法线计算折射向量。这一过程基于**向量形式的斯涅尔定律**,以下是推导全过程。
28+
29+
* * *
30+
31+
### 1. 设定
32+
33+
已知以下向量:
34+
35+
* $\mathbf{I}$:单位入射向量(朝向表面,已归一化)
36+
37+
* $\mathbf{N}$:单位法线向量(朝外,已归一化)
38+
39+
* $\eta = \frac{n_1}{n_2}$:折射率比(入射介质 / 折射介质)
40+
41+
42+
目标:求出折射后的单位向量 $\mathbf{T}$
43+
44+
* * *
45+
46+
### 2. 斯涅尔定律在向量空间的表达
47+
48+
入射向量与法线之间的夹角为 $\theta_1$,根据余弦定义:
49+
50+
$$\cos\theta_1 = -\mathbf{I} \cdot \mathbf{N}$$
51+
52+
(注意:入射光向量指向表面,法线向外,因此取负号)
53+
54+
* * *
55+
56+
### 3. 折射向量构建思路
57+
58+
我们将折射向量 $\mathbf{T}$ 拆解为两个分量:
59+
60+
* **平行于表面的分量** $\mathbf{T}_\parallel$
61+
62+
* **垂直于表面的分量** $\mathbf{T}_\perp$
63+
64+
65+
* * *
66+
67+
### 4. 使用折射率比进行缩放
68+
69+
根据折射定律和平面几何关系,有:
70+
71+
#### 平行分量:
72+
73+
$$\mathbf{T}_\parallel = \eta(\mathbf{I} + \cos\theta_1 \cdot \mathbf{N})$$
74+
75+
(先将 $\mathbf{I}$ 在法线方向分解掉,然后缩放)
76+
77+
* * *
78+
79+
### 5. 计算垂直分量(保持单位长度)
80+
81+
设 $\cos\theta_2$ 为折射角余弦,由三角恒等式有:
82+
83+
$$\cos^2\theta_2 = 1 - \sin^2\theta_2$$
84+
85+
又由斯涅尔定律知:
86+
87+
$$\sin\theta_2 = \eta \sin\theta_1$$
88+
89+
而 $\sin^2\theta_1 = 1 - \cos^2\theta_1$,代入得:
90+
91+
$$\cos^2\theta_2 = 1 - \eta^2 (1 - \cos^2\theta_1)$$
92+
93+
因此:
94+
95+
$$\mathbf{T}_\perp = -\sqrt{1 - \eta^2 (1 - \cos^2\theta_1)} \cdot \mathbf{N}$$
96+
97+
* * *
98+
99+
### 6. 折射向量的总和
100+
101+
$$
102+
\vec{T} = \eta \cdot (\vec{I} + \cos \theta_i) - \sqrt{1 - \eta^2(1 - \cos^2\theta_i)} \cdot \vec{N}
103+
$$
104+
105+
$$
106+
\vec{T} = \eta \cdot (\vec{I} + \cos\theta_i \cdot \vec{N}) - \sqrt{1 - \left| \eta \cdot (\vec{I} + \cos\theta_i \cdot \vec{N}) \right|^2} \cdot \vec{N}
107+
$$
108+
109+
这是常见的折射向量表达式,可用于 Shader、渲染管线等场景。
110+
111+
* * *
112+
113+
三、特殊情况:全反射
114+
----------
115+
116+
如果
117+
118+
$$\eta^2 (1 - \cos^2\theta_1) > 1$$
119+
120+
则根号内为负值,此时**不存在实数解**,即发生了**全反射**(Total Internal Reflection)。也就是说,所有光都被反射回去了,没有折射向量。
121+
122+
* * *
123+
124+
四、伪代码实现(Unity HLSL 等价)
125+
----------------------
126+
127+
```hlsl
128+
float3 Refract(float3 I, float3 N, float eta)
129+
{
130+
float cos1 = clamp(-dot(I, N), -1.0, 1.0);
131+
float sin2Sq = eta * eta * (1.0 - cos1 * cos1);
132+
133+
if (sin2Sq > 1.0)
134+
return float3(0,0,0); // 全反射,无折射
135+
136+
float cos2 = sqrt(1.0 - sin2Sq);
137+
return eta * I + (eta * cos1 - cos2) * N;
138+
}
139+
```
140+
141+
* * *
142+
143+
五、物理直觉总结
144+
--------
145+
146+
* 折射是因为光速在不同介质中不同。
147+
148+
* 法线方向决定了角度定义,必须统一。
149+
150+
* 折射向量的构造保留了单位长度。
151+
152+
* 在图形学中更常使用向量形式而不是角度形式进行计算。
153+
154+
155+
如需结合图示说明、代码调试或反射向量对比,我也可以补充说明。
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
一、Fresnel 方程简介
2+
--------------
3+
4+
当光线射向介质表面时,一部分光会**反射**,另一部分光会**折射(透射)**
5+
**Fresnel 方程**用于计算不同角度下,反射光和折射光的比例(反射率与透射率)。
6+
7+
* * *
8+
9+
### 定义:
10+
11+
对于入射光,其反射率取决于:
12+
13+
* 入射角 $\theta_1$
14+
15+
* 折射角 $\theta_2$
16+
17+
* 两侧介质的折射率 $n_1$、$n_2$
18+
19+
* 光的极化方式(s极化或p极化)
20+
21+
22+
Fresnel 方程给出了两种极化方向下的反射率:
23+
24+
* $R_s$:s-极化(垂直于入射面)反射率
25+
26+
* $R_p$:p-极化(平行于入射面)反射率
27+
28+
29+
整体反射率为:
30+
31+
$$R = \frac{R_s + R_p}{2}$$
32+
33+
* * *
34+
35+
### 数学表达:
36+
37+
$$R_s = \left| \frac{n_1 \cos\theta_1 - n_2 \cos\theta_2}{n_1 \cos\theta_1 + n_2 \cos\theta_2} \right|^2$$ $$R_p = \left| \frac{n_1 \cos\theta_2 - n_2 \cos\theta_1}{n_1 \cos\theta_2 + n_2 \cos\theta_1} \right|^2$$
38+
39+
* * *
40+
41+
### 说明:
42+
43+
* $$\cos\theta_1 = -\vec{I} \cdot \vec{N}$$
44+
45+
* $\cos\theta_2$ 可通过 Snell's Law 推出
46+
47+
* 由于不同极化方向反射行为不同,图形学通常**取平均值**
48+
49+
50+
* * *
51+
52+
二、Schlick 近似(图形学中常用的高效估算)
53+
-------------------------
54+
55+
完整的 Fresnel 方程较为复杂,尤其在实时渲染中代价高。因此**Christophe Schlick** 提出一个简洁的近似公式,在角度较小时非常精确。
56+
57+
* * *
58+
59+
### Schlick 公式:
60+
61+
$$R(\theta) = R_0 + (1 - R_0)(1 - \cos\theta)^5$$
62+
63+
其中:
64+
65+
* $R_0 = \left( \frac{n_1 - n_2}{n_1 + n_2} \right)^2$:垂直入射($\theta = 0^\circ$)时的反射率
66+
67+
* $$\cos\theta = -\vec{I} \cdot \vec{N}$$
68+
69+
70+
* * *
71+
72+
### 物理意义:
73+
74+
* 当光垂直入射($\cos\theta = 1$)时,反射率最小
75+
76+
* 当光接近平行于表面($\cos\theta \rightarrow 0$)时,反射率迅速上升接近 1
77+
78+
* 该公式可逼近玻璃、水、金属等各种介质在非极化光条件下的反射行为
79+
80+
81+
* * *
82+
83+
### HLSL/GLSL 实现示例:
84+
85+
```hlsl
86+
float FresnelSchlick(float cosTheta, float R0)
87+
{
88+
float x = 1.0 - cosTheta;
89+
float x2 = x * x;
90+
return R0 + (1.0 - R0) * x2 * x2 * x; // x^5
91+
}
92+
```
93+
94+
* * *
95+
96+
三、金属与非金属 Fresnel 行为差异
97+
---------------------
98+
99+
### 非金属(Dielectric):
100+
101+
* $R_0$ 通常很小(如水约 0.02)
102+
103+
* 折射主导(反射仅在斜角时明显)
104+
105+
106+
### 金属(Conductor):
107+
108+
* 没有透射光(几乎完全反射)
109+
110+
* Fresnel 反射率随波长、方向、材质显著变化
111+
112+
* 实际中用 **复折射率(complex IOR)** 计算:$n + ik$,更复杂
113+
114+
115+
> 图形学中 PBR 通常使用 LUT 或基于经验参数来近似金属 Fresnel 效果
116+
117+
* * *
118+
119+
四、图形学中的使用总结
120+
-----------
121+
122+
| 使用目的 | 方法选择 | 精度 | 性能 |
123+
| --- | --- | --- | --- |
124+
| 实时渲染(如玻璃、水) | Schlick 近似 | 高(对于非金属) | 高效 |
125+
| 精确物理仿真 | 完整 Fresnel 方程 | 准确 | 较慢 |
126+
| 金属材质 | 使用复折射率 或 Lookup Table | 精确 | 中等 |
127+
128+
* * *
129+
130+
五、补充:Fresnel 与渲染公式中的作用
131+
----------------------
132+
133+
在 PBR(基于物理的渲染)中:
134+
135+
* Fresnel 是 **镜面反射项(Specular)** 的核心组成部分
136+
137+
* 常与微表面模型(如 GGX)配合使用
138+
139+
* 调节光与视角之间的高光强度变化
140+
141+
142+
* * *

raytracing_book/src/SUMMARY.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
- [可定位相机](OneWeekend/12_positionable_camera.md)
1515
- [散焦模糊](OneWeekend/13_defocus_blur.md)
1616
- [下一步去哪](OneWeekend/14_next.md)
17-
17+
- [Snel's Law](./OneWeekend/fresnel.md)
18+
- [Fresnel Equation](./OneWeekend/fresnel_equation.md)
1819
- [DirectX11 相关](#2)
1920
- [Multithreading](directx11/multithreading.md)
2021
- [Effect](directx11/effect/effect.md)

0 commit comments

Comments
 (0)