mathe/Library/PackageCache/com.unity.shadergraph@14.0.8/ShaderGraphLibrary/LODDitheringTransition.hlsl
2024-09-20 20:30:10 +02:00

59 lines
2.3 KiB
HLSL

// Shadergraph-friendly implementation of LODDitheringTransition.
// The function as defined in Common.hlsl terminates on clip(f).
// However, since it does not return or output anything, shadergraph
// doesn't recognize it as code that gets used. This file can be removed
// and replaced with a string custom function if Shader Graph ever adds
// support for flagging custom function nodes as used, even if not
// connected to anything.
#ifndef SHADERGRAPH_CROSSFADE_INCLUDED
#define SHADERGRAPH_CROSSFADE_INCLUDED
#ifndef UNITY_MATERIAL_INCLUDED
uint2 ComputeFadeMaskSeed(float3 V, uint2 positionSS)
{
uint2 fadeMaskSeed;
// Is this a reasonable quality gate?
#if defined(SHADER_QUALITY_HIGH)
if (IsPerspectiveProjection())
{
// Start with the world-space direction V. It is independent from the orientation of the camera,
// and only depends on the position of the camera and the position of the fragment.
// Now, project and transform it into [-1, 1].
float2 pv = PackNormalOctQuadEncode(V);
// Rescale it to account for the resolution of the screen.
pv *= _ScreenParams.xy;
// The camera only sees a small portion of the sphere, limited by hFoV and vFoV.
// Therefore, we must rescale again (before quantization), roughly, by 1/tan(FoV/2).
pv *= UNITY_MATRIX_P._m00_m11;
// Truncate and quantize.
fadeMaskSeed = asuint((int2)pv);
}
else
#endif
{
// Can't use the view direction, it is the same across the entire screen.
fadeMaskSeed = positionSS;
}
return fadeMaskSeed;
}
#endif
void LODDitheringTransitionSG_float(float3 viewDirWS, float4 screenPos, out float multiplyAlpha)
{
#if !defined (SHADER_API_GLES) && !defined(SHADER_STAGE_RAY_TRACING)
float p = GenerateHashedRandomFloat(ComputeFadeMaskSeed(viewDirWS, screenPos.xy));
float f = unity_LODFade.x - CopySign(p, unity_LODFade.x);
multiplyAlpha = f < 0 ? 0.0f : 1.0f;
#endif
}
void DoLODCrossFade_half(float3 viewDirWS, float4 screenPos, out half halfAlpha)
{
#if !defined (SHADER_API_GLES) && !defined(SHADER_STAGE_RAY_TRACING)
float p = GenerateHashedRandomFloat(ComputeFadeMaskSeed(viewDirWS, screenPos.xy));
float f = unity_LODFade.x - CopySign(p, unity_LODFade.x);
float multiplyAlpha = f < 0 ? 0.0f : 1.0f;
halfAlpha = (half)multiplyAlpha;
#endif
}
#endif