核心公式
- 漫反射光=入射光线颜色强度 * 材质的漫反射系数 * 取值为正数 ( 表面法线方向 · 光源方向 )
效果展示
顶点漫反射,逐片元漫反射,半罗伯特漫反射
顶点漫反射
Shader "Unlit/005"
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Diffuse;
struct v2f
{
fixed3 color:Color;
float4 vertex :SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
//顶点位置
o.vertex = UnityObjectToClipPos(v.vertex);
//法线方向
fixed3 worldNormal =UnityObjectToWorldNormal( v.normal);
//光源方向
fixed3 worldLight = normalize (_WorldSpaceLightPos0.xyz);
//漫反射光=入射光线强度*材质的漫反射系数*取值为正数(表面法线方向 · 光源方向)
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLight));
//环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
o.color = diffuse + ambient;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.color,1);
}
ENDCG
}
}
}
逐片元漫反射
Shader "Unlit/006"
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Diffuse;
struct v2f
{
float4 vertex :SV_POSITION;
fixed3 worldNormal: TEXCOORD0;
};
v2f vert (appdata_base v)
{
v2f o;
//顶点位置
o.vertex = UnityObjectToClipPos(v.vertex);
//法线方向
fixed3 worldNormal =UnityObjectToWorldNormal( v.normal);
o.worldNormal=worldNormal;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//光源方向
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//漫反射光=入射光线颜色强度*材质的漫反射系数*取值为正数(表面法线方向 · 光源方向)
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0,dot(i.worldNormal,worldLightDir));
//环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 color = ambient + diffuse;
return fixed4(color,1);
}
ENDCG
}
}
}
逐片元半罗伯特漫反射
Shader "Unlit/007"
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Diffuse;
struct v2f
{
float4 vertex :SV_POSITION;
fixed3 worldNormal: TEXCOORD0;
};
v2f vert (appdata_base v)
{
v2f o;
//顶点位置
o.vertex = UnityObjectToClipPos(v.vertex);
//法线方向
fixed3 worldNormal =UnityObjectToWorldNormal( v.normal);
o.worldNormal=worldNormal;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//光源方向
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//漫反射光=入射光线强度*材质的漫反射系数*取值为正数(表面法线方向 · 光源方向)
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (dot(worldLightDir,i.worldNormal)*0.5+0.5);
//环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 color = ambient + diffuse;
return fixed4(color,1);
}
ENDCG
}
}
}
网友评论