MyTreeShader.shader 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. Shader "Unlit/MyTreeShader"
  2. {
  3. Properties
  4. {
  5. _MainTex ("纹理图片", 2D) = "white" {}
  6. _Strength("摇摆幅度", Float) = 1
  7. _Speed("摇摆速度", Float) = 3
  8. _AoColor("基础色", Color) = (1,1,1)
  9. _ShadowColor("阴影色", Color) = (1,1,1)
  10. _Specular("高光色", Color) = (1,1,1)
  11. _Gloss("光泽度", Float) = 1
  12. }
  13. SubShader
  14. {
  15. Pass
  16. {
  17. //指明该Pass的光照模式
  18. Tags {"LightMode" = "ForwardBase"}
  19. Cull Off
  20. CGPROGRAM
  21. #pragma vertex vert
  22. #pragma fragment frag
  23. //包含进Unity的内置变量
  24. #include "UnityCG.cginc"
  25. #include "Lighting.cginc"
  26. struct appdata
  27. {
  28. float4 vertex : POSITION;
  29. float2 uv : TEXCOORD0;
  30. float4 color : COLOR0;
  31. float3 normal: NORMAL;
  32. };
  33. struct v2f
  34. {
  35. float2 uv : TEXCOORD0;
  36. float4 pos : SV_POSITION;
  37. float4 color: TEXCOORD1;
  38. float3 worldNormal: TEXCOORD2;
  39. float3 worldPos : TEXCOORD3;
  40. };
  41. sampler2D _MainTex;
  42. float4 _MainTex_ST;
  43. fixed3 _AoColor;
  44. float _Speed;
  45. float _Strength;
  46. fixed3 _ShadowColor;
  47. fixed3 _Specular;
  48. float _Gloss;
  49. v2f vert (appdata v)
  50. {
  51. v2f o;
  52. float3 worldPos = UnityObjectToWorldDir(v.vertex);
  53. float stage1 = dot(v.vertex, float3(0, 1, 0)) * _Strength;
  54. float stage2 = sin(dot(v.vertex, float3(1, 0, 0)) * _Strength + _Time.y * _Speed);
  55. float3 stage3 = stage1 * stage2 * float3(0.001, 0, 0.001) * v.color.a;
  56. o.pos = UnityObjectToClipPos(v.vertex + stage3);
  57. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  58. o.color = v.color;
  59. o.worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
  60. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  61. return o;
  62. }
  63. fixed4 frag (v2f i) : SV_Target
  64. {
  65. // sample the texture
  66. fixed4 col = tex2D(_MainTex, i.uv);
  67. clip (col.a - 0.5);
  68. // 世界空间下的法线
  69. fixed3 worldNormal = i.worldNormal;
  70. // 世界空间下光源方向
  71. fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
  72. // 漫反射
  73. fixed3 diffuse = _LightColor0.rgb * col.rgb * _AoColor
  74. * lerp(_ShadowColor, float3(1,1,1), i.color.rgb)
  75. * (dot(worldNormal, worldLightDir) * 0.5 + 0.5);
  76. // 环境光
  77. fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * col.rgb;
  78. // 世界空间下的视角方向
  79. fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
  80. // 世界空间下的half方向
  81. fixed3 halfDir = normalize(worldLightDir + viewDir);
  82. // 高光
  83. fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(halfDir, worldNormal)), _Gloss);
  84. return fixed4(diffuse + ambient + specular, col.a);
  85. }
  86. ENDCG
  87. }
  88. }
  89. }