Shader "Unlit/DiffuseSpecularShader"
{Properties{ _Diffuse ("Diffuse Color", Color) = (1,1,1,1)_Specular ("Specular Color", Color) = (1,1,1,1)_Gloss ("Gloss", float) = 15[Enum(Normal, 1, Half, 2)]_DiffuseMode ("Diffuse Mode", int) = 1[Enum(Phong, 1, Blinn, 2)]_SpecularMode ("Specular Mode", int) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{//设置前向渲染确保光源数据的传递Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"//_LightColor0 _WorldSpaceLightPos0全局变量的头文件#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{ float4 vertex : SV_POSITION;float3 worldNormal : TEXCOORD0; float3 worldPos : TEXCOORD1;};fixed4 _Diffuse;fixed4 _Specular;float _Gloss;int _DiffuseMode;int _SpecularMode;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = UnityObjectToWorldDir(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{ float3 worldLightDir = _WorldSpaceLightPos0.xyz;fixed3 diffuse;if(_DiffuseMode == 1){diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal, worldLightDir)); //兰伯特漫反射 [-1,1] 暗淡}else{diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal, worldLightDir)*0.5+0.5); //半兰伯特漫反射 [0,1] 更亮}float3 worldViewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);fixed3 phongHighlight;if(_SpecularMode == 1){float3 worldReflectDir = normalize(reflect(-worldLightDir, i.worldNormal)); phongHighlight = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldViewDir, worldReflectDir)), _Gloss); //Phong模型高光反射}else{float3 h = normalize(worldViewDir + worldLightDir);phongHighlight = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(i.worldNormal, h)), _Gloss);//Blinn模型的高光反射}return fixed4(diffuse + phongHighlight,1);}ENDCG}}
}