1、环境光+漫反射+高光+点光源

1Shader "Custom/Example_Frag_1" { 2 properties 3 { 4 _MainColor("Main Color",color)=(1,1,1,1) 5 _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色 6 _Shininess("Shininess",range(1,32))=8 //高光范围 7 } 8 Subshader 9 { 10 pass{ 11 tags{"LightMode"="Forwardbase"} 12 13 CGPROGRAM 14 15 #pragma vertex vert 16 #pragma fragment frag 17 #include "unitycg.cginc" 18 #include "lighting.cginc" 19 20 float4 _MainColor; 21 float4 _SpecularColor; 22 float _Shininess; 23 24 struct v2f 25 { 26 float4 pos:POSITION; 27 float3 normal:TEXCOORD1; 28 fixed4 vertex:COLOR; 29 }; 30 31 32 v2f vert(appdata_base v) 33 { 34 v2f o; 35 o.pos=UnityObjectToClipPos(v.vertex); 36 o.normal=v.normal; 37 o.vertex=v.vertex; 38 return o; 39 } 40 float4 frag(v2f IN):COLOR 41 { 42 //Ambinet color 环境光 43 fixed4 col=UNITY_LIGHTMODEL_AMBIENT; 44 45 //Diffuse Color 漫反射光 dot(N,L) 46 float3 N=UnityObjectToWorldNormal(IN.normal); 47 float3 L=normalize(WorldSpaceLightDir(IN.vertex)); 48 float diffuseScale=saturate(dot(N,L)); 49 col+=_LightColor0*_MainColor*diffuseScale; 50 51 //Specular Color 高光 52 float3 V=normalize(WorldSpaceViewDir(IN.vertex)); 53 float3 R=2*dot(N,L)*N-L;//反射光,方案一 54// float3 I=-WorldSpaceLightDir(IN.vertex); 55// float3 R=reflect(I,N);//反射光,方案二 56 float specularScale=saturate(dot(R,V)); 57 col+=_SpecularColor*pow(specularScale,_Shininess); 58 59 //compute 4 points lighting 点光源 60 float3 wpos=mul(_Object2World,IN.vertex).xyz; 61 col.rgb+=Shade4PointLights 62 ( 63 unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, 64 unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb, 65 unity_4LightAtten0, 66 wpos,N 67 ); 68 return col;//漫反射+环境光 69 } 70 71 ENDCG 72 } 73 } 74}
2、阴影

1Shader "Custom/Example_Frag_2" { 2 properties 3 { 4 _MainColor("Main Color",color)=(1,1,1,1) 5 _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色 6 _Shininess("Shininess",range(1,32))=8 //高光范围 7 } 8 Subshader 9 { 10 11// pass 12// { 13// tags{"LightMode"="shadowcaster"}//这种方式只能为方向光添加投射阴影 14// } 15 16 pass{ 17 tags{"LightMode"="Forwardbase"} 18 19 CGPROGRAM 20 21 #pragma vertex vert 22 #pragma fragment frag 23 #include "unitycg.cginc" 24 #include "lighting.cginc" 25 26 float4 _MainColor; 27 float4 _SpecularColor; 28 float _Shininess; 29 30 struct v2f 31 { 32 float4 pos:POSITION; 33 float3 normal:TEXCOORD1; 34 fixed4 vertex:COLOR; 35 }; 36 37 38 v2f vert(appdata_base v) 39 { 40 v2f o; 41 o.pos=UnityObjectToClipPos(v.vertex); 42 o.normal=v.normal; 43 o.vertex=v.vertex; 44 return o; 45 } 46 float4 frag(v2f IN):COLOR 47 { 48 //Ambinet color 环境光 49 fixed4 col=UNITY_LIGHTMODEL_AMBIENT; 50 51 //Diffuse Color 漫反射光 dot(N,L) 52 float3 N=UnityObjectToWorldNormal(IN.normal); 53 float3 L=normalize(WorldSpaceLightDir(IN.vertex)); 54 float diffuseScale=saturate(dot(N,L)); 55 col+=_LightColor0*_MainColor*diffuseScale; 56 57 //Specular Color 高光 58 float3 V=normalize(WorldSpaceViewDir(IN.vertex)); 59 float3 R=2*dot(N,L)*N-L;//反射光,方案一 60// float3 I=-WorldSpaceLightDir(IN.vertex); 61// float3 R=reflect(I,N);//反射光,方案二 62 float specularScale=saturate(dot(R,V)); 63 col+=_SpecularColor*pow(specularScale,_Shininess); 64 65 //compute 4 points lighting 点光源 66 float3 wpos=mul(unity_ObjectToWorld,IN.vertex).xyz; 67 col.rgb+=Shade4PointLights 68 ( 69 unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, 70 unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb, 71 unity_4LightAtten0, 72 wpos,N 73 ); 74 return col;//漫反射+环境光 75 } 76 77 ENDCG 78 } 79 } 80 //取巧的方法是,让其回滚到系统自带的Diffuse中, 81 //这样既可以产生方向光阴影,点光源也可以产生阴影 82 fallback "Diffuse" 83}
3、镂空效果

1Subshader 2 { 3 Tags{"Queue"="Transparent"} 4 pass{ 5 blend srcAlpha oneMinussrcalpha zwrite off 6 7 CGPROGRAM 8 9 #pragma vertex vert 10 #pragma fragment frag 11 #include "unitycg.cginc" 12 13 float _Scale; 14 15 struct v2f 16 { 17 float4 pos:POSITION; 18 float3 normal:TEXCOORD0; 19 fixed4 vertex:TEXCOORD1; 20 }; 21 22 23 v2f vert(appdata_base v) 24 { 25 v2f o; 26 o.pos=UnityObjectToClipPos(v.vertex); 27 o.normal=v.normal; 28 o.vertex=v.vertex; 29 return o; 30 } 31 float4 frag(v2f IN):COLOR 32 { 33 float3 N=UnityObjectToWorldNormal(IN.normal); 34 float3 V=UnityWorldSpaceViewDir(IN.vertex); 35 float bright=1.0-saturate(dot(N,V)); 36 bright=pow(bright,_Scale); 37 return fixed4(1,1,1,1)*bright; 38 } 39 40 ENDCG 41 } 42 } 43 44}
4、描边

1Shader "Custom/Example_Frag_4" { 2 properties 3 { 4 _MainColor("MainColor",color)=(1,1,1,1) 5 _Scale("Scale",range(1,8))=2 6 _Outer("Outer",range(0,1))=0.2 7 } 8 Subshader 9 { 10 Tags{"Queue"="Transparent"} 11 pass{ 12 blend srcAlpha oneMinussrcalpha 13 zwrite off 14 15 CGPROGRAM 16 17 #pragma vertex vert 18 #pragma fragment frag 19 #include "unitycg.cginc" 20 21 float4 _MainColor; 22 float _Scale; 23 float _Outer; 24 25 struct v2f 26 { 27 float4 pos:POSITION; 28 float3 normal:TEXCOORD0; 29 fixed4 vertex:TEXCOORD1; 30 }; 31 32 33 v2f vert(appdata_base v) 34 { 35 v.vertex.xyz+=v.normal*_Outer; 36 v2f o; 37 o.pos=UnityObjectToClipPos(v.vertex); 38 o.normal=v.normal; 39 o.vertex=v.vertex; 40 return o; 41 } 42 float4 frag(v2f IN):COLOR 43 { 44 float3 N=UnityObjectToWorldNormal(IN.normal); 45 float3 V=UnityWorldSpaceViewDir(IN.vertex); 46 float bright=saturate(dot(N,V)); 47 bright=pow(bright,_Scale); 48 _MainColor.a*=bright; 49 return _MainColor; 50 } 51 52 ENDCG 53 } 54 55 pass{ 56 blendop revsub 57 blend dstalpha one 58 zwrite off 59 60 CGPROGRAM 61 62 #pragma vertex vert 63 #pragma fragment frag 64 #include "unitycg.cginc" 65 66 struct v2f 67 { 68 float4 pos:POSITION; 69 }; 70 71 72 v2f vert(appdata_base v) 73 { 74 v2f o; 75 o.pos=UnityObjectToClipPos(v.vertex); 76 return o; 77 } 78 float4 frag(v2f IN):COLOR 79 { 80 return fixed4(1,1,1,1); 81 } 82 83 ENDCG 84 } 85 86 pass{ 87 blend srcAlpha oneMinussrcalpha 88 zwrite off 89 90 CGPROGRAM 91 92 #pragma vertex vert 93 #pragma fragment frag 94 #include "unitycg.cginc" 95 96 float _Scale; 97 98 struct v2f 99 { 100 float4 pos:POSITION; 101 float3 normal:TEXCOORD0; 102 fixed4 vertex:TEXCOORD1; 103 }; 104 105 106 v2f vert(appdata_base v) 107 { 108 v2f o; 109 o.pos=UnityObjectToClipPos(v.vertex); 110 o.normal=v.normal; 111 o.vertex=v.vertex; 112 return o; 113 } 114 float4 frag(v2f IN):COLOR 115 { 116 float3 N=UnityObjectToWorldNormal(IN.normal); 117 float3 V=UnityWorldSpaceViewDir(IN.vertex); 118 float bright=saturate(dot(N,V)); 119 bright=pow(bright,_Scale); 120 return fixed4(1,1,1,1)*bright; 121 } 122 123 ENDCG 124 } 125 } 126 127}
5、贴图及光照贴图

1Shader "Custom/Example_Frag_6" { 2 Properties { 3 _MainTex ("Albedo (RGB)", 2D) = "white" {} 4 } 5 SubShader { 6 pass{ 7 CGPROGRAM 8 #pragma vertex vert 9 #pragma fragment frag 10 #include "unitycg.cginc" 11 12 sampler2D _MainTex; 13 float4 _MainTex_ST; 14 15 struct v2f{ 16 float4 pos:POSITION; 17 float2 uv:TEXCOORD0; 18 float2 uv_lighting:TEXCOORD1; 19 }; 20 v2f vert(appdata_full v) 21 { 22 v2f o; 23 o.pos=UnityObjectToClipPos(v.vertex); 24 o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//让属性面板中的Tiling和Offset起作用,这里需要声明 _ST 后缀的变量,这里是_MainTex_ST 25 o.uv_lighting=v.texcoord1.xy*unity_LightmapST.xy+unity_LightmapST.zw;//使用光照贴图 26 return o; 27 28 } 29 fixed4 frag(v2f IN):COLOR 30 { 31 float3 lm=DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,IN.uv_lighting));//解码光照贴图 32 fixed4 color=tex2D(_MainTex,IN.uv); 33 color.rgb*=lm; 34 return color; 35 } 36 ENDCG 37 } 38 } 39}
6、波

1Shader "Custom/Example_Frag_7" { 2 Properties { 3 _MainTex ("Albedo (RGB)", 2D) = "white" {} 4 _F("F",range(1,30))=10 5 _A("A",range(0,0.1))=0.01 6 _R("R",range(0,1))=0 7 } 8 SubShader { 9 pass{ 10 CGPROGRAM 11 #pragma vertex vert 12 #pragma fragment frag 13 #include "unitycg.cginc" 14 15 sampler2D _MainTex; 16 float4 _MainTex_ST; 17 float _F; 18 float _A; 19 float _R; 20 21 struct v2f{ 22 float4 pos:POSITION; 23 float2 uv:TEXCOORD0; 24 }; 25 v2f vert(appdata_full v) 26 { 27 v2f o; 28 o.pos=UnityObjectToClipPos(v.vertex); 29 o.uv=TRANSFORM_TEX(v.texcoord,_MainTex); 30 return o; 31 32 } 33 fixed4 frag(v2f IN):COLOR 34 { 35// IN.uv+=0.01*sin(IN.uv*3.14*_F+_Time.y);//水波 36 37 float2 uv=IN.uv; 38 float dis=distance(uv,float2(0.5,0.5)); 39 float scale=0; 40 _A*=saturate(1-dis/_R); 41 scale=_A*sin(-dis*3.14*_F+_Time.y);//圆形涟漪 42 uv=uv+uv*scale; 43 fixed4 color=tex2D(_MainTex,uv); 44 return color; 45 } 46 ENDCG 47 } 48 } 49}
7、模糊

1Shader "Custom/Example_Frag_8" { 2 Properties { 3 _MainTex ("Albedo (RGB)", 2D) = "white" {} 4 _F("F",range(1,30))=10 5 _A("A",range(0,0.1))=0.01 6 _R("R",range(0,1))=0 7 } 8 SubShader { 9 pass{ 10 CGPROGRAM 11 #pragma vertex vert 12 #pragma fragment frag 13 #include "unitycg.cginc" 14 #pragma target 3.0 15 sampler2D _MainTex; 16 float4 _MainTex_ST; 17 float _F; 18 float _A; 19 float _R; 20 21 struct v2f{ 22 float4 pos:POSITION; 23 float2 uv:TEXCOORD0; 24 float z:TEXCOORD1; 25 }; 26 v2f vert(appdata_full v) 27 { 28 v2f o; 29 o.pos=UnityObjectToClipPos(v.vertex); 30 o.uv=TRANSFORM_TEX(v.texcoord,_MainTex); 31 o.z=mul(unity_ObjectToWorld,v.vertex).z; 32 return o; 33 34 } 35 fixed4 frag(v2f IN):COLOR 36 { 37 float2 dsdx=ddx(IN.z)*10; 38 float2 dsdy=ddy(IN.z)*10; 39 fixed4 color=tex2D(_MainTex,IN.uv,dsdx,dsdy);//越正对的面越清晰,背对着的面模糊 40 return color; 41 } 42 ENDCG 43 } 44 } 45}