# 【兰伯特光照模型】

Markdown 图片

# 兰伯特

VertexOutput vert (VertexInput v) {
    VertexOutput o = (VertexOutput)0; // 新建一个输出结构
    o.pos = UnityObjectToClipPos( v.vertex ); // 变换顶点信息 并将其塞给输出结构
    o.nDirWS = UnityObjectToWorldNormal(v.normal); // 变换法线信息 并将其塞给输出结构
    return o; // 将输出结构 输出
}
// 输出结构>>>像素
float4 frag(VertexOutput i) : COLOR {
    float3 nDir = i.nDirWS; // 获取nDir
    float3 lDir = _WorldSpaceLightPos0.xyz; // 获取lDir
    float nDotl = dot(nDir, lDir); // nDir点积lDir
    float lambert = max(nDotl,0); // 把负数的截掉
    return float4(lambert, lambert, lambert, 1.0); // 输出最终颜色
}

Markdown 图片

# 半兰伯特

// 输出结构>>>像素
float4 frag(VertexOutput i) : COLOR {
    ...省略与兰伯特一致的代码
    float halfLambert = nDotl * 0.5 + 0.5; // 映射至0~1
    return float4(halfLambert, halfLambert, halfLambert, 1.0); // 输出最终颜色
}

Markdown 图片

# SSS

实现类似人耳朵,蜡烛,等有一定透红的效果。

# 原理

一个兰伯特与一个SSS贴图进行调子映射。 y值可以控制sss的强度。

Markdown 图片

# Lut 贴图

  • Lut 全称为 Look up Texture 查找纹理。
  • 比 RampTex 多一维度

Markdown 图片