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

170 lines
7.9 KiB
HLSL

//------------------------------------------------------------------------------------------------------------------------------
// FakeFur (based on UnlitWF/UnToon by whiteflare, MIT License)
// https://github.com/whiteflare/Unlit_WF_ShaderSuite
#if defined(LIL_V2G_FURVECTOR)
float3 fvc = (input[0].furVector +input[1].furVector +input[2].furVector) *0.333333333333;
#endif
#if defined(LIL_V2G_POSITION_WS)
float3 wpc = (input[0].positionWS +input[1].positionWS +input[2].positionWS) *0.333333333333;
#endif
#if defined(LIL_V2G_TEXCOORD0)
float2 uv0c = (input[0].uv0 +input[1].uv0 +input[2].uv0) *0.333333333333;
#endif
#if defined(LIL_V2G_TEXCOORD1)
float2 uv1c = (input[0].uv1 +input[1].uv1 +input[2].uv1) *0.333333333333;
#endif
#if defined(LIL_V2G_TEXCOORD2)
float2 uv1c = (input[0].uv2 +input[1].uv2 +input[2].uv2) *0.333333333333;
#endif
#if defined(LIL_V2G_TEXCOORD3)
float2 uv1c = (input[0].uv3 +input[1].uv3 +input[2].uv3) *0.333333333333;
#endif
#if defined(LIL_V2G_PACKED_TEXCOORD01)
float4 uv01c = (input[0].uv01 +input[1].uv01 +input[2].uv01) *0.333333333333;
#endif
#if defined(LIL_V2G_PACKED_TEXCOORD23)
float4 uv23c = (input[0].uv23 +input[1].uv23 +input[2].uv23) *0.333333333333;
#endif
#if defined(LIL_V2G_NORMAL_WS)
float3 ndc = (input[0].normalWS +input[1].normalWS +input[2].normalWS) *0.333333333333;
#endif
#if defined(LIL_V2G_VERTEXLIGHT_FOG) && !(!defined(LIL_USE_ADDITIONALLIGHT_VS) && defined(LIL_HDRP))
LIL_VERTEXLIGHT_FOG_TYPE vlfc = (input[0].vlf + input[1].vlf + input[2].vlf) * 0.333333333333;
#endif
#if defined(LIL_PASS_MOTIONVECTOR_INCLUDED)
float3 pwpc = (input[0].previousPositionWS + input[1].previousPositionWS + input[2].previousPositionWS) *0.333333333333;
#endif
for(uint fl = 0; fl < _FurLayerNum; fl++)
{
float lpmix = fl/(float)_FurLayerNum;
for(int ii=0;ii<4;ii++)
{
int ii2 = ii==3 ? 0 : ii;
// Common
float2 outUV = lerp(input[ii2].uv0,uv0c,lpmix);
#if defined(LIL_V2F_TEXCOORD0)
output.uv0 = outUV;
#endif
#if defined(LIL_V2F_TEXCOORD1)
output.uv1 = lerp(input[ii2].uv1,uv1c,lpmix);
#endif
#if defined(LIL_V2F_TEXCOORD2)
output.uv2 = lerp(input[ii2].uv2,uv2c,lpmix);
#endif
#if defined(LIL_V2F_TEXCOORD3)
output.uv3 = lerp(input[ii2].uv3,uv3c,lpmix);
#endif
#if defined(LIL_V2F_PACKED_TEXCOORD01)
output.uv01 = lerp(input[ii2].uv01,uv01c,lpmix);
#endif
#if defined(LIL_V2F_PACKED_TEXCOORD23)
output.uv23 = lerp(input[ii2].uv23,uv23c,lpmix);
#endif
#if defined(LIL_V2F_NORMAL_WS)
output.normalWS = lerp(input[ii2].normalWS,ndc,lpmix);
#endif
#if defined(LIL_V2F_VERTEXLIGHT_FOG) && !(!defined(LIL_USE_ADDITIONALLIGHT_VS) && defined(LIL_HDRP))
output.vlf = lerp(input[ii2].vlf,vlfc,lpmix);
#endif
float3 fvmix = lerp(input[ii2].furVector,fvc,lpmix);
float3 furVector = normalize(fvmix);
#if !defined(LIL_NOT_SUPPORT_VERTEXID)
uint3 n0 = (input[0].vertexID * input[1].vertexID * input[2].vertexID + (fl * 439853 + ii * 364273 + 1)) * uint3(1597334677U, 3812015801U, 2912667907U);
float3 noise0 = normalize(float3(n0) * (2.0/float(0xffffffffU)) - 1.0);
fvmix += noise0 * _FurVector.w * _FurRandomize;
#endif
#if defined(LIL_FEATURE_FurLengthMask)
fvmix *= LIL_SAMPLE_2D_LOD(_FurLengthMask, sampler_linear_repeat, outUV * _MainTex_ST.xy + _MainTex_ST.zw, 0).r;
#endif
// In
float3 positionWS = lerp(input[ii2].positionWS,wpc,lpmix);
#if defined(LIL_V2F_POSITION_WS)
output.positionWS = positionWS;
#endif
#if defined(LIL_V2F_POSITION_CS)
output.positionCS = lilTransformWStoCS(positionWS);
#endif
#if defined(LIL_PASS_MOTIONVECTOR_INCLUDED)
float3 previousPositionWS = lerp(input[ii2].previousPositionWS,pwpc,lpmix);
output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionWS, 1.0));
#endif
#if defined(LIL_V2F_FURLAYER)
output.furLayer = 0;
#endif
#if defined(LIL_V2F_POSITION_CS) && defined(LIL_FEATURE_CLIPPING_CANCELLER) && !defined(LIL_PASS_SHADOWCASTER_INCLUDED) && !defined(LIL_PASS_META_INCLUDED)
//------------------------------------------------------------------------------------------------------------------------------
// Clipping Canceller
#if defined(UNITY_REVERSED_Z)
// DirectX
if(output.positionCS.w < _ProjectionParams.y * 1.01 && output.positionCS.w > 0 && _ProjectionParams.y < LIL_NEARCLIP_THRESHOLD LIL_MULTI_SHOULD_CLIPPING)
{
output.positionCS.z = output.positionCS.z * 0.0001 + output.positionCS.w * 0.999;
}
#else
// OpenGL
if(output.positionCS.w < _ProjectionParams.y * 1.01 && output.positionCS.w > 0 && _ProjectionParams.y < LIL_NEARCLIP_THRESHOLD LIL_MULTI_SHOULD_CLIPPING)
{
output.positionCS.z = output.positionCS.z * 0.0001 - output.positionCS.w * 0.999;
}
#endif
#endif
#if defined(LIL_FUR_PRE)
#if defined(UNITY_REVERSED_Z)
// DirectX
output.positionCS.z -= 0.0000001;
#else
// OpenGL
output.positionCS.z += 0.0000001;
#endif
#endif
outStream.Append(output);
// Out
positionWS += fvmix;
#if defined(LIL_V2F_POSITION_WS)
output.positionWS = positionWS;
#endif
#if defined(LIL_V2F_POSITION_CS)
output.positionCS = lilTransformWStoCS(positionWS);
#endif
#if defined(LIL_PASS_MOTIONVECTOR_INCLUDED)
previousPositionWS.xyz += fvmix;
output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionWS, 1.0));
#endif
#if defined(LIL_V2F_FURLAYER)
output.furLayer = 1;
#endif
#if defined(LIL_V2F_POSITION_CS) && defined(LIL_FEATURE_CLIPPING_CANCELLER) && !defined(LIL_PASS_SHADOWCASTER_INCLUDED) && !defined(LIL_PASS_META_INCLUDED)
//------------------------------------------------------------------------------------------------------------------------------
// Clipping Canceller
#if defined(UNITY_REVERSED_Z)
// DirectX
if(output.positionCS.w < _ProjectionParams.y * 1.01 && output.positionCS.w > 0 && _ProjectionParams.y < LIL_NEARCLIP_THRESHOLD LIL_MULTI_SHOULD_CLIPPING)
{
output.positionCS.z = output.positionCS.z * 0.0001 + output.positionCS.w * 0.999;
}
#else
// OpenGL
if(output.positionCS.w < _ProjectionParams.y * 1.01 && output.positionCS.w > 0 && _ProjectionParams.y < LIL_NEARCLIP_THRESHOLD LIL_MULTI_SHOULD_CLIPPING)
{
output.positionCS.z = output.positionCS.z * 0.0001 - output.positionCS.w * 0.999;
}
#endif
#endif
#if defined(LIL_FUR_PRE)
#if defined(UNITY_REVERSED_Z)
// DirectX
output.positionCS.z -= 0.0000001;
#else
// OpenGL
output.positionCS.z += 0.0000001;
#endif
#endif
outStream.Append(output);
}
outStream.RestartStrip();
}