Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_dev_tools/src/debug_overlay.wgsl
9328 views
#import bevy_pbr::mesh_view_bindings::view
#import bevy_pbr::mesh_view_bindings::depth_prepass_texture
#import bevy_pbr::mesh_view_bindings::normal_prepass_texture
#import bevy_pbr::mesh_view_bindings::motion_vector_prepass_texture
#import bevy_pbr::mesh_view_bindings::deferred_prepass_texture
#import bevy_pbr::view_transformations::depth_ndc_to_view_z
#import bevy_pbr::pbr_deferred_types::unpack_24bit_normal
#import bevy_pbr::pbr_deferred_types::unpack_unorm4x8_
#import bevy_pbr::pbr_deferred_types::unpack_unorm3x4_plus_unorm_20_
#import bevy_pbr::rgb9e5::rgb9e5_to_vec3_
#import bevy_pbr::utils::octahedral_decode

struct DebugBufferConfig {
    opacity: f32,
    mip_level: u32,
}

@group(1) @binding(0) var<uniform> config: DebugBufferConfig;
@group(1) @binding(1) var background_texture: texture_2d<f32>;
@group(1) @binding(2) var background_sampler: sampler;

#ifdef DEBUG_DEPTH_PYRAMID
@group(1) @binding(3) var depth_pyramid_texture: texture_2d<f32>;
@group(1) @binding(4) var depth_pyramid_sampler: sampler;
#endif

@fragment
fn fragment(@builtin(position) frag_coord: vec4<f32>) -> @location(0) vec4<f32> {
    let uv = frag_coord.xy / view.viewport.zw;
    let background = textureSampleLevel(background_texture, background_sampler, uv, 0.0);
    var output_color: vec4<f32> = vec4(0.0);

#ifdef DEBUG_DEPTH
    #ifdef DEPTH_PREPASS
        let depth = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), 0);
        output_color = vec4(vec3(depth), 1.0);
    #else
        output_color = vec4(1.0, 0.0, 1.0, 1.0);
    #endif
#endif

#ifdef DEBUG_NORMAL
    #ifdef NORMAL_PREPASS
        let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), 0);
        output_color = vec4(normal_sample.xyz, 1.0);
    #else
        #ifdef DEFERRED_PREPASS
            let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);
            let normal = octahedral_decode(unpack_24bit_normal(deferred.a));
            output_color = vec4(normal * 0.5 + 0.5, 1.0);
        #else
            output_color = vec4(1.0, 0.0, 1.0, 1.0);
        #endif
    #endif
#endif

#ifdef DEBUG_MOTION_VECTORS
    #ifdef MOTION_VECTOR_PREPASS
        let motion_vector = textureLoad(motion_vector_prepass_texture, vec2<i32>(frag_coord.xy), 0).rg;
        // These motion vectors are stored in a format where 1.0 represents full-screen movement.
        // We use a power curve to amplify small movements while keeping them centered.
        let mapped_motion = sign(motion_vector) * pow(abs(motion_vector), vec2(0.2)) * 0.5 + 0.5;
        output_color = vec4(mapped_motion, 0.5, 1.0);
    #else
        output_color = vec4(1.0, 0.0, 1.0, 1.0);
    #endif
#endif

#ifdef DEBUG_DEFERRED
    #ifdef DEFERRED_PREPASS
        let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);
        output_color = vec4(vec3(f32(deferred.x) / 255.0, f32(deferred.y) / 255.0, f32(deferred.z) / 255.0), 1.0);
    #else
        output_color = vec4(1.0, 0.0, 1.0, 1.0);
    #endif
#endif

#ifdef DEBUG_DEFERRED_BASE_COLOR
    #ifdef DEFERRED_PREPASS
        let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);
        let base_rough = unpack_unorm4x8_(deferred.x);
        output_color = vec4(pow(base_rough.rgb, vec3(2.2)), 1.0);
    #else
        output_color = vec4(1.0, 0.0, 1.0, 1.0);
    #endif
#endif

#ifdef DEBUG_DEFERRED_EMISSIVE
    #ifdef DEFERRED_PREPASS
        let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);
        let emissive = rgb9e5_to_vec3_(deferred.y);
        output_color = vec4(emissive, 1.0);
    #else
        output_color = vec4(1.0, 0.0, 1.0, 1.0);
    #endif
#endif

#ifdef DEBUG_DEFERRED_METALLIC_ROUGHNESS
    #ifdef DEFERRED_PREPASS
        let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);
        let base_rough = unpack_unorm4x8_(deferred.x);
        let props = unpack_unorm4x8_(deferred.z);
        // R: Reflectance, G: Metallic, B: Occlusion, A: Perceptual Roughness
        output_color = vec4(props.r, props.g, props.b, base_rough.a);
    #else
        output_color = vec4(1.0, 0.0, 1.0, 1.0);
    #endif
#endif

#ifdef DEBUG_DEPTH_PYRAMID
    let depth_pyramid = textureSampleLevel(depth_pyramid_texture, depth_pyramid_sampler, uv, f32(config.mip_level)).r;
    output_color = vec4(vec3(depth_pyramid), 1.0);
#endif

    let alpha = output_color.a * config.opacity;
    return vec4(mix(background.rgb, output_color.rgb, alpha), 1.0);
}