2
0

07着色(光照与基本着色模型)

2026-08-27

着色前

模型变换(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} 足够接近才能看到)
  • 条件二可以可以转换为向量IV的半段向量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
经过Phong模型后效果如下: 然而,Phong模型有一个缺点:不方便计算的值,于是有了Blinn-Phong反射模型。

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整体计算公式

最终,得到着色整体计算公式。

评论