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