123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- Shader "KriptoFX/BFX/BFX_Blood"
- {
- Properties
- {
- _Color("Color", Color) = (1,1,1,1)
- _boundingMax("Bounding Max", Float) = 1.0
- _boundingMin("Bounding Min", Float) = 1.0
- _numOfFrames("Number Of Frames", int) = 240
- _speed("Speed", Float) = 0.33
- _HeightOffset("_Height Offset", Vector) = (0, 0, 0)
- //[MaterialToggle] _pack_normal("Pack Normal", Float) = 0
- _posTex("Position Map (RGB)", 2D) = "white" {}
- _nTex("Normal Map (RGB)", 2D) = "grey" {}
- _SunPos("Sun Pos", Vector) = (1, 0.5, 1, 0)
- }
- SubShader
- {
- Tags{ "Queue" = "AlphaTest+1"}
- Blend SrcAlpha OneMinusSrcAlpha
- Cull Back
- ZWrite On
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_instancing
- #pragma multi_compile_fog
- #include "UnityCG.cginc"
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- float4 tangent : TEXCOORD2;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- };
- struct v2f
- {
- float2 uv : TEXCOORD0;
- float4 pos : SV_POSITION;
- float3 worldNormal : TEXCOORD2;
- float4 screenPos : TEXCOORD4;
- float3 viewDir : TEXCOORD5;
- float height : TEXCOORD6;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- };
- sampler2D _GrabTexture;
- sampler2D _posTex;
- sampler2D _nTex;
- uniform float _boundingMax;
- uniform float _boundingMin;
- uniform float _speed;
- uniform int _numOfFrames;
- half4 _Color;
- float4 _HeightOffset;
- float _HDRFix;
- float4 _SunPos;
- UNITY_INSTANCING_BUFFER_START(Props)
- UNITY_DEFINE_INSTANCED_PROP(float, _UseCustomTime)
- UNITY_DEFINE_INSTANCED_PROP(float, _TimeInFrames)
- UNITY_DEFINE_INSTANCED_PROP(float, _LightIntencity)
- UNITY_INSTANCING_BUFFER_END(Props)
- v2f vert (appdata v)
- {
- v2f o;
- UNITY_INITIALIZE_OUTPUT(v2f, o);
- UNITY_SETUP_INSTANCE_ID(v);
- UNITY_TRANSFER_INSTANCE_ID(v, o);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
- float timeInFrames;
- float currentSpeed = 1.0f / (_numOfFrames / _speed);
- timeInFrames = UNITY_ACCESS_INSTANCED_PROP(Props, _UseCustomTime) > 0.5 ? UNITY_ACCESS_INSTANCED_PROP(Props, _TimeInFrames) : 1;
- float4 texturePos = tex2Dlod(_posTex, float4(v.uv.x, (timeInFrames + v.uv.y), 0, 0));
- float3 textureN = tex2Dlod(_nTex, float4(v.uv.x, (timeInFrames + v.uv.y), 0, 0));
- #if !UNITY_COLORSPACE_GAMMA
- texturePos.xyz = LinearToGammaSpace(texturePos.xyz);
- textureN = LinearToGammaSpace(textureN);
- #endif
- float expand = _boundingMax - _boundingMin;
- texturePos.xyz *= expand;
- texturePos.xyz += _boundingMin;
- texturePos.x *= -1;
- v.vertex.xyz = texturePos.xzy;
- v.vertex.xyz += _HeightOffset.xyz;
- o.worldNormal = textureN.xzy * 2 - 1;
- o.worldNormal.x *= -1;
- o.viewDir = ObjSpaceViewDir(v.vertex);
- o.pos = UnityObjectToClipPos(v.vertex);
- o.screenPos = ComputeGrabScreenPos(o.pos);
- return o;
- }
- half4 frag(v2f i) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(i);
- i.worldNormal = normalize(i.worldNormal);
- i.viewDir = normalize(i.viewDir);
- half fresnel = saturate(1 - dot(i.worldNormal, i.viewDir));
- half intencity = UNITY_ACCESS_INSTANCED_PROP(Props, _LightIntencity);
- half3 grabColor = intencity * 0.75;
- half light = max(0.001, dot(normalize(i.worldNormal), normalize(_SunPos.xyz)));
- light = pow(light, 50) * 10;
- #if !UNITY_COLORSPACE_GAMMA
- _Color.rgb = _Color.rgb * .65;
- fresnel = fresnel * fresnel;
- #endif
- grabColor *= _Color.rgb;
- grabColor = lerp(grabColor * 0.15, grabColor, fresnel);
- grabColor = min(grabColor, _Color.rgb * 0.55);
- half3 color = grabColor.xyz + saturate(light) * intencity;
- return half4(color, _Color.a);
- }
- ENDCG
- }
- //you can optimize it by removing shadow rendering and depth writing
- //start remove line
- Pass
- {
- Tags {"LightMode" = "ShadowCaster"}
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_shadowcaster
- #pragma multi_compile_instancing
- #include "UnityCG.cginc"
- sampler2D _GrabTexture;
- sampler2D _posTex;
- sampler2D _nTex;
- uniform float _boundingMax;
- uniform float _boundingMin;
- uniform float _speed;
- uniform int _numOfFrames;
- half4 _Color;
- float4 _HeightOffset;
- UNITY_INSTANCING_BUFFER_START(Props)
- UNITY_DEFINE_INSTANCED_PROP(float, _TimeInFrames)
- UNITY_INSTANCING_BUFFER_END(Props)
- struct appdata
- {
- float2 uv : TEXCOORD0;
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- };
- struct v2f {
- V2F_SHADOW_CASTER;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- };
- v2f vert(appdata v)
- {
- v2f o;
- UNITY_INITIALIZE_OUTPUT(v2f, o);
- UNITY_SETUP_INSTANCE_ID(v);
- UNITY_TRANSFER_INSTANCE_ID(v, o);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
- float timeInFrames;
- float currentSpeed = 1.0f / (_numOfFrames / _speed);
- timeInFrames = UNITY_ACCESS_INSTANCED_PROP(Props, _TimeInFrames);
- float4 texturePos = tex2Dlod(_posTex, float4(v.uv.x, (timeInFrames + v.uv.y), 0, 0));
- #if !UNITY_COLORSPACE_GAMMA
- texturePos.xyz = LinearToGammaSpace(texturePos.xyz);
- #endif
- float expand = _boundingMax - _boundingMin;
- texturePos.xyz *= expand;
- texturePos.xyz += _boundingMin;
- texturePos.x *= -1;
- v.vertex.xyz = texturePos.xzy;
- v.vertex.xyz += _HeightOffset.xyz;
- TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
- return o;
- }
- float4 frag(v2f i) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(i);
- SHADOW_CASTER_FRAGMENT(i)
- }
- ENDCG
- }
- //end remove light
- }
- }
|