<@if not DEFERRED_BUFFER_SLH@> <@def DEFERRED_BUFFER_SLH@> <@include gpu/PackedNormal.slh@> // Unpack the metallic-mode value const float FRAG_PACK_SHADED_NON_METALLIC = 0.0; const float FRAG_PACK_SHADED_METALLIC = 0.1; const float FRAG_PACK_SHADED_RANGE_INV = 1.0 / (FRAG_PACK_SHADED_METALLIC - FRAG_PACK_SHADED_NON_METALLIC); const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.2; const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.3; const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.4; const float FRAG_PACK_SCATTERING_METALLIC = 0.5; const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); const float FRAG_PACK_UNLIT = 0.6; const int FRAG_MODE_UNLIT = 0; const int FRAG_MODE_SHADED = 1; const int FRAG_MODE_LIGHTMAPPED = 2; const int FRAG_MODE_SCATTERING = 3; void unpackModeMetallic(float rawValue, out int mode, out float metallic) { if (rawValue <= FRAG_PACK_SHADED_METALLIC) { mode = FRAG_MODE_SHADED; metallic = clamp((rawValue - FRAG_PACK_SHADED_NON_METALLIC) * FRAG_PACK_SHADED_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { mode = FRAG_MODE_LIGHTMAPPED; metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_SCATTERING_METALLIC) { mode = FRAG_MODE_SCATTERING; metallic = clamp((rawValue - FRAG_PACK_SCATTERING_NON_METALLIC) * FRAG_PACK_SCATTERING_RANGE_INV, 0.0, 1.0); } else if (rawValue >= FRAG_PACK_UNLIT) { mode = FRAG_MODE_UNLIT; metallic = 0.0; } } float packShadedMetallic(float metallic) { return mix(FRAG_PACK_SHADED_NON_METALLIC, FRAG_PACK_SHADED_METALLIC, metallic); } float packLightmappedMetallic(float metallic) { return mix(FRAG_PACK_LIGHTMAPPED_NON_METALLIC, FRAG_PACK_LIGHTMAPPED_METALLIC, metallic); } float packScatteringMetallic(float metallic) { return mix(FRAG_PACK_SCATTERING_NON_METALLIC, FRAG_PACK_SCATTERING_METALLIC, metallic); } float packUnlit() { return FRAG_PACK_UNLIT; } <@endif@>