Alpha Blend With Both Side.shader 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. Shader "Custom/Alpha Blend With Both Side"
  2. {
  3. Properties {
  4. _Color ("Color Tint", Color) = (1, 1, 1, 1)
  5. _MainTex ("Main Tex", 2D) = "white" {}
  6. _AlphaScale ("Alpha Scale", Range(0, 1)) = 1
  7. }
  8. SubShader {
  9. Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
  10. Pass {
  11. Tags { "LightMode"="ForwardBase" }
  12. // 剔除正面,渲染背面
  13. Cull Front
  14. ZWrite Off
  15. Blend SrcAlpha OneMinusSrcAlpha
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. #include "Lighting.cginc"
  20. fixed4 _Color;
  21. sampler2D _MainTex;
  22. float4 _MainTex_ST;
  23. fixed _AlphaScale;
  24. struct a2v {
  25. float4 vertex : POSITION;
  26. float3 normal : NORMAL;
  27. float4 texcoord : TEXCOORD0;
  28. };
  29. struct v2f {
  30. float4 pos : SV_POSITION;
  31. float3 worldNormal : TEXCOORD0;
  32. float3 worldPos : TEXCOORD1;
  33. float2 uv : TEXCOORD2;
  34. };
  35. v2f vert(a2v v) {
  36. v2f o;
  37. o.pos = UnityObjectToClipPos(v.vertex);
  38. o.worldNormal = UnityObjectToWorldNormal(v.normal);
  39. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  40. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  41. return o;
  42. }
  43. fixed4 frag(v2f i) : SV_Target {
  44. fixed3 worldNormal = normalize(i.worldNormal);
  45. fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
  46. fixed4 texColor = tex2D(_MainTex, i.uv);
  47. fixed3 albedo = texColor.rgb * _Color.rgb;
  48. fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
  49. fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
  50. return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
  51. }
  52. ENDCG
  53. }
  54. Pass {
  55. Tags { "LightMode"="ForwardBase" }
  56. // 剔除背面,渲染正面
  57. Cull Back
  58. ZWrite Off
  59. Blend SrcAlpha OneMinusSrcAlpha
  60. CGPROGRAM
  61. #pragma vertex vert
  62. #pragma fragment frag
  63. #include "Lighting.cginc"
  64. fixed4 _Color;
  65. sampler2D _MainTex;
  66. float4 _MainTex_ST;
  67. fixed _AlphaScale;
  68. struct a2v {
  69. float4 vertex : POSITION;
  70. float3 normal : NORMAL;
  71. float4 texcoord : TEXCOORD0;
  72. };
  73. struct v2f {
  74. float4 pos : SV_POSITION;
  75. float3 worldNormal : TEXCOORD0;
  76. float3 worldPos : TEXCOORD1;
  77. float2 uv : TEXCOORD2;
  78. };
  79. v2f vert(a2v v) {
  80. v2f o;
  81. o.pos = UnityObjectToClipPos(v.vertex);
  82. o.worldNormal = UnityObjectToWorldNormal(v.normal);
  83. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  84. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  85. return o;
  86. }
  87. fixed4 frag(v2f i) : SV_Target {
  88. fixed3 worldNormal = normalize(i.worldNormal);
  89. fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
  90. fixed4 texColor = tex2D(_MainTex, i.uv);
  91. fixed3 albedo = texColor.rgb * _Color.rgb;
  92. fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
  93. fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
  94. return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
  95. }
  96. ENDCG
  97. }
  98. }
  99. FallBack "Transparent/VertexLit"
  100. }