07着色(光照与基本着色模型)
着色前
模型变换(Model Tramsform) ——视图变换(View Tramsform)——投影变换(Projection Tramsform)——视口变换(View Tramsform)——光栅化
此时的模型是一个没有颜色的物品,我们只能看到一些点线面,没有颜色信息,这就需要交给下一个过程
着色(Shadeing)
定义
- shading != shadow
- 定义:物品利用材质(Material)的过程 在Unity是材质 而在Unreal是材质球
我们人眼为什么可以看到物品?是来自于物品反射过来的光
由上到下分别是
- 高光
- 漫反射
- 环境光照
Shading Point
一些规定:
-
观测方向 \hat{v}
-
法线 \hat{n}
-
光照方向 \hat{l}
-
表面参数(颜色,shininess)
着色局部性:只考虑这个物体的点,不考虑其他物体的存在(不考虑阴影)。
漫反射
漫反射使物体有体积感。
漫反射是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等。
产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。
Lambert漫反射模型
漫反射使物体有体积感。
漫反射是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等。
产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。

两个理论:
- Lambert余弦定理: \hat{l} 和 \hat{n} 夹角决定光照强度,应该将光强乘上cos\theta = l*n。
- 能量衰退定理:点光源,半径越大,能量越小。应该将光强除上r^{2}(r为光源到入射点距离)
根据这两个理论,可以得到Lambert漫反射模型:

其中 k_{d} 为漫反射系数,修改 k_{d} 可以得到物体表面不同的颜色,I为入射光强,r为光源到入射点距离,n,l分别是法向量和入射方向,max是为了剔除夹角大于90°的光(负数)。
漫反射系数 k_{d} :表示为一个vector→RGB三通道→定义一个颜色
观察这个式子,其中没有出现 \hat{v} ,也证实了漫反射与观察方向无关。
Lambert漫反射模型只是一个经验模型,与实际物理有差异。
经过漫反射效果如下:

Phong反射模型
其中$ $\hat{R}$ $为镜面反射方向。
产生高光的条件:
- 光滑的表面
- 观察方向接近镜面反射方向( \hat{v} 和 \hat{R} 足够接近才能看到)
- 条件二可以可以转换为向量I和V的半段向量h,然后与是否法线向量n足够近
如何判断 \hat{v} 和 \hat{R} 的距离:cos\alpha=\hat{v}\cdot\hat{R}
于是得到Phong反射模型:
L_{s}= k_{s}(I/r^{2})max(0,cos\alpha)^{p} = k_{s}(I/r^{2})max(0,cos(\hat{v}\cdot\hat{R}))^{p}
其中 k_{s} 为镜面反射系数,经验模型简化忽略能量损失,I为入射光强,r为光源到入射点距离,max用来提出大于90°的光(负数)。
- 指数p的原因:高光下,条件是苛刻的,这个平面几乎接近镜面,因此这个角度会非常小,加指数p是为了高光的角度控制在一个较低的值,如下图
- 指数p的作用:控制高光的大小,一般用100~200
-
Blinn-Phong反射模型
核心思想:引入半程向量$ $\hat{n}$ $,即当观察方向$ $\hat{v}$ $和镜面反射方向$ $\hat{R}$ $接近时,认为半程向量$ $\hat{h}$ $与法线方向$ $\hat{n}$ $接近。
其中
\begin{align} \hat{h}&=bisector(\hat{v},\hat{l})\\ &=\frac{\hat{v}+\hat{l}}{||\hat{v}+\hat{l}||} \end{align}
于是得到Blinn-Phong反射模型:
L_{s}=k_{s}(l/r^{2})max(0, \hat{n}\cdot\hat{h})^{p}
Blinn-Phong整体计算公式
最终,得到着色整体计算公式。
