Skip to content

Commit

Permalink
Update "GAMES101 第7讲 着色(Blinn-Phong反射模型)"
Browse files Browse the repository at this point in the history
  • Loading branch information
WangSimiao2000 committed Dec 25, 2024
1 parent 59df12b commit cbe1a2d
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 17 deletions.
113 changes: 96 additions & 17 deletions _posts/2024-12-21-GAMES101-Lecture07.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: GAMES101 第7讲 着色(Blinn-Phong反射模型, 漫反射)
title: GAMES101 第7讲 着色(Blinn-Phong反射模型)
date: 2024-12-21 21:17:00 +0800
categories: [笔记, GAMES101]
tags: [GAMES101, 计算机图形学]
Expand Down Expand Up @@ -30,6 +30,20 @@ math: true

> **着色有局部性**: 着色(Shading)不等于阴影(Shadow), 不会生成阴影, 只是计算光线反射到相机的颜色
### Light Falloff 光线衰减

光线在空间中传播时, 会随着距离的增加而衰减, 这种现象称为**光线衰减(Light Falloff)**.

因为由于能量守恒, 从光源发出的总能量是一定的, 但是距离光源越远, 光照所覆盖的面积就越大, 因此单位面积接收到的光线就会减少:

![光线衰减](/assets/posts/GAMES101-Lecture07/05.png){:width="500px"}

光线衰减的公式一般为:

$$
\text{Intensity} = \frac{Light}{\text{Distance}^2}
$$

## 漫反射

### 漫反射的原理
Expand All @@ -48,24 +62,12 @@ math: true

![漫反射公式](/assets/posts/GAMES101-Lecture07/04.png){:width="300px"}

### Light Falloff 光线衰减

光线在空间中传播时, 会随着距离的增加而衰减, 这种现象称为**光线衰减(Light Falloff)**.

因为由于能量守恒, 从光源发出的总能量是一定的, 但是距离光源越远, 光照所覆盖的面积就越大, 因此单位面积接收到的光线就会减少:

![光线衰减](/assets/posts/GAMES101-Lecture07/05.png){:width="500px"}

光线衰减的公式一般为:

$$
\text{Intensity} = \frac{Light}{\text{Distance}^2}
$$

### Lambertian (Diffuse) Shading

**Lambertian 漫反射模型**是最简单的漫反射模型, 它不依赖于观察方向, 只依赖于光源方向和表面法线:

![Lambertian 漫反射模型](/assets/posts/GAMES101-Lecture07/06.png){:width="400px"}

$$
L_d=k_d\left(I/r^2\right)\max(0,\mathbf{n}\cdot\mathbf{l})
$$
Expand All @@ -77,9 +79,86 @@ $$
- $\mathbf{n}$: 表面法线
- $\mathbf{l}$: 光源方向

**漫反射系数 $k_d$** 是一个常数, 物体吸收一部分光线, 反射一部分光线, 因此需要一个系数来表示被吸收过光线后的反射光线的强度变化.
**漫反射系数 $k_d$**: 颜色

![漫反射系数的变化](/assets/posts/GAMES101-Lecture07/06.png){:width="700px"}
![漫反射系数的变化](/assets/posts/GAMES101-Lecture07/07.png){:width="700px"}

**$\max(0,\mathbf{n}\cdot\mathbf{l})$**: 当两个点乘的结果小于0时, 即光线从表面的下方照射到表面上时, 没有物理意义, 因此取0

## 高光

平面(物体)比较光滑时, 光线会在表面上沿着镜面反射方向的**附近区域**反射, 这种现象称为**高光(Specular Highlights)**.

![高光](/assets/posts/GAMES101-Lecture07/08.png){:width="400px"}

当观察方向与镜面反射方向的夹角越小的时候, 才能看到高光.

### Blinn-Phong 高光模型

**Blinn-Phong 高光模型**与上面讲到的高光的原理类似, 但是它引入了一个新的参数, 叫做**半程向量(Halfway Vector)**:

