跳到主要内容
信息
· 文章中可能会出现一些错误,希望大佬们可以在评论区指出;

01 - 着色与基本着色模型

着色​

定义​

给对象应用某种材质的过程。

着色点(shading point)​

对于着色点,规定以下内容:

  • 着色点所在的面是个平面(很小)
  • 观测方向为v^\mathbf{\hat{v}}
  • 平面法线(Surface normal)为n^\mathbf{\hat{n}}
  • 光照方向l^\mathbf{\hat{l}}
  • 物体表面参数(颜色,材质反光程度shininess等等)

着色点是局部的,只考虑自己,不考虑其他物体的存在(不考虑阴影,shading和shadow是两回事)。

基本着色模型/局部光照模型​

我们看到物体,实际上是人眼睛接收到了来自物体的光。

从上到下依次是高光(镜面反射),漫反射(直接)和环境光照(间接,通过别的物体接收光),实际上,还有在杯子右边的发光源。

环境光照(Ambient)​

环境光照即泛光反射,只考虑来自环境的光,为了简化计算,做一个大胆假设:

漫反射(Diffuse)​

漫反射是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等,而产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。

Lambert余弦定律​

当入射光线与平面垂直的时候才能完整的接受所有光的能量,而入射角度越倾斜损失的能量越大,即光照方向与平面法线的夹角成比例:

cosθ=l^⋅n^\nonumber \mathbf{cos\theta=\hat{l}·\hat{n}}

最后的光强就是原来的光强乘上上边的cosθ\mathbf{cos\theta}。

能量衰减定律​

光源与着色点间的距离也该考虑,离得越远光强越弱。

例如有个点光源,它发出的能量是一定的,在近处的球壳和在远处的球壳的总能量是相同的,但由于球壳表面积不同,离得越远其上某点获取的能量也就越小。

定义离光源距离为1的点,接收到光强为II,那么距离为rr的点接收到的光强就是I/r2I/r^2(由球的表面积 + 能量守恒求得)。

根据以上两个定律,就能模拟漫反射了:

我们通过漫反射看到的能量LdL_d由三部分组成:材质的漫反射系数kdk_d,根据能量衰减定律得到的光强I/r2I/r^2,根据Lambert余弦定律得到的光强max(0,n^⋅l^)\mathbf{max(0,\hat{n}·\hat{l})}。第三部分取max是因为角度超过直角后,就没有物理意义了。

镜面反射/高光(Specular)​

Phong反射模型​

其实就是一般的镜面反射:

R^\mathbf{\hat{R}}是镜面反射方向,v^\mathbf{\hat{v}}为人眼观察方向。高光只有在观察方向和反射方向比较接近的时候出现,其他情况只能看见漫反射等光,因此镜面反射会考虑他俩的夹角α\alpha:

Ls=ks(I/r2)max(0,cosα)pcosα=R^⋅v^\begin{align} \nonumber L_s &= k_s(I/r^2)\rm{max}(0,\rm{cos}\alpha)^p \\ \nonumber \rm{cos}\alpha &= \mathbf{\hat{R}·\hat{v}} \end{align}

其中,ksk_s是镜面反射系数,II为入射光强,rr为入射光到着色点距离。指数p的意义在于加速衰减,因为离高光角度越远就越应该看不到,通常是100~200。

Blinn-Phong反射模型​

为了提高运算效率,将反射方向R^\mathbf{\hat{R}}与观察方向v^\mathbf{\hat{v}}的夹角认定为半程向量h^\mathbf{\hat{h}}和法线方向n^\mathbf{\hat{n}}的夹角:

半程向量的计算很巧妙,只需将入射方向和观察方向的单位向量一加(角平分线),然后求单位向量就行。

这样,就得到了基本着色模型:

参考资料​