1import bevy_pbr::render::mesh_view_bindings::{view, oit_nodes_capacity, oit_nodes, oit_heads, oit_atomic_counter, oit_settings}; 2import bevy_pbr::render::mesh_view_types::OitFragmentNode; 3import bevy_pbr::prepass::utils as prepass_utils; 7fn oit_draw(position: vec4f, color: vec4f) { 9 if position.z < prepass_utils::prepass_depth(position, 0u) { 14 if color.r < oit_settings.alpha_threshold 15 && color.g < oit_settings.alpha_threshold 16 && color.b < oit_settings.alpha_threshold 17 && color.a < oit_settings.alpha_threshold 22 let screen_index = u32(floor(position.x) + floor(position.y) * view.viewport.z); 24 var new_node_index = atomicAdd(&oit_atomic_counter, 1u); 26 if new_node_index >= oit_nodes_capacity { 31 var node: OitFragmentNode; 33 node.next = atomicExchange(&oit_heads[screen_index], new_node_index + 1u) - 1u; 34 node.color = bevy_pbr::render::rgb9e5::vec3_to_rgb9e5_(color.rgb); 35 node.depth_alpha = pack_24bit_depth_8bit_alpha(position.z, color.a); 36 oit_nodes[new_node_index] = node; 43fn pack_24bit_depth_8bit_alpha(depth: f32, alpha: f32) -> u32 { 44 let depth_bits = u32(saturate(depth) * f32(0xFFFFFFu) + 0.5); 45 let alpha_bits = u32(saturate(alpha) * f32(0xFFu) + 0.5); 46 return (depth_bits << 8u) | alpha_bits; 49fn unpack_24bit_depth_8bit_alpha(packed: u32) -> vec2<f32> { 50 let depth_bits = packed >> 8u; 51 let alpha_bits = packed & 0xFFu; 52 return vec2(f32(depth_bits) / f32(0xFFFFFFu), f32(alpha_bits) / f32(0xFFu));