一,逐顶点光照(漫反射、自身颜色、环境光相互作用)
Diffuse = 直射光颜色 * max( 0,cos夹角(光和法线的夹角)) cosθ = 光方向*法线方向
Shader "Custom/4 forth"
{
//Properties可以没有
Properties
{
_Diffuse("Diffuse Color",Color)=(1,1,1,1)
}
SubShader
{
pass
{
Tags{"LightMode"="ForwardBase"}///添加tag
CGPROGRAM
#include "Lighting.cginc"///引用光照 取得第一个直射光的颜色 _LightColor0
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
struct a2v{
float4 vertex:POSITION;
///取法线(模型空间下)
float3 normal:NORMAL;
};
struct v2f{
float4 position:SV_POSITION;
fixed3 color:COLOR;
};
/顶点函数处理/
//逐顶点光照
v2f vert(a2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
环境光获取
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
///_World2Object 将世界坐标换到模型坐标,作为第二个参数时,相反(将模型坐标换到世界坐标)
/ float3x3代表矩阵 此处强制转换4*4矩阵为3*3矩阵
fixed3 normalDir =normalize(mul(v.normal,(float3x3) unity_WorldToObject));
_WorldSpaceLightPos0 第一个直射光的位置,也就是光的方向
normalize 把向量单位化,方向不变,长度变为一(世界空间下)
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
_LightColor0 第一个直射光的颜色
fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0)*_Diffuse.rgb;//取得漫反射的颜色*颜色影响
/ 灯光之间相互叠加 直接+
f.color = diffuse + ambient;
return f;
}
fixed4 frag(v2f f) : SV_Target
{
return fixed4(f.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
二、逐像素光照
Shader "Custom/5 five"
{
//Properties可以没有
Properties
{
_Diffuse("Diffuse Color",Color)=(1,1,1,1)
}
SubShader
{
pass
{
Tags{"LightMode"="ForwardBase"}///添加tag
CGPROGRAM
#include "Lighting.cginc"///引用光照 取得第一个直射光的颜色 _LightColor0
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
struct a2v{
float4 vertex:POSITION;
///取法线(模型空间下)
float3 normal:NORMAL;
};
struct v2f{
float4 position:SV_POSITION;
fixed3 Worldcolor:COLOR;
};
//逐像素光照
v2f vert(a2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
f.Worldcolor = mul(v.normal,(float3x3) unity_WorldToObject);
return f;
}
fixed4 frag(v2f f) : SV_Target
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
fixed3 normalDir =normalize(f.Worldcolor);
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0)*_Diffuse.rgb;
fixed3 tempcolor = diffuse + ambient;
return fixed4(tempcolor,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
逐像素渲染比逐顶点效果更好,更圆滑,但是消耗比较大,每一个像素都要调用方法。