You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.3 KiB
58 lines
2.3 KiB
// 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
|
|
|