2 prepass::utils as prepass_utils, 4 pbr_types::STANDARD_MATERIAL_FLAGS_UNLIT_BIT, 6 pbr_lighting as lighting, 7 mesh_view_bindings::{deferred_prepass_texture, view}, 10 functions::pbr_input_from_deferred_gbuffer, 11 types::unpack_unorm3x4_plus_unorm_20_, 15@if(SCREEN_SPACE_AMBIENT_OCCLUSION) import package::render::mesh_view_bindings::screen_space_ambient_occlusion_texture; 16@if(SCREEN_SPACE_AMBIENT_OCCLUSION) import package::ssao::utils::ssao_multibounce; 18struct FullscreenVertexOutput { 25struct PbrDeferredLightingDepthId { 27 @if(SIXTEEN_BYTE_ALIGNMENT) 29 _webgl2_padding_0: f32, 30 @if(SIXTEEN_BYTE_ALIGNMENT) 31 _webgl2_padding_1: f32, 32 @if(SIXTEEN_BYTE_ALIGNMENT) 33 _webgl2_padding_2: f32, 36var<uniform> depth_id: PbrDeferredLightingDepthId; 39fn vertex(@builtin(vertex_index) vertex_index: u32) -> FullscreenVertexOutput { 41 let uv = vec2<f32>(f32(vertex_index >> 1u), f32(vertex_index & 1u)) * 2.0; 43 let clip_position = vec4<f32>(uv * vec2<f32>(2.0, -2.0) + vec2<f32>(-1.0, 1.0), f32(depth_id.depth_id) / 255.0, 1.0); 45 return FullscreenVertexOutput(clip_position, uv); 49fn fragment(in: FullscreenVertexOutput) -> @location(0) vec4<f32> { 50 var frag_coord = vec4(in.position.xy, 0.0, 0.0); 52 let deferred_data = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0); 55 frag_coord.z = unpack_unorm3x4_plus_unorm_20_(deferred_data.b).w; 57 frag_coord.z = prepass_utils::prepass_depth(in.position, 0u); 59 var pbr_input = pbr_input_from_deferred_gbuffer(frag_coord, deferred_data); 60 var output_color = vec4(0.0); 63 if ((pbr_input.material.flags & STANDARD_MATERIAL_FLAGS_UNLIT_BIT) == 0u) { 65@if(SCREEN_SPACE_AMBIENT_OCCLUSION) { 66 let ssao_tex_pos = vec2<i32>(in.position.xy - view.viewport.xy); 67 let ssao = textureLoad(screen_space_ambient_occlusion_texture, ssao_tex_pos, 0i).r; 68 let ssao_multibounce = ssao_multibounce(ssao, pbr_input.material.base_color.rgb); 69 pbr_input.diffuse_occlusion = min(pbr_input.diffuse_occlusion, ssao_multibounce); 72 let NdotV = max(dot(pbr_input.N, pbr_input.V), 0.0001); 73 var perceptual_roughness: f32 = pbr_input.material.perceptual_roughness; 74 let roughness = lighting::perceptualRoughnessToRoughness(perceptual_roughness); 77 pbr_input.specular_occlusion = saturate(pow(NdotV + ssao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ssao); 80 output_color = pbr_functions::apply_pbr_lighting(pbr_input); 82 output_color = pbr_input.material.base_color; 85 output_color = pbr_functions::main_pass_post_lighting_processing(pbr_input, output_color);