**观察方向****镜面反射方向**接近时, 实际上等同于观察方向与光源方向的**半程向量 $\mathbf{h}$** 接近于**表面法线 $\mathbf{n}$**

![Blinn-Phong 高光模型](/assets/posts/GAMES101-Lecture07/09.png){:width="400px"}

**半程向量**是观察方向和光源方向的中间向量, 它通过观察方向和光源方向相加后归一化得到:

$$
\mathbf{h}=\frac{\mathbf{v}+\mathbf{l}}{\|\mathbf{v}+\mathbf{l}\|}
$$

Blinn-Phong 高光模型的公式为:

$$
L_s=k_s\left(I/r^2\right)\max(0,\mathbf{n}\cdot\cos\alpha)^{p}\\
L_s=k_s\left(I/r^2\right)\max(0,\mathbf{n}\cdot\mathbf{h})^{\alpha}
$$

- $L_s$: 高光光线的颜色
- $k_s$: 高光系数:高光的颜色(一般是白色)
- $I$: 光源在单位面积上的光照强度
- $r$: 光源到着色点的距离
- $\mathbf{n}$: 表面法线
- $\mathbf{h}$: 半程向量
- 指数 $p$: 高光的锐度

### 指数p的意义

由于 $\cos\alpha$ 的图象在 $0° ~ 90°$ 之间的变化容忍度太高, 即使角度相差很大, 也会得到较大的值, 而当给 $\cos\alpha$ 取一个较大的指数 $p$ 后, 可以使得高光的锐度更高, 角度相差较大时, 高光的亮度会更低.

![高光锐度](/assets/posts/GAMES101-Lecture07/10.png){:width="700px"}

### Blinn-Phong 高光模型的优点

半程向量与法线的夹角等同于观察方向与光源反射方向的夹角, 但是半程向量的计算更加简单, 且不需要考虑观察方向和光源方向的夹角是否大于90度.
- 半程向量只需要计算两个向量的和, 然后归一化即可
- 光源反射方向的计算需要根据光源方向和表面法线计算

## 环境光

**环境光(Ambient Lighting)** 是在不能被光源直接照射到的区域, 由于光线的多次反射, 会有一些光线被反射到这些区域, 使得这些区域不会完全黑暗.

![环境光](/assets/posts/GAMES101-Lecture07/11.png){:width="400px"}

我们假设**任何一个点**接收到的来自环境的光照的强度**永远相同**, 则环境光的颜色可以表示为:

$$
L_a=k_aI_a
$$

- $L_a$: 环境光的颜色
- $k_a$: 环境光系数(环境光的颜色)
- $I_a$: 环境光的强度

Blinn-Phong 着色模型的环境光是一个简化的模型, 不能反映真实的环境光, 例如在表面的某个位置出现了凹陷, 凹陷位置的环境光应该比凸起位置的环境光要暗, 但是 Blinn-Phong 着色模型无法反映这种情况, 不过在实际应用中, 由于环境光的影响较小, 因此这种简化的模型也是可以接受的.

## Blinn-Phong 着色模型的总合

将漫反射, 高光和环境光的颜色相加, 即可得到 Blinn-Phong 着色模型的颜色:

![Blinn-Phong 着色模型](/assets/posts/GAMES101-Lecture07/12.png){:width="700px"}

$$
L = L_d + L_s + L_a \\
L = k_d\left(I/r^2\right)\max(0,\mathbf{n}\cdot\mathbf{l}) + k_s\left(I/r^2\right)\max(0,\mathbf{n}\cdot\mathbf{h})^{\alpha} + k_aI_a
$$
Binary file modified assets/posts/GAMES101-Lecture07/06.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/posts/GAMES101-Lecture07/07.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/posts/GAMES101-Lecture07/08.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/posts/GAMES101-Lecture07/09.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/posts/GAMES101-Lecture07/10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/posts/GAMES101-Lecture07/11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/posts/GAMES101-Lecture07/12.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit cbe1a2d

Please sign in to comment.