HoloprojStreaming/Assets/lilToon/Shader/Includes/lil_pass_forward_fur.hlsl

205 lines
6.8 KiB
HLSL

#ifndef LIL_PASS_FORWARD_FUR_INCLUDED
#define LIL_PASS_FORWARD_FUR_INCLUDED
#include "lil_common.hlsl"
#include "lil_common_appdata.hlsl"
//------------------------------------------------------------------------------------------------------------------------------
// Structure
#if !defined(LIL_CUSTOM_V2G_MEMBER)
#define LIL_CUSTOM_V2G_MEMBER(id0,id1,id2,id3,id4,id5,id6,id7)
#endif
#if !defined(LIL_CUSTOM_V2F_MEMBER)
#define LIL_CUSTOM_V2F_MEMBER(id0,id1,id2,id3,id4,id5,id6,id7)
#endif
// v2g
#define LIL_V2G_TEXCOORD0
#define LIL_V2G_POSITION_WS
#if defined(LIL_V2G_FORCE_NORMAL_WS) || defined(LIL_SHOULD_NORMAL)
#define LIL_V2G_NORMAL_WS
#endif
#if !defined(LIL_PASS_FORWARDADD)
#define LIL_V2G_LIGHTCOLOR
#define LIL_V2G_LIGHTDIRECTION
#if defined(LIL_FEATURE_SHADOW)
#define LIL_V2G_INDLIGHTCOLOR
#endif
#endif
#define LIL_V2G_VERTEXLIGHT_FOG
#define LIL_V2G_FURVECTOR
#define LIL_V2G_VERTEXID
// g2f
#define LIL_V2F_POSITION_CS
#define LIL_V2F_TEXCOORD0
#if defined(LIL_V2F_FORCE_POSITION_WS) || defined(LIL_PASS_FORWARDADD) || defined(LIL_FEATURE_DISTANCE_FADE) || !defined(LIL_BRP) || defined(LIL_USE_LPPV)
#define LIL_V2F_POSITION_WS
#endif
#if defined(LIL_V2F_FORCE_NORMAL_WS) || defined(LIL_SHOULD_NORMAL)
#define LIL_V2F_NORMAL_WS
#endif
#if !defined(LIL_PASS_FORWARDADD)
#define LIL_V2F_LIGHTCOLOR
#define LIL_V2F_LIGHTDIRECTION
#if defined(LIL_FEATURE_SHADOW)
#define LIL_V2F_INDLIGHTCOLOR
#endif
#endif
#define LIL_V2F_VERTEXLIGHT_FOG
#define LIL_V2F_FURLAYER
struct v2g
{
float2 uv0 : TEXCOORD0;
float3 positionWS : TEXCOORD1;
float3 furVector : TEXCOORD2;
uint vertexID : TEXCOORD3;
#if defined(LIL_V2G_NORMAL_WS)
float3 normalWS : TEXCOORD4;
#endif
LIL_LIGHTCOLOR_COORDS(5)
LIL_LIGHTDIRECTION_COORDS(6)
LIL_INDLIGHTCOLOR_COORDS(7)
LIL_VERTEXLIGHT_FOG_COORDS(8)
LIL_CUSTOM_V2G_MEMBER(9,10,11,12,13,14,15,16)
LIL_VERTEX_INPUT_INSTANCE_ID
LIL_VERTEX_OUTPUT_STEREO
};
struct v2f
{
float4 positionCS : SV_POSITION;
float2 uv0 : TEXCOORD0;
#if defined(LIL_V2F_POSITION_WS)
float3 positionWS : TEXCOORD1;
#endif
#if defined(LIL_V2F_NORMAL_WS)
LIL_VECTOR_INTERPOLATION float3 normalWS : TEXCOORD2;
#endif
float furLayer : TEXCOORD3;
LIL_LIGHTCOLOR_COORDS(4)
LIL_LIGHTDIRECTION_COORDS(5)
LIL_INDLIGHTCOLOR_COORDS(6)
LIL_VERTEXLIGHT_FOG_COORDS(7)
LIL_CUSTOM_V2F_MEMBER(8,9,10,11,12,13,14,15)
LIL_VERTEX_INPUT_INSTANCE_ID
LIL_VERTEX_OUTPUT_STEREO
};
//------------------------------------------------------------------------------------------------------------------------------
// Shader
#include "lil_common_vert_fur.hlsl"
#include "lil_common_frag.hlsl"
float4 frag(v2f input) : SV_Target
{
//------------------------------------------------------------------------------------------------------------------------------
// Initialize
LIL_SETUP_INSTANCE_ID(input);
LIL_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
lilFragData fd = lilInitFragData();
BEFORE_UNPACK_V2F
OVERRIDE_UNPACK_V2F
LIL_GET_HDRPDATA(input,fd);
#if defined(LIL_V2F_SHADOW) || defined(LIL_PASS_FORWARDADD)
LIL_LIGHT_ATTENUATION(fd.attenuation, input);
#endif
LIL_GET_LIGHTING_DATA(input,fd);
//------------------------------------------------------------------------------------------------------------------------------
// View Direction
#if defined(LIL_V2F_POSITION_WS)
LIL_GET_POSITION_WS_DATA(input,fd);
#endif
#if defined(LIL_V2F_NORMAL_WS) && defined(LIL_V2F_TANGENT_WS)
LIL_GET_TBN_DATA(input,fd);
#endif
#if defined(LIL_V2F_NORMAL_WS) && defined(LIL_V2F_TANGENT_WS) && defined(LIL_V2F_POSITION_WS)
LIL_GET_PARALLAX_DATA(input,fd);
#endif
//------------------------------------------------------------------------------------------------------------------------------
// UV
BEFORE_ANIMATE_MAIN_UV
OVERRIDE_ANIMATE_MAIN_UV
BEFORE_CALC_DDX_DDY
OVERRIDE_CALC_DDX_DDY
//------------------------------------------------------------------------------------------------------------------------------
// Main Color
BEFORE_MAIN
OVERRIDE_MAIN
//------------------------------------------------------------------------------------------------------------------------------
// Fur
BEFORE_FUR
OVERRIDE_FUR
//------------------------------------------------------------------------------------------------------------------------------
// Copy
fd.albedo = fd.col.rgb;
//------------------------------------------------------------------------------------------------------------------------------
// Alpha
#if LIL_RENDER == 1 || defined(LIL_FUR_PRE)
// Cutout
fd.col.a = saturate(fd.col.a*5.0-2.0);
if(fd.col.a == 0) discard;
#else
// Transparent
clip(fd.col.a - _Cutoff);
#endif
BEFORE_SHADOW
#ifndef LIL_PASS_FORWARDADD
//------------------------------------------------------------------------------------------------------------------------------
// Lighting
#if defined(LIL_FEATURE_SHADOW)
fd.N = normalize(input.normalWS);
fd.ln = dot(fd.L, fd.N);
OVERRIDE_SHADOW
fd.col.rgb += fd.albedo * fd.addLightColor;
fd.col.rgb = min(fd.col.rgb, fd.albedo * _LightMaxLimit);
#else
fd.col.rgb *= saturate(fd.lightColor + fd.addLightColor);
#endif
#else
#if defined(LIL_FEATURE_SHADOW) && defined(LIL_OPTIMIZE_APPLY_SHADOW_FA)
fd.N = normalize(input.normalWS);
fd.ln = dot(fd.L, fd.N);
OVERRIDE_SHADOW
#else
fd.col.rgb *= fd.lightColor;
#endif
#if LIL_RENDER == 2 && !defined(LIL_FUR_PRE)
fd.col.rgb *= saturate(fd.col.a * _AlphaBoostFA);
#endif
#endif
//------------------------------------------------------------------------------------------------------------------------------
// Distance Fade
BEFORE_DISTANCE_FADE
#if defined(LIL_FEATURE_DISTANCE_FADE)
OVERRIDE_DISTANCE_FADE
#endif
//------------------------------------------------------------------------------------------------------------------------------
// Fix Color
LIL_HDRP_DEEXPOSURE(fd.col);
//------------------------------------------------------------------------------------------------------------------------------
// Fog
BEFORE_FOG
OVERRIDE_FOG
BEFORE_OUTPUT
OVERRIDE_OUTPUT
}
#endif