170 lines
7.9 KiB
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();
|
|
} |