| 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    }}
 |