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#define_import_path bevy_pbr::pbr_deferred_types
3#import bevy_pbr::{
4 mesh_types::MESH_FLAGS_SHADOW_RECEIVER_BIT,
5 pbr_types::{STANDARD_MATERIAL_FLAGS_FOG_ENABLED_BIT, STANDARD_MATERIAL_FLAGS_UNLIT_BIT},
6}
8// Maximum of 8 bits available
9const DEFERRED_FLAGS_UNLIT_BIT: u32 = 1u;
10const DEFERRED_FLAGS_FOG_ENABLED_BIT: u32 = 2u;
11const DEFERRED_MESH_FLAGS_SHADOW_RECEIVER_BIT: u32 = 4u;
13fn deferred_flags_from_mesh_material_flags(mesh_flags: u32, mat_flags: u32) -> u32 {
14 var flags = 0u;
15 flags |= u32((mesh_flags & MESH_FLAGS_SHADOW_RECEIVER_BIT) != 0u) * DEFERRED_MESH_FLAGS_SHADOW_RECEIVER_BIT;
16 flags |= u32((mat_flags & STANDARD_MATERIAL_FLAGS_FOG_ENABLED_BIT) != 0u) * DEFERRED_FLAGS_FOG_ENABLED_BIT;
17 flags |= u32((mat_flags & STANDARD_MATERIAL_FLAGS_UNLIT_BIT) != 0u) * DEFERRED_FLAGS_UNLIT_BIT;
18 return flags;
21fn mesh_material_flags_from_deferred_flags(deferred_flags: u32) -> vec2<u32> {
22 var mat_flags = 0u;
23 var mesh_flags = 0u;
24 mesh_flags |= u32((deferred_flags & DEFERRED_MESH_FLAGS_SHADOW_RECEIVER_BIT) != 0u) * MESH_FLAGS_SHADOW_RECEIVER_BIT;
25 mat_flags |= u32((deferred_flags & DEFERRED_FLAGS_FOG_ENABLED_BIT) != 0u) * STANDARD_MATERIAL_FLAGS_FOG_ENABLED_BIT;
26 mat_flags |= u32((deferred_flags & DEFERRED_FLAGS_UNLIT_BIT) != 0u) * STANDARD_MATERIAL_FLAGS_UNLIT_BIT;
27 return vec2(mesh_flags, mat_flags);
30const U12MAXF = 4095.0;
31const U16MAXF = 65535.0;
32const U20MAXF = 1048575.0;
34// Storing normals as oct24.
35// Flags are stored in the remaining 8 bits.
36// https://jcgt.org/published/0003/02/01/paper.pdf
37// Could possibly go down to oct20 if the space is needed.
39fn pack_24bit_normal_and_flags(octahedral_normal: vec2<f32>, flags: u32) -> u32 {
40 let unorm1 = u32(saturate(octahedral_normal.x) * U12MAXF + 0.5);
41 let unorm2 = u32(saturate(octahedral_normal.y) * U12MAXF + 0.5);
42 return (unorm1 & 0xFFFu) | ((unorm2 & 0xFFFu) << 12u) | ((flags & 0xFFu) << 24u);
45fn unpack_24bit_normal(packed: u32) -> vec2<f32> {
46 let unorm1 = packed & 0xFFFu;
47 let unorm2 = (packed >> 12u) & 0xFFFu;
48 return vec2(f32(unorm1) / U12MAXF, f32(unorm2) / U12MAXF);
51fn unpack_flags(packed: u32) -> u32 {
52 return (packed >> 24u) & 0xFFu;
55// The builtin one didn't work in webgl.
56// "'unpackUnorm4x8' : no matching overloaded function found"
57// https://github.com/gfx-rs/naga/issues/2006
58fn unpack_unorm4x8_(v: u32) -> vec4<f32> {
59 return vec4(
60 f32(v & 0xFFu),
61 f32((v >> 8u) & 0xFFu),
62 f32((v >> 16u) & 0xFFu),
63 f32((v >> 24u) & 0xFFu)
64 ) / 255.0;
67// 'packUnorm4x8' : no matching overloaded function found
68// https://github.com/gfx-rs/naga/issues/2006
69fn pack_unorm4x8_(values: vec4<f32>) -> u32 {
70 let v = vec4<u32>(saturate(values) * 255.0 + 0.5);
71 return (v.w << 24u) | (v.z << 16u) | (v.y << 8u) | v.x;
74// Pack 3x 4bit unorm + 1x 20bit
75fn pack_unorm3x4_plus_unorm_20_(v: vec4<f32>) -> u32 {
76 let sm = vec3<u32>(saturate(v.xyz) * 15.0 + 0.5);
77 let bg = u32(saturate(v.w) * U20MAXF + 0.5);
78 return (bg << 12u) | (sm.z << 8u) | (sm.y << 4u) | sm.x;
81// Unpack 3x 4bit unorm + 1x 20bit
82fn unpack_unorm3x4_plus_unorm_20_(v: u32) -> vec4<f32> {
83 return vec4(
84 f32(v & 0xfu) / 15.0,
85 f32((v >> 4u) & 0xFu) / 15.0,
86 f32((v >> 8u) & 0xFu) / 15.0,
87 f32((v >> 12u) & 0xFFFFFFu) / U20MAXF,
88 );
Contents