Advertisement
Guest User

Unity lit soft particles

a guest
Jun 16th, 2013
911
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.59 KB | None | 0 0
  1. // Additive particle.
  2. // Does not receive shadows.
  3.  
  4. Shader "Particles/Lit Particle Additive" {
  5.  
  6. Properties {
  7. _Color ("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)
  8. _MainTex ("Color (RGBA)", 2D) = "white" {}
  9. _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
  10. }
  11.  
  12. SubShader {
  13.  
  14. Pass {
  15. Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "LightMode" = "ForwardBase"}
  16. //Blend One One
  17. Blend OneMinusDstColor One
  18. ZWrite Off
  19.  
  20. CGPROGRAM
  21.  
  22. #pragma vertex vert
  23. #pragma fragment frag
  24. #pragma multi_compile_fwdbase
  25. #include "UnityCG.cginc"
  26. #include "AutoLight.cginc"
  27. #include "AutoLightParticle.cginc"
  28. #pragma target 3.0
  29.  
  30. struct appdata {
  31. float4 vertex : POSITION;
  32. float3 normal : NORMAL;
  33. float3 texcoord : TEXCOORD0;
  34. float4 vcol : COLOR0;
  35. };
  36.  
  37. struct v2f {
  38. float4 pos : SV_POSITION;
  39. float2 uv : TEXCOORD0;
  40. float3 normal : TEXCOORD1;
  41. float3 lightDir : TEXCOORD2;
  42. float4 vcol : COLOR0;
  43. LIGHTING_COORDS(3,4)
  44. #ifdef SOFTPARTICLES_ON
  45. float4 projPos : TEXCOORD3;
  46. #endif
  47. };
  48.  
  49. float4x4 _Camera2World;
  50. uniform float4 _MainTex_ST;
  51.  
  52. v2f vert (appdata v) {
  53. v2f o;
  54. o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  55. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  56. o.normal = v.normal;
  57.  
  58. float4 posW = mul (_Camera2World, v.vertex);
  59. o.lightDir = WorldSpaceLightDirFromWorldPos(posW.xyz);
  60.  
  61. TRANSFER_VERTEX_TO_FRAGMENT_PARTICLE(o);
  62. o.vcol = v.vcol;
  63. #ifdef SOFTPARTICLES_ON
  64. o.projPos = ComputeScreenPos (o.pos);
  65. COMPUTE_EYEDEPTH(o.projPos.z);
  66. #endif
  67. return o;
  68. }
  69.  
  70. float4 _LightColor0;
  71. fixed4 _Color;
  72. sampler2D _MainTex;
  73. sampler2D _CameraDepthTexture;
  74. float _InvFade;
  75.  
  76. fixed4 frag(v2f i) : COLOR {
  77. fixed4 c = tex2D( _MainTex, i.uv ) * _Color;
  78. c.rgb *= i.vcol.a * c.a;
  79. fixed atten = LIGHT_ATTENUATION(i);
  80. fixed NdotL = dot(i.normal, i.lightDir) * 0.5 + 0.5;
  81. c.rgb *= UNITY_LIGHTMODEL_AMBIENT * 2;
  82. c.rgb += c.rgb * _LightColor0.rgb * NdotL * atten * 2 * i.vcol.a;
  83.  
  84. #ifdef SOFTPARTICLES_ON
  85. float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
  86. float partZ = i.projPos.z;
  87. float fade = saturate (_InvFade * (sceneZ-partZ));
  88. c.a *= fade;
  89. #endif
  90.  
  91. return c;
  92. }
  93.  
  94. ENDCG
  95. }
  96.  
  97. Pass {
  98. Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "LightMode" = "ForwardAdd"}
  99. //Blend One One
  100. Blend OneMinusDstColor One
  101. ZWrite Off
  102.  
  103. CGPROGRAM
  104.  
  105. #pragma vertex vert
  106. #pragma fragment frag
  107. #pragma multi_compile_fwdadd
  108. #include "UnityCG.cginc"
  109. #include "AutoLight.cginc"
  110. #include "AutoLightParticle.cginc"
  111. #pragma target 3.0
  112.  
  113. struct appdata {
  114. float4 vertex : POSITION;
  115. float3 normal : NORMAL;
  116. float3 texcoord : TEXCOORD0;
  117. float4 vcol : COLOR0;
  118. };
  119.  
  120. struct v2f {
  121. float4 pos : SV_POSITION;
  122. float2 uv : TEXCOORD0;
  123. float3 normal : TEXCOORD1;
  124. float3 lightDir : TEXCOORD2;
  125. float4 vcol : COLOR0;
  126. LIGHTING_COORDS(3,4)
  127. #ifdef SOFTPARTICLES_ON
  128. float4 projPos : TEXCOORD3;
  129. #endif
  130. };
  131.  
  132. float4x4 _Camera2World;
  133. uniform float4 _MainTex_ST;
  134.  
  135. v2f vert (appdata v) {
  136. v2f o;
  137. o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  138. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  139. o.normal = v.normal;
  140.  
  141. float4 posW = mul (_Camera2World, v.vertex);
  142. o.lightDir = WorldSpaceLightDirFromWorldPos(posW.xyz);
  143.  
  144. TRANSFER_VERTEX_TO_FRAGMENT_PARTICLE(o);
  145. o.vcol = v.vcol;
  146. #ifdef SOFTPARTICLES_ON
  147. o.projPos = ComputeScreenPos (o.pos);
  148. COMPUTE_EYEDEPTH(o.projPos.z);
  149. #endif
  150. return o;
  151. }
  152.  
  153. float4 _LightColor0;
  154. fixed4 _Color;
  155. sampler2D _MainTex;
  156. sampler2D _CameraDepthTexture;
  157. float _InvFade;
  158.  
  159. fixed4 frag(v2f i) : COLOR {
  160.  
  161. fixed4 c = tex2D( _MainTex, i.uv ) * _Color;
  162. c.rgb *= _Color.a * i.vcol.a;
  163. fixed atten = LIGHT_ATTENUATION(i);
  164. fixed NdotL = dot(i.normal, i.lightDir) * 0.5 + 0.5;
  165. c.rgb *= _LightColor0.rgb * NdotL * atten;// * 2;
  166.  
  167. #ifdef SOFTPARTICLES_ON
  168. float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
  169. float partZ = i.projPos.z;
  170. float fade = saturate (_InvFade * (sceneZ-partZ));
  171. c.a *= fade;
  172. #endif
  173.  
  174. return c;
  175. }
  176.  
  177. ENDCG
  178. }
  179. }
  180. FallBack Off
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement