以下为个人学习笔记整理,涉及坐标内容统一用右手坐标系,课程官网

# 着色(Shading)

对不同物体,应用不同材质(material),这里暂时不考虑物体的阴影。

# 冯氏光照(Blinn-Phong)

  • 高光(Specular highlights)

  • 漫反射(Diffuse reflection)

  • 环境光照(Ambient lighting)

image-20210104175927517

# 漫反射(Diffuse reflection)

# Shading point

  • 视野方向(View direction) v\vec v
  • 物体表面法线(Surface normal)n\vec n
  • 光照方向(Light direction)l\vec l
  • 物体表面参数(Surface parameters)
    • 颜色
    • 亮度
    • ...

image-20210104191616781

# 角度和光线强度的关系

不同角度的光线,明暗不一样。物体表面的光线和物体表面的法线夹角决定亮度 cosθ=nl\cos \theta = n \cdot l

image-20210104192244033

# 距离和光线强度的关系

假设能量在传播过程中不会减少,假设半径为 1 的球表面上某个点的能量为 II,那么通过计算,得到半径为rr 的球上的能量就是 Ir2\frac{I}{r^2}

image-20210104193011709

# 光线强度的最终结果

  • kdk_d:表示材质表面的漫反射系数。
  • Ir2\frac{I}{r^2}:表示距离对光照强度的影响。(这里的 rr 考虑的是光源和物体的距离)
  • max(0,nl)max(0,n \cdot l):表示光线本身和法线的夹角,影响光照的强度。(不考虑 cosθ\cos \theta 为负数的情况)
  • 漫反射不需要考虑观察者的视角 v\vec v

image-20210104193304896

image-20210104194139775

# 高光(Specual)

高光更近似于镜面光,只能在某些特定的位置,才能观察到。所以也可以理解为,光线的镜面反射方向和观察方向越接近,高光越明显。

image-20210105100133294

为了便于计算,一般情况下会用半程向量和法线的夹角 α\angle \alpha 来计算,而半程向量又可以通过三角形法则通过简单的向量加法得到。

image-20210105100445748

半程向量:h=bisector(v,l)=v+lv+l\text{半程向量:}h = bisector(v,l) = \frac{v+l}{||v+l||}

# 高光光照公式

高光反射里没有考虑角度变化对于光线的衰减 lnl \cdot n。实际生活中,这是需要的。

Ls=ks(Ir2)max(0,cosα)p=ks(Ir2)max(0,nh)pL_s = k_s(\frac{I}{r^2}){max(0, \cos \alpha)}^p = k_s(\frac{I}{r^2}){max(0, n \cdot h)}^p

# 为什么 max(0,nh)p{max(0, n \cdot h)}^p 需要指数 p ❓

对于常规的 cosα\cos \alphaα\alpha 的角度就算很小的时候,依旧能够产生不错的高光效果,但这和实际的效果不符合。

例如 α\alpha 角度在 4545^{\circ} 时, cosα\cos \alpha 的值会很大,超过 0.50.5,但实际情况并非如此。而 cos64α{\cos}^{64} \alphaα\alpha 角度在 2020^{\circ} 左右就看不见高光了,比较符合现实。

image-20210105101657321

Blinn-Phong 模型下的指数 pp 通常在 [100200][100 \thicksim 200] 之间。通常情况下 α\alpha 角度在 353^{\circ} \thicksim 5^{\circ} 就看不见高光了。

# 不同指数 pp 和 镜面反射系数 ksk_s 下的高光效果。

image-20210105102444125

# 环境光照(Ambient)

由于环境光是物体之间,经过多次漫反射或者镜面反射,最终到达人眼的光线,所以环境光的分析较为复杂。

image-20210105102908838

# 环境光公式

由于环境光较为复杂,索性假设任何一个点的环境光强度都是相同的。不考虑光照方向和观察方向。

La=kaIaL_a = k_aI_a

# 最终的光照公式

所有种类的光照进行叠加

image-20210105103157819

L=La+Ld+Ls=kaIa+kd(Ir2)max(0,nl)+ks(Ir2)max(0,nh)pL = L_a + L_d + L_s = k_aI_a + k_d(\frac{I}{r^2})max(0,n \cdot l) + k_s(\frac{I}{r^2}){max(0,n \cdot h)}^{p}