172 lines
4.9 KiB
HLSL
172 lines
4.9 KiB
HLSL
#ifndef SCSS_SHADOWS_INCLUDED
|
|
#define SCSS_SHADOWS_INCLUDED
|
|
|
|
#pragma multi_compile_shadowcaster
|
|
#pragma fragmentoption ARB_precision_hint_fastest
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "UnityShaderVariables.cginc"
|
|
#include "SCSS_Utils.cginc"
|
|
#include "SCSS_Input.cginc"
|
|
|
|
#if (defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)) && defined(UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS)
|
|
#define UNITY_STANDARD_USE_DITHER_MASK 1
|
|
#endif
|
|
|
|
// Need to output UVs in shadow caster, since we need to sample texture and do clip/dithering based on it
|
|
#if defined(_ALPHATEST_ON) || defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)
|
|
#define UNITY_STANDARD_USE_SHADOW_UVS 1
|
|
#endif
|
|
|
|
// Has a non-empty shadow caster output struct (it's an error to have empty structs on some platforms...)
|
|
#if !defined(V2F_SHADOW_CASTER_NOPOS_IS_EMPTY) || defined(UNITY_STANDARD_USE_SHADOW_UVS)
|
|
#define UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT 1
|
|
#endif
|
|
|
|
#ifdef UNITY_STEREO_INSTANCING_ENABLED
|
|
#define UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT 1
|
|
#endif
|
|
|
|
//uniform float4 _Color;
|
|
//uniform float _Cutoff;
|
|
//uniform sampler2D _MainTex;
|
|
//uniform sampler2D _ClippingMask;
|
|
//uniform float4 _MainTex_ST;
|
|
//uniform float _AlbedoAlphaMode;
|
|
//uniform float _VanishingStart;
|
|
//uniform float _VanishingEnd;
|
|
//uniform float _UseVanishing;
|
|
//uniform float _AlphaSharp;
|
|
//uniform float _Tweak_Transparency;
|
|
|
|
#if defined(_SPECULAR)
|
|
/*
|
|
half SpecularSetup_ShadowGetOneMinusReflectivity(half2 uv)
|
|
{
|
|
half3 specColor = _SpecColor.rgb;
|
|
#ifdef _SPECGLOSSMAP
|
|
specColor = tex2D(_SpecGlossMap, uv).rgb;
|
|
#endif
|
|
return (1 - SpecularStrength(specColor));
|
|
}
|
|
*/
|
|
#endif
|
|
|
|
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 normal : NORMAL;
|
|
float2 uv0 : TEXCOORD0;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
#ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
|
|
struct VertexOutputShadowCaster
|
|
{
|
|
V2F_SHADOW_CASTER_NOPOS
|
|
#if defined(UNITY_STANDARD_USE_SHADOW_UVS)
|
|
float2 tex : TEXCOORD1;
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
#ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
|
|
struct VertexOutputStereoShadowCaster
|
|
{
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
#endif
|
|
|
|
float4 TexCoordsShadowCaster(float2 texcoords)
|
|
{
|
|
float4 texcoord;
|
|
texcoord.xy = TRANSFORM_TEX(texcoords, _MainTex);// Always source from uv0
|
|
texcoord.xy = _PixelSampleMode?
|
|
sharpSample(_MainTex_TexelSize * _MainTex_ST.xyxy, texcoord.xy) : texcoord.xy;
|
|
|
|
return texcoord;
|
|
}
|
|
|
|
// We have to do these dances of outputting SV_POSITION separately from the vertex shader,
|
|
// and inputting VPOS in the pixel shader, since they both map to "POSITION" semantic on
|
|
// some platforms, and then things don't go well.
|
|
|
|
void vertShadowCaster (VertexInput v
|
|
, out float4 opos : SV_POSITION
|
|
#ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
|
|
, out VertexOutputShadowCaster o
|
|
#endif
|
|
#ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
|
|
, out VertexOutputStereoShadowCaster os
|
|
#endif
|
|
)
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
|
|
// Vertex modifications go here.
|
|
|
|
#ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(os);
|
|
#endif
|
|
TRANSFER_SHADOW_CASTER_NOPOS(o,opos)
|
|
//TRANSFER_SHADOW_CASTER_NOPOS_LEGACY (o, opos)
|
|
|
|
// Standard would apply texcoords here, but we need to apply them in fragment
|
|
// due to pixel sampling mode options.
|
|
|
|
// Simple inventory.
|
|
float inventoryMask = getInventoryMask(v.uv0);
|
|
|
|
// Apply the inventory mask.
|
|
// Set the output variables based on the mask to completely remove it.
|
|
// - Set the clip-space position to one that won't be rendered
|
|
// - Set the vertex alpha to zero
|
|
// - Disable outlines
|
|
if (_UseInventory)
|
|
{
|
|
opos.z = inventoryMask ? opos.z : 1e+9;
|
|
//o.vertex = inventoryMask ? o.vertex : 1e+9;
|
|
}
|
|
|
|
#if defined(UNITY_STANDARD_USE_SHADOW_UVS)
|
|
o.tex = AnimateTexcoords(v.uv0);
|
|
#endif
|
|
}
|
|
|
|
half4 fragShadowCaster (UNITY_POSITION(vpos)
|
|
#ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
|
|
, VertexOutputShadowCaster i
|
|
#endif
|
|
) : SV_Target
|
|
{
|
|
half alpha = Alpha(0);
|
|
#if defined(UNITY_STANDARD_USE_SHADOW_UVS)
|
|
float4 texcoords = TexCoordsShadowCaster(i.tex);
|
|
fixed3 albedo = Albedo(texcoords);
|
|
alpha = Alpha(texcoords);
|
|
#endif // #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
|
|
|
|
#if defined(ALPHAFUNCTION)
|
|
alphaFunction(alpha);
|
|
#endif
|
|
|
|
applyVanishing(alpha);
|
|
|
|
/* To-do
|
|
#if defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)
|
|
#if defined(_ALPHAPREMULTIPLY_ON)
|
|
half outModifiedAlpha;
|
|
PreMultiplyAlpha(half3(0, 0, 0), alpha, SpecularSetup_ShadowGetOneMinusReflectivity(i.tex), outModifiedAlpha);
|
|
alpha = outModifiedAlpha;
|
|
#endif
|
|
#endif
|
|
*/
|
|
clip(alpha);
|
|
|
|
applyAlphaClip(alpha, _Cutoff, vpos.xy, _AlphaSharp);
|
|
|
|
SHADOW_CASTER_FRAGMENT(i)
|
|
}
|
|
|
|
#endif |