308 lines
7.6 KiB
Plaintext
308 lines
7.6 KiB
Plaintext
|
// Upgrade NOTE: upgraded instancing buffer 'Props' to new syntax.
|
||
|
|
||
|
Shader "KriptoFX/FPS_Pack/Decal"
|
||
|
{
|
||
|
Properties
|
||
|
{
|
||
|
[Header(Main Settings)]
|
||
|
[Space]
|
||
|
[PerRendererData] [HDR]_TintColor("Tint Color", Color) = (1,1,1,1)
|
||
|
_MainTex("Main Texture", 2D) = "white" {}
|
||
|
[Toggle(USE_ALPHA_POW)] _UseAlphaPow("Use Alpha Pow", Int) = 0
|
||
|
_AlphaPow("Alpha pow", Float) = 1
|
||
|
[Space]
|
||
|
[Header(Light)]
|
||
|
|
||
|
[Space]
|
||
|
[Header(Noise Distortion)]
|
||
|
[Toggle(USE_NOISE_DISTORTION)] _UseNoiseDistortion("Use Noise Distortion", Int) = 0
|
||
|
_NoiseTex("Noise Texture (RG)", 2D) = "gray" {}
|
||
|
_DistortSpeed("Distort Speed", Float) = 1
|
||
|
_DistortScale("Distort Scale", Float) = .1
|
||
|
|
||
|
[Space]
|
||
|
[Header(Cutout)]
|
||
|
[Toggle(USE_CUTOUT)] _UseCutout("Use Cutout", Int) = 0
|
||
|
[PerRendererData] _Cutout("Cutout", Range(0, 1)) = 1
|
||
|
_CutoutAlphaMul("Alpha multiplier", Float) = 1
|
||
|
|
||
|
[Toggle(USE_CUTOUT_TEX)] _UseCutoutTex("Use Cutout Texture", Int) = 0
|
||
|
_CutoutTex("Cutout Tex", 2D) = "white" {}
|
||
|
|
||
|
[Toggle(USE_CUTOUT_THRESHOLD)] _UseCutoutThreshold("Use Cutout Threshold", Int) = 0
|
||
|
[HDR]_CutoutColor("Cutout Color", Color) = (1,1,1,1)
|
||
|
|
||
|
[Space]
|
||
|
[Header(Rendering)]
|
||
|
[Toggle(USE_WORLD_SPACE_UV)] _UseWorldSpaceUV("Use World Space UV", Int) = 0
|
||
|
[Toggle(USE_FRAME_BLENDING)] _UseFrameBlending("Use Frame Blending", Int) = 0
|
||
|
|
||
|
[KeywordEnum(Add, Blend, Mul)] _BlendMode("Blend Mode", Float) = 1
|
||
|
_SrcMode("SrcMode", int) = 5
|
||
|
_DstMode("DstMode", int) = 10
|
||
|
_ZTest1("_ZTest1", int) = 5
|
||
|
}
|
||
|
|
||
|
Category{
|
||
|
Tags{ "Queue" = "Transparent-1" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
|
||
|
Blend[_SrcMode][_DstMode]
|
||
|
Cull Front
|
||
|
ZTest [_ZTest1]
|
||
|
ZWrite Off
|
||
|
|
||
|
SubShader{
|
||
|
|
||
|
Pass{
|
||
|
|
||
|
CGPROGRAM
|
||
|
#pragma vertex vert
|
||
|
#pragma fragment frag
|
||
|
//#pragma target 3.0
|
||
|
|
||
|
#pragma multi_compile_fog
|
||
|
#pragma multi_compile_instancing
|
||
|
|
||
|
#pragma shader_feature USE_QUAD_DECAL
|
||
|
|
||
|
#pragma shader_feature USE_ALPHA_POW
|
||
|
#pragma shader_feature USE_NOISE_DISTORTION
|
||
|
|
||
|
#pragma shader_feature USE_CUTOUT
|
||
|
#pragma shader_feature USE_CUTOUT_TEX
|
||
|
#pragma shader_feature USE_CUTOUT_THRESHOLD
|
||
|
|
||
|
#pragma shader_feature USE_WORLD_SPACE_UV
|
||
|
#pragma shader_feature USE_FRAME_BLENDING
|
||
|
|
||
|
#pragma multi_compile _BLENDMODE_ADD _BLENDMODE_BLEND _BLENDMODE_MUL
|
||
|
|
||
|
#include "UnityCG.cginc"
|
||
|
|
||
|
sampler2D _MainTex;
|
||
|
sampler2D _NoiseTex;
|
||
|
sampler2D _CutoutTex;
|
||
|
sampler2D _CutoutRamp;
|
||
|
sampler2D _CameraDepthTexture;
|
||
|
|
||
|
|
||
|
float4 _MainTex_ST;
|
||
|
float4 _MainTex_NextFrame;
|
||
|
float4 _NoiseTex_ST;
|
||
|
float4 _CutoutTex_ST;
|
||
|
|
||
|
UNITY_INSTANCING_BUFFER_START(Props)
|
||
|
//UNITY_DEFINE_INSTANCED_PROP(float4x4, _InverseTransformMatrix)
|
||
|
UNITY_DEFINE_INSTANCED_PROP(half4, _TintColor)
|
||
|
#define _TintColor_arr Props
|
||
|
UNITY_DEFINE_INSTANCED_PROP(half, _Cutout)
|
||
|
#define _Cutout_arr Props
|
||
|
UNITY_INSTANCING_BUFFER_END(Props)
|
||
|
|
||
|
|
||
|
half4 _CutoutColor;
|
||
|
half4 _FresnelColor;
|
||
|
half4 _DistortionSpeedScale;
|
||
|
|
||
|
half _InvFade;
|
||
|
half _FresnelFadeFactor;
|
||
|
half _FresnelPow;
|
||
|
half _FresnelR0;
|
||
|
half InterpolationValue;
|
||
|
half _CutoutAlphaMul;
|
||
|
half _AlphaPow;
|
||
|
half _DistortSpeed;
|
||
|
half _DistortScale;
|
||
|
|
||
|
|
||
|
struct appdata_t {
|
||
|
float4 vertex : POSITION;
|
||
|
float4 normal : NORMAL;
|
||
|
half4 color : COLOR;
|
||
|
float4 randomID : TEXCOORD0;
|
||
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||
|
};
|
||
|
|
||
|
struct v2f {
|
||
|
float4 vertex : SV_POSITION;
|
||
|
half4 color : COLOR;
|
||
|
|
||
|
float4 screenUV : TEXCOORD0;
|
||
|
float3 ray : TEXCOORD1;
|
||
|
|
||
|
#if USE_QUAD_DECAL
|
||
|
float2 uv : TEXCOORD2;
|
||
|
#endif
|
||
|
|
||
|
UNITY_FOG_COORDS(4)
|
||
|
|
||
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
sampler2D RFX4_PointLightAttenuation;
|
||
|
half4 RFX4_AmbientColor;
|
||
|
float4 RFX4_LightPositions[40];
|
||
|
float4 RFX4_LightColors[40];
|
||
|
int RFX4_LightCount;
|
||
|
|
||
|
|
||
|
half3 ShadeCustomLights(float4 vertex, half3 normal, int lightCount)
|
||
|
{
|
||
|
float3 worldPos = mul(unity_ObjectToWorld, vertex);
|
||
|
float3 worldNormal = UnityObjectToWorldNormal(normal);
|
||
|
|
||
|
float3 lightColor = RFX4_AmbientColor.xyz;
|
||
|
for (int i = 0; i < lightCount; i++) {
|
||
|
float3 lightDir = RFX4_LightPositions[i].xyz - worldPos.xyz * RFX4_LightColors[i].w;
|
||
|
half normalizedDist = length(lightDir) / RFX4_LightPositions[i].w;
|
||
|
fixed attenuation = tex2Dlod(RFX4_PointLightAttenuation, half4(normalizedDist.xx, 0, 0));
|
||
|
attenuation = lerp(1, attenuation, RFX4_LightColors[i].w);
|
||
|
float diff = max(0, dot(normalize(worldNormal), normalize(lightDir)));
|
||
|
lightColor += RFX4_LightColors[i].rgb * (diff * attenuation);
|
||
|
}
|
||
|
return (lightColor);
|
||
|
}
|
||
|
|
||
|
v2f vert(appdata_t v)
|
||
|
{
|
||
|
v2f o;
|
||
|
UNITY_SETUP_INSTANCE_ID(v);
|
||
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||
|
|
||
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
||
|
o.color = v.color;
|
||
|
o.color.rgb *= ShadeCustomLights(v.vertex, float3(0, 1, 0), RFX4_LightCount);
|
||
|
|
||
|
o.ray = UnityObjectToViewPos(v.vertex) * float3(-1, -1, 1);
|
||
|
o.screenUV = ComputeScreenPos(o.vertex);
|
||
|
|
||
|
#if USE_QUAD_DECAL
|
||
|
#ifdef USE_WORLD_SPACE_UV
|
||
|
o.uv = mul(unity_ObjectToWorld, v.vertex).xz;
|
||
|
#else
|
||
|
o.uv = v.vertex.xz + 0.5;
|
||
|
#endif
|
||
|
#endif
|
||
|
UNITY_TRANSFER_FOG(o,o.vertex);
|
||
|
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
|
||
|
half4 frag(v2f i) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_INSTANCE_ID(i);
|
||
|
#if USE_QUAD_DECAL
|
||
|
float2 uv = i.uv;
|
||
|
float3 opos = uv.xyy + 0.5;
|
||
|
float projClipFade = 1;
|
||
|
#else
|
||
|
|
||
|
i.ray *= (_ProjectionParams.z / i.ray.z); // Far clip dist/viewspace distance
|
||
|
|
||
|
float depth = Linear01Depth(tex2Dproj(_CameraDepthTexture, i.screenUV));
|
||
|
float3 wpos = mul(unity_CameraToWorld, float4(i.ray * depth, 1)).xyz;
|
||
|
float3 opos = mul(unity_WorldToObject, float4(wpos, 1)).xyz;
|
||
|
//float3 opos = mul(UNITY_ACCESS_INSTANCED_PROP(_InverseTransformMatrix), float4(wpos, 1)).xyz;
|
||
|
//float3 opos = mul(_InverseTransformMatrix, float4(wpos, 1)).xyz;
|
||
|
float3 stepVal = saturate((0.5 - abs(opos.xyz)) * 10000);
|
||
|
|
||
|
float projClipFade = stepVal.x * stepVal.y * stepVal.z * (1 - abs(opos.y * 2));
|
||
|
projClipFade = pow(projClipFade, 0.2);
|
||
|
|
||
|
#ifdef USE_WORLD_SPACE_UV
|
||
|
float2 uv = wpos.xz;
|
||
|
#else
|
||
|
float2 uv = opos.xz + 0.5;
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
float2 uvMain = uv * _MainTex_ST.xy + _MainTex_ST.zw;
|
||
|
#ifdef USE_FRAME_BLENDING
|
||
|
float2 uvNextFrame = uv * _MainTex_NextFrame.xy + _MainTex_NextFrame.zw;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#if defined (USE_NOISE_DISTORTION)
|
||
|
float2 uvNoise = uv * _NoiseTex_ST.xy + _NoiseTex_ST.zw;
|
||
|
#endif
|
||
|
#if defined (USE_CUTOUT_TEX)
|
||
|
float2 uvCutout = (opos.xz + 0.5) * _CutoutTex_ST.xy + _CutoutTex_ST.zw;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef USE_NOISE_DISTORTION
|
||
|
|
||
|
half2 distortMask = tex2D(_NoiseTex, uvNoise) * 2 - 1;
|
||
|
|
||
|
half4 tex = tex2D(_MainTex, uvMain + distortMask * _DistortScale + _DistortSpeed * _Time.xx);
|
||
|
half4 tex2 = tex2D(_MainTex, uvMain - distortMask * _DistortScale - _DistortSpeed * _Time.xx * 1.4);
|
||
|
tex *= tex2;
|
||
|
#ifdef USE_FRAME_BLENDING
|
||
|
half4 tex3 = tex2D(_MainTex, uvNextFrame);
|
||
|
tex = lerp(tex, tex3, InterpolationValue);
|
||
|
#endif
|
||
|
|
||
|
#else
|
||
|
half4 tex = tex2D(_MainTex, uvMain);
|
||
|
|
||
|
#ifdef USE_FRAME_BLENDING
|
||
|
half4 tex2 = tex2D(_MainTex, uvNextFrame);
|
||
|
tex = lerp(tex, tex2, InterpolationValue);
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
half4 res = tex * UNITY_ACCESS_INSTANCED_PROP(_TintColor_arr, _TintColor);
|
||
|
res.rgb *= 2;
|
||
|
//res.rgb *= i.color.rgb;
|
||
|
#ifdef USE_CUTOUT
|
||
|
|
||
|
#ifdef USE_CUTOUT_TEX
|
||
|
half mask = tex2D(_CutoutTex, uvCutout).a;
|
||
|
#else
|
||
|
half mask = tex.a;
|
||
|
#endif
|
||
|
|
||
|
half cutout = 1 - UNITY_ACCESS_INSTANCED_PROP(_Cutout_arr, _Cutout) * i.color.a;
|
||
|
half alphaMask = saturate((mask - (cutout * 2 - 1)) * _CutoutAlphaMul) * res.a;
|
||
|
res.a = alphaMask;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
res.a = saturate(res.a * projClipFade);
|
||
|
#ifdef USE_ALPHA_POW
|
||
|
res.rgb *= pow(res.a, _AlphaPow);
|
||
|
#endif
|
||
|
|
||
|
#ifdef _BLENDMODE_ADD
|
||
|
UNITY_APPLY_FOG_COLOR(i.fogCoord, res, half4(0,0,0,0));
|
||
|
#endif
|
||
|
#ifdef _BLENDMODE_BLEND
|
||
|
UNITY_APPLY_FOG(i.fogCoord, res);
|
||
|
#endif
|
||
|
#ifdef _BLENDMODE_MUL
|
||
|
res = lerp(1, res, saturate(res.a * 2));
|
||
|
UNITY_APPLY_FOG_COLOR(i.fogCoord, res, half4(1,1,1,1)); // fog towards white due to our blend mode
|
||
|
#endif
|
||
|
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
ENDCG
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
CustomEditor "FPS_UberDecalGUI"
|
||
|
}
|