Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1import package::realtime::gbuffer_utils::gpixel_resolve;
2import package::realtime::initial_path::generate_initial_path;
3import package::realtime::bindings::{constants, depth_buffer, gbuffer, view, view_output};
4import package::scene::bindings::RAY_T_MAX;
5import package::realtime::world_cache_query::{query_world_cache, WORLD_CACHE_CELL_LIFETIME};
7enable wgpu_ray_query;
9@compute @workgroup_size(8, 8, 1)
10fn initial_and_shade(@builtin(workgroup_id) workgroup_id: vec3<u32>, @builtin(global_invocation_id) global_id: vec3<u32>) {
11 if any(global_id.xy >= vec2u(view.main_pass_viewport.zw)) { return; }
13 let pixel_index = global_id.x + global_id.y * u32(view.main_pass_viewport.z);
14 var rng = pixel_index + constants.frame_rng;
16 let depth = textureLoad(depth_buffer, global_id.xy, 0);
17 if depth == 0.0 { return; }
19 let surface = gpixel_resolve(textureLoad(gbuffer, global_id.xy, 0), depth, global_id.xy, view.main_pass_viewport.zw, view.world_from_clip);
21 let path = generate_initial_path(surface.world_position, surface.world_normal, surface.material, workgroup_id.xy, global_id.xy, &rng);
23 var pixel_color = path.radiance;
24 pixel_color += surface.material.emissive;
25 pixel_color *= view.exposure;
26 textureStore(view_output, global_id.xy, vec4(pixel_color, 1.0));
28 @if(VISUALIZE_WORLD_CACHE)
29 textureStore(view_output, global_id.xy, vec4(query_world_cache(surface.world_position, surface.world_normal, view.world_position, RAY_T_MAX, WORLD_CACHE_CELL_LIFETIME, &rng) * view.exposure, 1.0));
Contents