4 各种光照模型

  • 逐像素光照 (Phong着色)
  • 逐顶点光照 (高洛德着色)

模型

由于RGB的每个分量计算方式相同, 所以下面所有的c都只代表其中一个分量
c = c 环 境 + c 漫 + c 高 光 + c 自 发 光 c = c_{环境} + c_{漫} + c_{高光} + c_{自发光} c=c+c+c+c

  • 兰伯特模型(计算漫反射):
    c 漫 = c 光 ∗ c 漫 反 射 颜 色 ∗ m a x ( 0 , n ⋅ I ) c_{漫} = c_{光} * c_{漫反射颜色} * max(0, n · I) c=ccmax(0,nI)
    c 光 c_光 c 是光源的属性
    c 漫 反 射 色 c_{漫反射色} c 是 物体(即材质)的属性
    向量 n n n, 向量 I I I , 可以参考下面Phong高光的图
    4 各种光照模型_第1张图片
  • Phong模型(计算高光):
    如上图, 所有向量都是单位向量.
    r = 2 ( n ⋅ I ) n − I r = 2(n·I)n - I r=2(nI)nI c 漫 = c 光 ∗ c 漫 反 射 颜 色 ∗ m a x ( 0 , v ⋅ r ) m 光 泽 度 c_{漫} = c_{光} * c_{漫反射颜色} * max(0, v · r) ^ {m_{光泽度}} c=ccmax(0,vr)m
    m 光 泽 度 m_{光泽度} m 是 物体的属性
    v 是 摄像机信息.
    4 各种光照模型_第2张图片
  • Blinn模型(计算高光):
    h = v + I ∣ v + I ∣ h=\frac{v + I}{|v+I|} h=v+Iv+I c 漫 = c 光 ∗ c 漫 反 射 颜 色 ∗ m a x ( 0 , n ⋅ h ) m 光 泽 度 c_{漫} = c_{光} * c_{漫反射颜色} * max(0, n · h) ^ {m_{光泽度}} c=ccmax(0,nh)m

h是定值时, 即物体距离光源与相机足够远的时候, Blinn 快一些
而大部分情况(即 v 或 I 在变的时候) , Phong可能会更快

经过实测, 感觉Blinn的效果更好一点. Phong在逆光的时候, 感觉有点假

相关函数

saturate(x): 把x的每个分量(或标量x本身)截取在 [0,1] 范围之间
reflect(i,n) : i 入射方向, n 法线方向, 上面Phong图中, I I I r r r 的关系

环境光

Lighting Setting窗口下 的 Ambient Color 就是环境光, 在Shader中对应的变量是 UNITY_LIGHTMODEL_AMBIENT4 各种光照模型_第3张图片

光源信息

这种方法, 调用基础信息, 目前只能处理平行光.
要包含 Lighting.cginc
标签LightMode = ForwardBase

变量 含义
_LightColor0 光源颜色
_WorldSpaceLightPos0 光源位置1

这种方法, 调用内置函数, 可以处理各种光源, 各种LightMode
4 各种光照模型_第4张图片
这些函数没有保证得到的向量是单位向量, 可能需要对结果进行归一化

摄像机信息

变量 含义
_WorldSpaceCameraPos 摄像机位置

注意事项

  • md 记得加分号
  • BlinnPhong模型, 在背面也会有不正确的亮度, 可以用step函数, step(0, dot(I,N)) 乘在高光项上, 让背面全是0. I 是光源方向, N是法线方向
  • 记得进行normalize

  1. 是齐次坐标, 即有四个分量, 平行光在无穷远, 所以第四个分量是0, 前三个分量是光源发出光线的方向的反方向 ↩︎

你可能感兴趣的:(4 各种光照模型)