# 【兰伯特光照模型】
# 兰伯特
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); // 输出最终颜色
}
# 半兰伯特
// 输出结构>>>像素
float4 frag(VertexOutput i) : COLOR {
...省略与兰伯特一致的代码
float halfLambert = nDotl * 0.5 + 0.5; // 映射至0~1
return float4(halfLambert, halfLambert, halfLambert, 1.0); // 输出最终颜色
}
# SSS
实现类似人耳朵,蜡烛,等有一定透红的效果。
# 原理
一个兰伯特与一个SSS贴图进行调子映射。 y值可以控制sss的强度。
# Lut 贴图
- Lut 全称为 Look up Texture 查找纹理。
- 比 RampTex 多一维度