234 lines
7.2 KiB
Plaintext
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
|
|
}
|
|
}
|