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.
1#import bevy_pbr::utils::rand_f
3struct InstanceData {
4 pos_and_scale: vec4<f32>,
5 index: u32,
6 pad1: u32,
7 pad2: u32,
8 pad3: u32,
9}
11struct DrawIndexedIndirectArgs {
12 index_count: u32,
13 instance_count: atomic<u32>,
14 first_index: u32,
15 base_vertex: i32,
16 first_instance: u32,
19struct CameraCullData {
20 view_pos: vec4<f32>,
23struct LodCullData {
24 visibility_range: vec4<f32>,
25 world_from_local: mat4x4<f32>,
28@group(0) @binding(0) var<storage, read> source_buffer: array<InstanceData>;
29@group(0) @binding(1) var<storage, read_write> instance_buffer: array<InstanceData>;
30@group(0) @binding(2) var<storage, read_write> indirect_args: DrawIndexedIndirectArgs;
31@group(0) @binding(3) var<uniform> camera: CameraCullData;
32@group(0) @binding(4) var<uniform> lod_data: LodCullData;
35fn hash_noise(index: u32) -> f32 {
36 var state = index;
37 return rand_f(&state);
40@compute @workgroup_size(64)
41fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
42 let i = global_id.x;
43 if (i >= arrayLength(&source_buffer)) { return; }
45 let instance = source_buffer[i];
46 let local_pos = vec4<f32>(instance.pos_and_scale.xyz, 1.0);
47 let world_pos = lod_data.world_from_local * local_pos;
49 let dist = distance(world_pos.xyz, camera.view_pos.xyz);
51 if (dist < lod_data.visibility_range.x || dist > lod_data.visibility_range.w) {
52 return;
53 }
55 let write_index = atomicAdd(&indirect_args.instance_count, 1u);
57 instance_buffer[write_index] = instance;
Contents