zombie_mp/Assets/KriptoFX/VolumetricBloodFX/Shaders/BFX_Blood.shader
Sewmina Dilshan 68183e5317 initial
2021-08-23 13:28:33 +05:30

234 lines
7.2 KiB
Plaintext

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