Lambert是一种最基本的光照模型,首先在顶点shader中获得模型上的顶点信息和法线信息以及光照信息,然后在片源shader中计算模型上各个顶点所对应的光照方向和顶点法线做点乘,并将点乘出来的值限制在-1到1之间,将点乘出来的结果输出在屏幕上,就实现了最基本的Lambert的效果。
我在学习时,分别学习了使用ShaderForge连连看和使用代码编写两种方式,下面的图就是这两种方式的实现。
Shader "AP/L03/Lambert"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
#pragma target 3.0;
struct VertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct VertexOutput
{
float3 nDirWS : TEXCOORD0;
float4 pos : SV_POSITION;
};
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput )0;
o.pos = UnityObjectToClipPos(v.vertex );
o.nDirWS = UnityObjectToWorldNormal(v.normal);
return o;
}
fixed4 frag (VertexOutput i) : SV_Target
{
float3 nDir = i.nDirWS;
float3 lDir = _WorldSpaceLightPos0.xyz;
float nDotl = dot(i.nDirWS,lDir);
float lambert = max(0.0,nDotl);
return float4(lambert,lambert,lambert,1.0);
}
ENDCG
}
}
}