1import bevy_pbr::render::mesh_view_bindings::view; 2import bevy_pbr::render::mesh_view_bindings::depth_prepass_texture; 3import bevy_pbr::render::mesh_view_bindings::normal_prepass_texture; 4import bevy_pbr::render::mesh_view_bindings::motion_vector_prepass_texture; 5import bevy_pbr::render::mesh_view_bindings::deferred_prepass_texture; 6import bevy_pbr::render::view_transformations::depth_ndc_to_view_z; 7import bevy_pbr::deferred::types::unpack_24bit_normal; 8import bevy_pbr::deferred::types::unpack_unorm4x8_; 9import bevy_pbr::deferred::types::unpack_unorm3x4_plus_unorm_20_; 10import bevy_pbr::render::rgb9e5::rgb9e5_to_vec3_; 11import bevy_render::utils::octahedral_decode; 13struct DebugBufferConfig { 18@group(1) @binding(0) var<uniform> config: DebugBufferConfig; 19@group(1) @binding(1) var background_texture: texture_2d<f32>; 20@group(1) @binding(2) var background_sampler: sampler; 22@if(DEBUG_DEPTH_PYRAMID) { 23@group(1) @binding(3) var depth_pyramid_texture: texture_2d<f32>; 24@group(1) @binding(4) var depth_pyramid_sampler: sampler; 28fn fragment(@builtin(position) frag_coord: vec4<f32>) -> @location(0) vec4<f32> { 29 let uv = frag_coord.xy / view.viewport.zw; 30 let background = textureSampleLevel(background_texture, background_sampler, uv, 0.0); 31 var output_color: vec4<f32> = vec4(0.0); 35 let depth = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), 0); 36 output_color = vec4(vec3(depth), 1.0); 39 output_color = vec4(1.0, 0.0, 1.0, 1.0); 45 let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), 0); 46 output_color = vec4(normal_sample.xyz, 1.0); 49 @if(DEFERRED_PREPASS) { 50 let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0); 51 let normal = octahedral_decode(unpack_24bit_normal(deferred.a)); 52 output_color = vec4(normal * 0.5 + 0.5, 1.0); 55 output_color = vec4(1.0, 0.0, 1.0, 1.0); 60@if(DEBUG_MOTION_VECTORS) { 61 @if(MOTION_VECTOR_PREPASS) { 62 let motion_vector = textureLoad(motion_vector_prepass_texture, vec2<i32>(frag_coord.xy), 0).rg; 65 let mapped_motion = sign(motion_vector) * pow(abs(motion_vector), vec2(0.2)) * 0.5 + 0.5; 66 output_color = vec4(mapped_motion, 0.5, 1.0); 69 output_color = vec4(1.0, 0.0, 1.0, 1.0); 74 @if(DEFERRED_PREPASS) { 75 let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0); 76 output_color = vec4(vec3(f32(deferred.x) / 255.0, f32(deferred.y) / 255.0, f32(deferred.z) / 255.0), 1.0); 79 output_color = vec4(1.0, 0.0, 1.0, 1.0); 83@if(DEBUG_DEFERRED_BASE_COLOR) { 84 @if(DEFERRED_PREPASS) { 85 let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0); 86 let base_rough = unpack_unorm4x8_(deferred.x); 87 output_color = vec4(pow(base_rough.rgb, vec3(2.2)), 1.0); 90 output_color = vec4(1.0, 0.0, 1.0, 1.0); 94@if(DEBUG_DEFERRED_EMISSIVE) { 95 @if(DEFERRED_PREPASS) { 96 let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0); 97 let emissive = rgb9e5_to_vec3_(deferred.y); 98 output_color = vec4(emissive, 1.0); 101 output_color = vec4(1.0, 0.0, 1.0, 1.0); 105@if(DEBUG_DEFERRED_METALLIC_ROUGHNESS) { 106 @if(DEFERRED_PREPASS) { 107 let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0); 108 let base_rough = unpack_unorm4x8_(deferred.x); 109 let props = unpack_unorm4x8_(deferred.z); 111 output_color = vec4(props.r, props.g, props.b, base_rough.a); 114 output_color = vec4(1.0, 0.0, 1.0, 1.0); 118@if(DEBUG_DEPTH_PYRAMID) { 119 let depth_pyramid = textureSampleLevel(depth_pyramid_texture, depth_pyramid_sampler, uv, f32(config.mip_level)).r; 120 output_color = vec4(vec3(depth_pyramid), 1.0); 123 let alpha = output_color.a * config.opacity; 124 return vec4(mix(background.rgb, output_color.rgb, alpha), 1.0);