Files
ZHGD_Web/Assets/Art/Art Plugins/GPUInstancer/Shaders/Include/GPUILODCrossFade.cginc
2025-07-13 23:16:20 +08:00

91 lines
2.8 KiB
HLSL

#ifndef GPU_INSTANCER_CROSSFADE_INCLUDED
#define GPU_INSTANCER_CROSSFADE_INCLUDED
#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) && !defined(GPUI_MHT_MATRIX_APPEND)
#ifdef UNITY_APPLY_DITHER_CROSSFADE
#undef UNITY_APPLY_DITHER_CROSSFADE
#endif
#ifdef LOD_FADE_CROSSFADE
#define UNITY_APPLY_DITHER_CROSSFADE(vpos) UnityApplyDitherCrossFadeGPUI(vpos)
#else
#define UNITY_APPLY_DITHER_CROSSFADE(vpos)
#endif
uniform sampler2D _DitherMaskLOD2D;
void UnityApplyDitherCrossFadeGPUI(float2 vpos)
{
if (LODLevel >= 0)
{
#ifdef GPUI_MHT_COPY_TEXTURE
uint textureWidth = min(bufferSize, maxTextureSize);
float indexX = ((gpui_InstanceID % maxTextureSize) + 0.5f) / textureWidth;
float rowCount = ceil(bufferSize / maxTextureSize);
float rowIndex = floor(gpui_InstanceID / maxTextureSize) + 0.5f;
uint4 lodData = uint4(tex2Dlod(gpuiInstanceLODDataTexture, float4(indexX, rowIndex / rowCount, 0.0f, 0.0f)));
#else
uint4 lodData = gpuiInstanceLODData[gpui_InstanceID];
#endif
if (lodData.w > 0)
{
float fadeLevel = floor(lodData.w * fadeLevelMultiplier);
if (lodData.z == uint(LODLevel))
fadeLevel = 15 - fadeLevel;
if (fadeLevel > 0)
{
vpos /= 4; // the dither mask texture is 4x4
vpos.y = (frac(vpos.y) + fadeLevel) * 0.0625 /* 1/16 */; // quantized lod fade by 16 levels
clip(tex2D(_DitherMaskLOD2D, vpos).a - 0.5);
}
}
}
}
#ifdef UNITY_RANDOM_INCLUDED
#ifdef LODDitheringTransition
#undef LODDitheringTransition
#endif
#define LODDitheringTransition(fadeMaskSeed, ditherFactor) LODDitheringTransitionGPUI(fadeMaskSeed, ditherFactor)
void LODDitheringTransitionGPUI(uint2 fadeMaskSeed, float ditherFactor)
{
if (LODLevel >= 0)
{
#ifdef GPUI_MHT_COPY_TEXTURE
uint textureWidth = min(bufferSize, maxTextureSize);
float indexX = ((gpui_InstanceID % maxTextureSize) + 0.5f) / textureWidth;
float rowCount = ceil(bufferSize / maxTextureSize);
float rowIndex = floor(gpui_InstanceID / maxTextureSize) + 0.5f;
uint4 lodData = uint4(tex2Dlod(gpuiInstanceLODDataTexture, float4(indexX, rowIndex / rowCount, 0.0f, 0.0f)));
#else
uint4 lodData = gpuiInstanceLODData[gpui_InstanceID];
#endif
if (lodData.w > 0)
{
float fadeLevel = floor(lodData.w * fadeLevelMultiplier);
if (fadeLevel > 0)
{
ditherFactor = (frac(fadeMaskSeed.y) + fadeLevel) * 0.0625;
float p = GenerateHashedRandomFloat(fadeMaskSeed);
float f = ditherFactor - p;
if (lodData.z == uint(LODLevel))
f = -f;
clip(f);
}
}
}
}
#endif // UNITY_RANDOM_INCLUDED
#endif // UNITY_PROCEDURAL_INSTANCING_ENABLED
#endif // GPU_INSTANCER_CROSSFADE_INCLUDED