VR4Medical/ICI/Library/PackageCache/com.unity.render-pipelines.universal@2b88762731f8/ShaderLibrary/GBufferCommon.hlsl
2025-07-29 13:45:50 +03:00

145 lines
5.3 KiB
HLSL

// This file contains common functionality used for URP GBuffer passes.
// This should not be included directly, instead include GBufferInput.hlsl or GBufferOutput.hlsl.
#ifndef UNIVERSAL_GBUFFERCOMMON_INCLUDED
#define UNIVERSAL_GBUFFERCOMMON_INCLUDED
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl"
// Material flags:
#define kMaterialFlagReceiveShadowsOff 1 // Does not receive dynamic shadows
#define kMaterialFlagSpecularHighlightsOff 2 // Does not receive specular
#define kMaterialFlagSubtractiveMixedLighting 4 // The geometry uses subtractive mixed lighting
#define kMaterialFlagSpecularSetup 8 // Lit material use specular setup instead of metallic setup
// GBuffer feature macros. Deduced from active keywords:
#if defined(_RENDER_PASS_ENABLED)
#define GBUFFER_FBFETCH_AVAILABLE 1
#endif
#if defined(GBUFFER_FBFETCH_AVAILABLE)
#define GBUFFER_FEATURE_DEPTH 1
#endif
#if !defined(LIGHTMAP_ON) && defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK)
#define GBUFFER_FEATURE_SHADOWMASK 1
#elif defined(SHADOWS_SHADOWMASK)
#define GBUFFER_FEATURE_SHADOWMASK 1
#elif defined(_DEFERRED_MIXED_LIGHTING)
#define GBUFFER_FEATURE_SHADOWMASK 1
#endif
#if (defined(_WRITE_RENDERING_LAYERS) || defined(_LIGHT_LAYERS))
#define GBUFFER_FEATURE_RENDERING_LAYERS 1
#endif
// Setup static GBuffer index macros:
#define GBUFFER_IDX_RGB_BASECOLOR_A_FLAGS 0
#define GBUFFER_IDX_RGB_SPECULAR_R_METALLIC_A_OCCLUSION 1
#define GBUFFER_IDX_RGB_NORMALS_A_SMOOTHNESS 2
// Helper macro to get GBuffer index + 1
#define GBUFFER_IDX_AFTER(x) GBUFFER_IDX_AFTER_ ## x
#define GBUFFER_IDX_AFTER_0 1
#define GBUFFER_IDX_AFTER_1 2
#define GBUFFER_IDX_AFTER_2 3
#define GBUFFER_IDX_AFTER_3 4
#define GBUFFER_IDX_AFTER_4 5
#define GBUFFER_IDX_AFTER_5 6
#define GBUFFER_IDX_AFTER_6 7
#define GBUFFER_IDX_AFTER_7 8
// Setup dynamic GBuffer index macros.
// These are extra GBuffers that may be used depending on which features are enabled.
// Index is dynamically assigned for each combination of enabled/disabled features.
// Possible features: [GBUFFER_FEATURE_DEPTH, GBUFFER_FEATURE_SHADOWMASK, GBUFFER_FEATURE_RENDERING_LAYERS]
#if defined(GBUFFER_FEATURE_DEPTH)
// [1, 0, 0]
#define GBUFFER_IDX_R_DEPTH GBUFFER_IDX_AFTER(GBUFFER_IDX_RGB_NORMALS_A_SMOOTHNESS)
#if defined(GBUFFER_FEATURE_SHADOWMASK)
// [1, 1, 0]
#define GBUFFER_IDX_RGBA_SHADOWMASK GBUFFER_IDX_AFTER(GBUFFER_IDX_R_DEPTH)
#if defined(GBUFFER_FEATURE_RENDERING_LAYERS)
// [1, 1, 1]
#define GBUFFER_IDX_R_RENDERING_LAYERS GBUFFER_IDX_AFTER(GBUFFER_IDX_RGBA_SHADOWMASK)
#endif
#elif defined(GBUFFER_FEATURE_RENDERING_LAYERS)
// [1, 0, 1]
#define GBUFFER_IDX_R_RENDERING_LAYERS GBUFFER_IDX_AFTER(GBUFFER_IDX_R_DEPTH)
#endif
#elif defined(GBUFFER_FEATURE_SHADOWMASK)
// [0, 1, 0]
#define GBUFFER_IDX_RGBA_SHADOWMASK GBUFFER_IDX_AFTER(GBUFFER_IDX_RGB_NORMALS_A_SMOOTHNESS)
#if defined(GBUFFER_FEATURE_RENDERING_LAYERS)
// [0, 1, 1]
#define GBUFFER_IDX_R_RENDERING_LAYERS GBUFFER_IDX_AFTER(GBUFFER_IDX_RGBA_SHADOWMASK)
#endif
#elif defined(GBUFFER_FEATURE_RENDERING_LAYERS)
// [0, 0, 1]
#define GBUFFER_IDX_R_RENDERING_LAYERS GBUFFER_IDX_AFTER(GBUFFER_IDX_RGB_NORMALS_A_SMOOTHNESS)
#endif
// Unpacked URP GBuffer data.
struct GBufferData
{
half3 baseColor;
half smoothness;
// For Lit materials, if !(materialFlags & kMaterialFlagSpecularSetup) then specularColor.r contains metallic.
half3 specularColor;
half occlusion;
float3 normalWS;
uint materialFlags;
float depth;
// Only assigned if GBUFFER_FEATURE_SHADOWMASK is defined!
// Otherwise, defaults to (1, 1, 1, 1)
half4 shadowMask;
// Only assigned if GBUFFER_FEATURE_RENDERING_LAYERS is defined!
// Otherwise, defaults to 0xFFFF (Everything)
uint meshRenderingLayers;
};
// GBuffer utility functions:
float PackGBufferMaterialFlags(uint materialFlags)
{
return materialFlags * (half(1.0) / half(255.0));
}
uint UnpackGBufferMaterialFlags(float packedMaterialFlags)
{
return uint((packedMaterialFlags * half(255.0)) + half(0.5));
}
#if defined(_GBUFFER_NORMALS_OCT)
half3 PackGBufferNormal(half3 normalWS)
{
float2 octNormalWS = PackNormalOctQuadEncode(normalWS); // values between [-1, +1], must use fp32 on some platforms.
float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); // values between [ 0, +1]
return half3(PackFloat2To888(remappedOctNormalWS)); // values between [ 0, +1]
}
half3 UnpackGBufferNormal(half3 packedNormalWS)
{
half2 remappedOctNormalWS = half2(Unpack888ToFloat2(packedNormalWS));// values between [ 0, +1]
half2 octNormalWS = remappedOctNormalWS.xy * half(2.0) - half(1.0); // values between [-1, +1]
return half3(UnpackNormalOctQuadEncode(octNormalWS)); // values between [-1, +1]
}
#else
half3 PackGBufferNormal(half3 normalWS)
{ return normalWS; } // values between [-1, +1]
half3 UnpackGBufferNormal(half3 packedNormalWS)
{ return packedNormalWS; } // values between [-1, +1]
#endif
#endif