From 4449172c2b30340ac51a5f36ef2402ba91357d81 Mon Sep 17 00:00:00 2001 From: SeanOMik Date: Thu, 18 Jul 2024 23:43:08 -0400 Subject: [PATCH] render: implement PCSS for directional lights --- examples/assets/shadows-platform-palmtree.glb | Bin 0 -> 97604 bytes examples/assets/wood-platform/model.bin | Bin 0 -> 840 bytes examples/assets/wood-platform/model.gltf | 142 ++++++++++++++++++ examples/assets/wood-platform/wood1.jpg | Bin 0 -> 4257 bytes examples/assets/wood-platform/wood1OLD.jpg | Bin 0 -> 48455 bytes examples/shadows/src/main.rs | 33 +++- lyra-game/src/render/graph/node.rs | 8 + lyra-game/src/render/graph/passes/meshes.rs | 48 +++++- lyra-game/src/render/graph/passes/shadows.rs | 100 +++++++++--- lyra-game/src/render/shaders/base.wgsl | 126 +++++++++++----- 10 files changed, 394 insertions(+), 63 deletions(-) create mode 100644 examples/assets/shadows-platform-palmtree.glb create mode 100644 examples/assets/wood-platform/model.bin create mode 100644 examples/assets/wood-platform/model.gltf create mode 100644 examples/assets/wood-platform/wood1.jpg create mode 100644 examples/assets/wood-platform/wood1OLD.jpg diff --git a/examples/assets/shadows-platform-palmtree.glb b/examples/assets/shadows-platform-palmtree.glb new file mode 100644 index 0000000000000000000000000000000000000000..66a3dfd5e0e16768e5c820685f20b9122b809a5e GIT binary patch literal 97604 zcmce;2S5|swm%#TMS9f$p#+p(LJ}Ye0z!n)dyy&uLa(7IMMVh+0*VxAf)MGwO103t z1OWj7MT&@sQdMl<;5puV+PnAMcmMAjNoHp6)%V)J*=r`Fi>Il^K@bRZI{W|##ts5$ zn;7Va3gZ3!2?2tbP(c@hH-U%`@F5Cf1a(}AKHfh50xkfHfSM=4+lfFF(2_9_2trEB zO3NbzB?W^BM1MCQZ-5vs4HFEP6!dol1PEeazaIGuVyr_2z42Z^o1n>$K1o4uA1A_o z2TW2{5-y35MB0Yi{-ugUJHq0YtpFzb8K6hk1Z5z(83An1UQkURD8(f}!OUB!4Rd{zn<`zmS2HMxc-g zG#oB3D+iO4g)0D3Q3`Oh98w;p0E3}XC9rNeFAIgDFS?&1e`Bu7F0$!cagj3WnNm14vPTVmKTo52)L3mY0M{BjNIBBn+tlLn9Dq zStJ~Y(Uq2yL&N3e<_cmz07_E5P7D)X*q7q%2$x{X0jIe{>Z2|FfgOz`zi|21mhxP$<9Ck;o!(eetiaFl`^0tkSl6jE9a7!@=e zg+Kv~2swn@k8JhA2M~yEc+X!F+{q`C2vu}`3jt2e;{K@{0Hfg!={ps-U?f7+a{4Z>g{lBnff0F$#Y=Qq@*s?!4{};9({x58i``_7u z{7-DL-Onw5*B?;)4~+g5Yki4sUTy(yLBDq50|JO{4uJvtr=fy|1}0jjS_b+*Fk0Wh zSWi_~5CdSasrnhLfr0VqvoJx-{s;j{?B=-70^s1!`LdtWKM?ZIfc-ah0$B4?r`+## z%KuiU!f$oT{*}%jx%c<{MEz4I`u93z_owJT9Q~bA_+Kggkz{{QsVorEpPtGBm#5!` zS9U+^{#q^Kuhjm?r@yK8HvyLYLxg4j=MWu-`(Hz#tc*o0H&v5b%yb+WY$ue~H3xr2v6& z^zrib@g{f&{9*#Iijd!L4D<%pU+{hF@Br{z%K~eh{cE+C8?d;tmXekH@wXq~Uko=_ z$0Gh@BakrvPWr!M2XgH1v%~+S9hl{RX8+On!#4!r=C9gKu&TPM#(xq3B-@__{67oM z4?+Jr^#3Y2z|{VC#{HB1&%pr@_He;@tdxd#BzKVj{+F!uxN9nJ?3 zbP3)r0YDiCM**_;8w{MCf7F;j9tYrwF8k#s0*RIf779Os_TTgV5cYSuWzj%R{#LV` z0^rf#4CozrT9>Ws3d^YQI4;;6{r4 z{wh~M;G^3CkeZf0a2M^8%CDaX|K@nV|0m7=bgc3l8UNGqPZ|6De|7w`ZGZo-j(_(5 ztG&vv_WYEyfBwhgpXdAgzc>a$^kdua+u!!%_1pa~XTP@nr1`o3mG*Zuf8hTq?=NZo zm7G8H{j~3Qa(>eMVgEZCm0!+&+VPiie$xC&&Z(N~Ej0$0RQ|XJfgUOYa#c8(FQ~9H zUj+DnIp3!P$v?vUasNyICFOm3(3-E}&vOt+0N_2P;>3SZWna(F^I!T;seoX9P5+b+ zod2K)f%fV5_55LFi7(wiy1Hgv{bOb~VVgtU}K%AgsAPx`{@XZ8b z1+jn*gXn;7I?z!N73d&{7Wk$G(Sw*l41kNwz~>O?`{ef*AQo*6Ee+6t0|!8wz(3IU zXCN%-(7}WIf53Ja_@knwqB?w-ijIbcnwEi%fq|Zmo}Q73jfIhkm5H978gY?KXtFkG%IV11mMD%ZS#^=; z^m0j(C?F2w&*Gl=nvN}VPI>7OtZ@QMIJze)xz^bYCLx5ZQOvNzTY~tO!_G0wHs-vo z6>gqEM*4ehwi=T4`aYT_C7Dm8m!|Yq%op1-$GR=s4lQ3FI|RAivAPK@ZhfuCG;d&! zl#6mP>0Bn%h4WMC=@Tq(&MXVKzvnL6vM>!o-*Sr9txZ)>U2CgQhiG|gjb%6O$tb^H zs-~{VF2A`KYeQylv@qY$ev^8YtU$P6by3(d?#Vsx{B6)P5%}Ka{uOz{)nK-eMpFMR z?AY>&fN&8`C0zdr9qeiO#gI~evlMybR~4pnjV_Yju%@OjidvFm zxt>-hTs~m3qm*vT<-qYZrK!%(kE=r=zvkAM-aY;K*%M^P)k6v?N?B1gk6-8LG~S|Y zpX98E_?rYPWHMAlBaD{Iiajd_Y_87MOjs%j`xEam;|0FF^K-t)+WYdM!DPb1v7)>3 zl|9<4j^ZtklN<_STc2(mfefew#k#06+70Q6!WH{%UGzCQa-u5u{YQZ2;Cj_tUfSUKL6>gK2DO|GP83^cLmxM_pIV(bLpnp z=o~>Ff{<`6?+b=e1`+q%3j##E-zt*UwANn}%}0#Ro*MaNxZ=s*e!QiR$JO6BBn91w z$3{-DXlIsgT2Le^bW$(8Qz**S$q0KO@p|}p=dz3JQQ_@dj!WAisk1(pD{kIYg3tMA zvfYyV((Vo}@E*{cRd6B9Jbr0m973nWH#!ZweInQsG7$Noi+k6hDpHalnb%UXRiAocd8@!*^G&Kh zRiXFM_|(-X;i@kmeEqRUPA%O{8GS8L>O`C}=}^>qWJ@E&EOt3mAnoI5sFKMCXrmT3 z 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 H5?%ZQGE$s> literal 0 HcmV?d00001 diff --git a/examples/assets/wood-platform/model.gltf b/examples/assets/wood-platform/model.gltf new file mode 100644 index 0000000..5b1d496 --- /dev/null +++ b/examples/assets/wood-platform/model.gltf @@ -0,0 +1,142 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.1.63", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube", + "scale":[ + 10, + 0.25, + 10 + ] + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material.001", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"wood1", + "uri":"wood1.jpg" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"model.bin" + } + ] +} diff --git a/examples/assets/wood-platform/wood1.jpg b/examples/assets/wood-platform/wood1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fc7ceff2e246f57a7b9cdfb8ff38b229228d7a5 GIT binary patch literal 4257 zcmeIu%@M*N5C!0u2nGX*5Fw_U9GuCFR$&zuWfdMQ!k>$stmGI=aNe>9c*E}DlZSlZ zPt$QiQIxpk19{_sRawrROXb!^Yo&BuRcqsF=WK0l({{dTLu;+?eb~j6lH2ZwJ`P<> zQEsqCLFKgpa!1M+ENheF=zmkl3ugX1;(A^V@I?U%P=Epypa2CZKmiI+fC3btz#j^X G^85m$=@rfZ literal 0 HcmV?d00001 diff --git a/examples/assets/wood-platform/wood1OLD.jpg b/examples/assets/wood-platform/wood1OLD.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2cbb3d327b1d44f46b766b712113b47b253f34b0 GIT binary patch literal 48455 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 literal 0 HcmV?d00001 diff --git a/examples/shadows/src/main.rs b/examples/shadows/src/main.rs index 56a31c0..ec37a89 100644 --- a/examples/shadows/src/main.rs +++ b/examples/shadows/src/main.rs @@ -128,15 +128,29 @@ fn setup_scene_plugin(game: &mut Game) { platform_gltf.wait_recurse_dependencies_load(); let platform_mesh = &platform_gltf.data_ref().unwrap().scenes[0]; + let palm_tree_platform_gltf = resman + .request::("../assets/shadows-platform-palmtree.glb") + .unwrap(); + + palm_tree_platform_gltf.wait_recurse_dependencies_load(); + let palm_tree_platform_mesh = &palm_tree_platform_gltf.data_ref().unwrap().scenes[0]; + drop(resman); // cube in the air - world.spawn(( + /* world.spawn(( cube_mesh.clone(), WorldTransform::default(), Transform::from_xyz(0.0, -2.0, -5.0), )); + // cube really high in the air + world.spawn(( + cube_mesh.clone(), + WorldTransform::default(), + Transform::from_xyz(-6.0, 0.0, -5.0), + )); + // cube on the right, on the ground world.spawn(( cube_mesh.clone(), @@ -149,10 +163,19 @@ fn setup_scene_plugin(game: &mut Game) { WorldTransform::default(), //Transform::from_xyz(0.0, -5.0, -5.0), Transform::new(math::vec3(0.0, -5.0, -5.0), math::Quat::IDENTITY, math::vec3(5.0, 1.0, 5.0)), + )); */ + + world.spawn(( + palm_tree_platform_mesh.clone(), + WorldTransform::default(), + Transform::from_xyz(5.0, -15.0, 0.0), + //Transform::new(math::vec3(0.0, -5.0, -5.0), math::Quat::IDENTITY, math::vec3(5.0, 1.0, 5.0)), )); + //shadows-platform-palmtree.glb + { - let mut light_tran = Transform::from_xyz(0.0, 2.5, 0.0); + let mut light_tran = Transform::from_xyz(0.0, 0.0, 0.0); light_tran.scale = Vec3::new(0.5, 0.5, 0.5); light_tran.rotate_x(math::Angle::Degrees(-45.0)); light_tran.rotate_y(math::Angle::Degrees(-35.0)); @@ -192,7 +215,9 @@ fn setup_scene_plugin(game: &mut Game) { } let mut camera = CameraComponent::new_3d(); - camera.transform.translation += math::Vec3::new(0.0, 2.0, 10.5); - camera.transform.rotate_x(math::Angle::Degrees(-17.0)); + //camera.transform.translation += math::Vec3::new(0.0, 2.0, 10.5); + camera.transform.translation = math::Vec3::new(-3.0, -8.0, -3.0); + camera.transform.rotate_x(math::Angle::Degrees(-27.0)); + camera.transform.rotate_y(math::Angle::Degrees(-55.0)); world.spawn((camera, FreeFlyCamera::default())); } \ No newline at end of file diff --git a/lyra-game/src/render/graph/node.rs b/lyra-game/src/render/graph/node.rs index f0cdcfe..7a39a4b 100644 --- a/lyra-game/src/render/graph/node.rs +++ b/lyra-game/src/render/graph/node.rs @@ -63,6 +63,14 @@ pub enum SlotValue { } impl SlotValue { + pub fn is_none(&self) -> bool { + matches!(self, Self::None) + } + + pub fn is_lazy(&self) -> bool { + matches!(self, Self::Lazy) + } + pub fn as_texture_view(&self) -> Option<&Arc> { bind_match!(self, Self::TextureView(v) => v) } diff --git a/lyra-game/src/render/graph/passes/meshes.rs b/lyra-game/src/render/graph/passes/meshes.rs index 99d127d..73edf51 100644 --- a/lyra-game/src/render/graph/passes/meshes.rs +++ b/lyra-game/src/render/graph/passes/meshes.rs @@ -115,6 +115,11 @@ impl Node for MeshPass { .expect("missing ShadowMapsPassSlots::ShadowAtlasSampler") .as_sampler() .unwrap(); + let atlas_sampler_compare = graph + .slot_value(ShadowMapsPassSlots::ShadowAtlasSamplerComparison) + .expect("missing ShadowMapsPassSlots::ShadowAtlasSamplerComparison") + .as_sampler() + .unwrap(); let shadow_settings_buf = graph .slot_value(ShadowMapsPassSlots::ShadowSettingsUniform) .expect("missing ShadowMapsPassSlots::ShadowSettingsUniform") @@ -130,6 +135,11 @@ impl Node for MeshPass { .expect("missing ShadowMapsPassSlots::PcfPoissonDiscBuffer") .as_buffer() .unwrap(); + let pcss_poisson_disc = graph + .slot_value(ShadowMapsPassSlots::PcssPoissonDiscBuffer) + .expect("missing ShadowMapsPassSlots::PcssPoissonDiscBuffer") + .as_buffer() + .unwrap(); let atlas_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: Some("bgl_shadows_atlas"), @@ -147,11 +157,17 @@ impl Node for MeshPass { wgpu::BindGroupLayoutEntry { binding: 1, visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Comparison), + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), count: None, }, wgpu::BindGroupLayoutEntry { binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Comparison), + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 3, visibility: wgpu::ShaderStages::VERTEX_FRAGMENT, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, @@ -161,7 +177,7 @@ impl Node for MeshPass { count: None, }, wgpu::BindGroupLayoutEntry { - binding: 3, + binding: 4, visibility: wgpu::ShaderStages::VERTEX_FRAGMENT, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Storage { read_only: true }, @@ -171,7 +187,17 @@ impl Node for MeshPass { count: None, }, wgpu::BindGroupLayoutEntry { - binding: 4, + binding: 5, + visibility: wgpu::ShaderStages::VERTEX_FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 6, visibility: wgpu::ShaderStages::VERTEX_FRAGMENT, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Storage { read_only: true }, @@ -197,6 +223,10 @@ impl Node for MeshPass { }, wgpu::BindGroupEntry { binding: 2, + resource: wgpu::BindingResource::Sampler(atlas_sampler_compare), + }, + wgpu::BindGroupEntry { + binding: 3, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { buffer: shadow_settings_buf, offset: 0, @@ -204,7 +234,7 @@ impl Node for MeshPass { }), }, wgpu::BindGroupEntry { - binding: 3, + binding: 4, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { buffer: light_uniform_buf, offset: 0, @@ -212,13 +242,21 @@ impl Node for MeshPass { }), }, wgpu::BindGroupEntry { - binding: 4, + binding: 5, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { buffer: pcf_poisson_disc, offset: 0, size: None, }), }, + wgpu::BindGroupEntry { + binding: 6, + resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { + buffer: pcss_poisson_disc, + offset: 0, + size: None, + }), + }, ], }); diff --git a/lyra-game/src/render/graph/passes/shadows.rs b/lyra-game/src/render/graph/passes/shadows.rs index b9b418f..e4e1b61 100644 --- a/lyra-game/src/render/graph/passes/shadows.rs +++ b/lyra-game/src/render/graph/passes/shadows.rs @@ -3,6 +3,7 @@ use std::{ }; use fast_poisson::Poisson2D; +use glam::Vec2; use itertools::Itertools; use lyra_ecs::{ query::{filter::Has, Entities}, @@ -25,18 +26,19 @@ use crate::render::{ use super::{MeshBufferStorage, RenderAssets, RenderMeshes}; -const PCF_SAMPLES_NUM: u32 = 6; -const SHADOW_SIZE: glam::UVec2 = glam::uvec2(1024, 1024); +const SHADOW_SIZE: glam::UVec2 = glam::uvec2(4096, 4096); #[derive(Debug, Clone, Hash, PartialEq, RenderGraphLabel)] pub enum ShadowMapsPassSlots { ShadowAtlasTexture, ShadowAtlasTextureView, ShadowAtlasSampler, + ShadowAtlasSamplerComparison, ShadowAtlasSizeBuffer, ShadowLightUniformsBuffer, ShadowSettingsUniform, PcfPoissonDiscBuffer, + PcssPoissonDiscBuffer, } #[derive(Debug, Clone, Hash, PartialEq, RenderGraphLabel)] @@ -74,6 +76,7 @@ pub struct ShadowMapsPass { atlas: LightShadowMapAtlas, /// The depth map atlas sampler atlas_sampler: Rc, + atlas_sampler_compare: Rc, } impl ShadowMapsPass { @@ -98,7 +101,7 @@ impl ShadowMapsPass { device, wgpu::TextureFormat::Depth32Float, wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING, - SHADOW_SIZE * 8, + SHADOW_SIZE * 2, ); let atlas_size_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -107,16 +110,28 @@ impl ShadowMapsPass { contents: bytemuck::bytes_of(&atlas.atlas_size()), }); + let sampler_compare = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some("compare_sampler_shadow_map_atlas"), + address_mode_u: wgpu::AddressMode::ClampToBorder, + address_mode_v: wgpu::AddressMode::ClampToBorder, + address_mode_w: wgpu::AddressMode::ClampToBorder, + mag_filter: wgpu::FilterMode::Nearest, + min_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, + border_color: Some(wgpu::SamplerBorderColor::OpaqueWhite), + compare: Some(wgpu::CompareFunction::LessEqual), + ..Default::default() + }); + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { label: Some("sampler_shadow_map_atlas"), address_mode_u: wgpu::AddressMode::ClampToBorder, address_mode_v: wgpu::AddressMode::ClampToBorder, address_mode_w: wgpu::AddressMode::ClampToBorder, - mag_filter: wgpu::FilterMode::Linear, - min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, + mag_filter: wgpu::FilterMode::Nearest, + min_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, border_color: Some(wgpu::SamplerBorderColor::OpaqueWhite), - compare: Some(wgpu::CompareFunction::LessEqual), ..Default::default() }); @@ -155,6 +170,7 @@ impl ShadowMapsPass { point_light_pipeline: None, atlas_sampler: Rc::new(sampler), + atlas_sampler_compare: Rc::new(sampler_compare), atlas: LightShadowMapAtlas(Arc::new(RwLock::new(atlas))), } } @@ -183,6 +199,14 @@ impl ShadowMapsPass { let projection = glam::Mat4::orthographic_rh(-10.0, 10.0, -10.0, 10.0, NEAR_PLANE, FAR_PLANE); + + // honestly no clue why this works, but I got it from here and the results are good + // https://github.com/asylum2010/Asylum_Tutorials/blob/423e5edfaee7b5ea450a450e65f2eabf641b2482/ShaderTutors/43_ShadowMapFiltering/main.cpp#L323 + let frustum_size = Vec2::new(0.5 * projection.col(0).x, 0.5 * projection.col(1).y); + // maybe its better to make this a vec2 on the gpu? + let size_avg = (frustum_size.x + frustum_size.y) / 2.0; + let light_size_uv = 0.2 * size_avg; + let look_view = glam::Mat4::look_to_rh( light_pos.translation, light_pos.forward(), @@ -196,7 +220,8 @@ impl ShadowMapsPass { atlas_frame, near_plane: NEAR_PLANE, far_plane, - _padding1: [0; 2], + light_size_uv, + _padding1: 0, light_pos: light_pos.translation, _padding2: 0, }; @@ -284,7 +309,8 @@ impl ShadowMapsPass { atlas_frame: frames[i], near_plane: NEAR_PLANE, far_plane, - _padding1: [0; 2], + light_size_uv: 0.0, + _padding1: 0, light_pos: light_trans, _padding2: 0, }, @@ -322,26 +348,29 @@ impl ShadowMapsPass { fn create_poisson_disc_buffer(&self, device: &wgpu::Device, label: &str, num_samples: u32) -> wgpu::Buffer { device.create_buffer(&wgpu::BufferDescriptor { label: Some(label), - size: mem::size_of::() as u64 * (num_samples.pow(2)) as u64, + size: mem::size_of::() as u64 * (num_samples * 2) as u64, usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST, mapped_at_creation: false, }) } /// Generate and write a Poisson disc to `buffer` with `num_pcf_samples.pow(2)` amount of points. - fn write_poisson_disc(&self, queue: &wgpu::Queue, buffer: &wgpu::Buffer, num_pcf_samples: u32) { - let num_points = num_pcf_samples.pow(2); - let num_floats = num_points * 2; // points are vec2f + fn write_poisson_disc(&self, queue: &wgpu::Queue, buffer: &wgpu::Buffer, num_samples: u32) { + //let num_points = num_samples.pow(2); + let num_floats = num_samples * 2; // points are vec2f let min_dist = (num_floats as f32).sqrt() / num_floats as f32; + //let min_dist = (num_samples as f32).sqrt() / num_samples as f32; let mut points = vec![]; // use a while loop to ensure that the correct number of floats is created while points.len() < num_floats as usize { let poisson = Poisson2D::new() .with_dimensions([1.0, 1.0], min_dist) - .with_samples(num_pcf_samples); + .with_samples(num_samples); - points = poisson.iter().flatten().collect_vec(); + points = poisson.iter().flatten() + .map(|p| p * 2.0 - 1.0) + .collect_vec(); } points.truncate(num_floats as _); @@ -377,6 +406,12 @@ impl Node for ShadowMapsPass { Some(SlotValue::Sampler(self.atlas_sampler.clone())), ); + node.add_sampler_slot( + ShadowMapsPassSlots::ShadowAtlasSamplerComparison, + SlotAttribute::Output, + Some(SlotValue::Sampler(self.atlas_sampler_compare.clone())), + ); + node.add_buffer_slot( ShadowMapsPassSlots::ShadowLightUniformsBuffer, SlotAttribute::Output, @@ -404,11 +439,20 @@ impl Node for ShadowMapsPass { Some(SlotValue::Buffer(Arc::new(settings_buffer))), ); + let def_settings = ShadowSettings::default(); node.add_buffer_slot( ShadowMapsPassSlots::PcfPoissonDiscBuffer, SlotAttribute::Output, Some(SlotValue::Buffer(Arc::new( - self.create_poisson_disc_buffer(device, "buffer_poisson_disc_pcf", PCF_SAMPLES_NUM), + self.create_poisson_disc_buffer(device, "buffer_poisson_disc_pcf", def_settings.pcf_samples_num), + ))), + ); + + node.add_buffer_slot( + ShadowMapsPassSlots::PcssPoissonDiscBuffer, + SlotAttribute::Output, + Some(SlotValue::Buffer(Arc::new( + self.create_poisson_disc_buffer(device, "buffer_poisson_disc_pcss", def_settings.pcss_blocker_search_samples), ))), ); @@ -424,9 +468,14 @@ impl Node for ShadowMapsPass { { // TODO: Update the poisson disc every time the PCF sampling point number changed if !world.has_resource::() { + let def_settings = ShadowSettings::default(); let buffer = graph.slot_value(ShadowMapsPassSlots::PcfPoissonDiscBuffer) .unwrap().as_buffer().unwrap(); - self.write_poisson_disc(&context.queue, &buffer, ShadowSettings::default().pcf_samples_num); + self.write_poisson_disc(&context.queue, &buffer, def_settings.pcf_samples_num); + + let buffer = graph.slot_value(ShadowMapsPassSlots::PcssPoissonDiscBuffer) + .unwrap().as_buffer().unwrap(); + self.write_poisson_disc(&context.queue, &buffer, def_settings.pcss_blocker_search_samples); } // TODO: only write buffer on changes to resource @@ -717,7 +766,9 @@ pub struct LightShadowUniform { atlas_frame: AtlasFrame, // 2xUVec2 (4xf32), so no padding needed near_plane: f32, far_plane: f32, - _padding1: [u32; 2], + /// Light size in UV space (light_size / frustum_size) + light_size_uv: f32, + _padding1: u32, light_pos: glam::Vec3, _padding2: u32, } @@ -758,13 +809,22 @@ impl LightShadowMapAtlas { #[derive(Debug, Copy, Clone)] pub struct ShadowSettings { + /// How many PCF filtering samples are used per dimension. + /// + /// A value of 16 is common. pub pcf_samples_num: u32, + /// How many samples are used for the PCSS blocker search step. + /// + /// Multiple samples are required to avoid holes int he penumbra due to missing blockers. + /// A value of 16 is common. + pub pcss_blocker_search_samples: u32, } impl Default for ShadowSettings { fn default() -> Self { Self { - pcf_samples_num: PCF_SAMPLES_NUM, + pcf_samples_num: 64, + pcss_blocker_search_samples: 36, } } } @@ -774,12 +834,14 @@ impl Default for ShadowSettings { #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] struct ShadowSettingsUniform { pcf_samples_num: u32, + pcss_blocker_search_samples: u32, } impl From for ShadowSettingsUniform { fn from(value: ShadowSettings) -> Self { Self { pcf_samples_num: value.pcf_samples_num, + pcss_blocker_search_samples: value.pcss_blocker_search_samples, } } } diff --git a/lyra-game/src/render/shaders/base.wgsl b/lyra-game/src/render/shaders/base.wgsl index 0e026f2..3d8a627 100755 --- a/lyra-game/src/render/shaders/base.wgsl +++ b/lyra-game/src/render/shaders/base.wgsl @@ -117,11 +117,13 @@ struct LightShadowMapUniform { atlas_frame: TextureAtlasFrame, near_plane: f32, far_plane: f32, + light_size_uv: f32, light_pos: vec3, } struct ShadowSettingsUniform { pcf_samples_num: u32, + pcss_blocker_search_samples: u32, } @group(4) @binding(0) @@ -132,13 +134,17 @@ var t_light_grid: texture_storage_2d; // rg32uint = vec2 u_shadow_settings: ShadowSettingsUniform; +var s_shadow_maps_atlas_compare: sampler_comparison; @group(5) @binding(3) -var u_light_shadow: array; +var u_shadow_settings: ShadowSettingsUniform; @group(5) @binding(4) +var u_light_shadow: array; +@group(5) @binding(5) var u_pcf_poisson_disc: array>; +@group(5) @binding(6) +var u_pcss_poisson_disc: array>; @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { @@ -185,8 +191,12 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4 { return vec4(light_object_res, object_color.a); } -/// Get the cube map side index of a 3d texture coord +/// Convert 3d coords for an unwrapped cubemap to 2d coords and a side index of the cube map. /// +/// The `xy` components are the 2d coordinates in the side of the cube, and `z` is the cube +/// map side index. +/// +/// Cube map index results: /// 0 -> UNKNOWN /// 1 -> right /// 2 -> left @@ -194,7 +204,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4 { /// 4 -> bottom /// 5 -> near /// 6 -> far -fn get_side_idx(tex_coord: vec3) -> vec3 { +fn coords_to_cube_atlas(tex_coord: vec3) -> vec3 { let abs_x = abs(tex_coord.x); let abs_y = abs(tex_coord.y); let abs_z = abs(tex_coord.z); @@ -234,14 +244,7 @@ fn get_side_idx(tex_coord: vec3) -> vec3 { } res = (res / abs(major_axis) + 1.0) * 0.5; - //res = normalize(res); - //res.y = 1.0-res.y; // invert y because wgsl - //let t = res.x; - //res.x = res.y; - - //res.y = 1.0 - t; res.y = 1.0 - res.y; - //res.x = 1.0 - res.x; return vec3(res, f32(cube_idx)); } @@ -264,10 +267,11 @@ fn calc_shadow_dir_light(normal: vec3, light_dir: vec3, frag_pos_light ); // use a bias to avoid shadow acne - let bias = max(0.05 * (1.0 - dot(normal, light_dir)), 0.005); + let bias = 0.005;//max(0.05 * (1.0 - dot(normal, light_dir)), 0.005); let current_depth = proj_coords.z - bias; - var shadow = pcf_dir_light(region_coords, current_depth, shadow_u); + //var shadow = pcf_dir_light(region_coords, current_depth, shadow_u, 1.0); + var shadow = pcss_dir_light(xy_remapped, current_depth, shadow_u); // dont cast shadows outside the light's far plane if (proj_coords.z > 1.0) { @@ -282,35 +286,87 @@ fn calc_shadow_dir_light(normal: vec3, light_dir: vec3, frag_pos_light return shadow; } -/// Calculate the shadow coefficient using PCF of a directional light -fn pcf_dir_light(tex_coords: vec2, test_depth: f32, shadow_u: LightShadowMapUniform) -> f32 { - let half_filter_size = f32(u_shadow_settings.pcf_samples_num) / 2.0; - let texel_size = 1.0 / vec2(f32(shadow_u.atlas_frame.width), f32(shadow_u.atlas_frame.height)); +// Comes from https://developer.download.nvidia.com/whitepapers/2008/PCSS_Integration.pdf +fn search_width(light_near: f32, uv_light_size: f32, receiver_depth: f32) -> f32 { + return uv_light_size * (receiver_depth - light_near) / receiver_depth; +} - // Sample PCF - var shadow = 0.0; - var i = 0; - for (var x = -half_filter_size; x <= half_filter_size; x += 1.0) { - for (var y = -half_filter_size; y <= half_filter_size; y += 1.0) { - //let random = u_pcf_poisson_disc[i] * texel_size; - let offset = tex_coords + (u_pcf_poisson_disc[i] + vec2(x, y)) * texel_size; - - let pcf_depth = textureSampleCompare(t_shadow_maps_atlas, s_shadow_maps_atlas, offset, test_depth); - shadow += pcf_depth; +/// Convert texture coords to be texture coords of an atlas frame. +fn to_atlas_frame_coords(shadow_u: LightShadowMapUniform, coords: vec2) -> vec2 { + let atlas_dimensions = textureDimensions(t_shadow_maps_atlas); + + // get the rect of the frame as a vec4 + var region_rect = vec4(f32(shadow_u.atlas_frame.x), f32(shadow_u.atlas_frame.y), f32(shadow_u.atlas_frame.width), f32(shadow_u.atlas_frame.height)); + // put the frame rect in atlas UV space + region_rect /= f32(atlas_dimensions.x); + + // lerp input coords + let region_coords = vec2( + mix(region_rect.x, region_rect.x + region_rect.z, coords.x), + mix(region_rect.y, region_rect.y + region_rect.w, coords.y) + ); + + return region_coords; +} - i++; +/// Find the average blocker distance for a directiona llight +fn find_blocker_distance_dir_light(tex_coords: vec2, receiver_depth: f32, bias: f32, shadow_u: LightShadowMapUniform) -> vec2 { + let search_width = search_width(shadow_u.near_plane, shadow_u.light_size_uv, receiver_depth); + + var blockers = 0; + var avg_dist = 0.0; + let samples = i32(u_shadow_settings.pcss_blocker_search_samples); + for (var i = 0; i < samples; i++) { + let offset_coords = tex_coords + u_pcss_poisson_disc[i] * search_width; + let new_coords = to_atlas_frame_coords(shadow_u, offset_coords); + let z = textureSampleLevel(t_shadow_maps_atlas, s_shadow_maps_atlas, new_coords, 0.0); + + if z < (receiver_depth - bias) { + blockers += 1; + avg_dist += z; } } - shadow /= pow(f32(u_shadow_settings.pcf_samples_num), 2.0); - // ensure the shadow value does not go above 1.0 - shadow = min(shadow, 1.0); - return shadow; + let b = f32(blockers); + return vec2(avg_dist / b, b); +} + +fn pcss_dir_light(tex_coords: vec2, receiver_depth: f32, shadow_u: LightShadowMapUniform) -> f32 { + let blocker_search = find_blocker_distance_dir_light(tex_coords, receiver_depth, 0.0, shadow_u); + + // If no blockers were found, exit now to save in filtering + if blocker_search.y == 0.0 { + return 1.0; + } + let blocker_depth = blocker_search.x; + + // penumbra estimation + let penumbra_width = (receiver_depth - blocker_depth) / blocker_depth; + + // PCF + let uv_radius = penumbra_width * shadow_u.light_size_uv * shadow_u.near_plane / receiver_depth; + return pcf_dir_light(tex_coords, receiver_depth, shadow_u, uv_radius); +} + +/// Calculate the shadow coefficient using PCF of a directional light +fn pcf_dir_light(tex_coords: vec2, test_depth: f32, shadow_u: LightShadowMapUniform, uv_radius: f32) -> f32 { + var shadow = 0.0; + let samples_num = i32(u_shadow_settings.pcf_samples_num); + for (var i = 0; i < samples_num; i++) { + let offset = tex_coords + u_pcf_poisson_disc[i] * uv_radius; + let new_coords = to_atlas_frame_coords(shadow_u, offset); + + shadow += textureSampleCompare(t_shadow_maps_atlas, s_shadow_maps_atlas_compare, new_coords, test_depth); + } + shadow /= f32(samples_num); + + // clamp shadow to [0; 1] + return saturate(shadow); } fn calc_shadow_point(world_pos: vec3, world_normal: vec3, light_dir: vec3, light: Light, atlas_dimensions: vec2) -> f32 { var frag_to_light = world_pos - light.position; - let temp = get_side_idx(normalize(frag_to_light)); + let temp = coords_to_cube_atlas(normalize(frag_to_light)); var coords_2d = temp.xy; let cube_idx = i32(temp.z); @@ -342,7 +398,7 @@ fn calc_shadow_point(world_pos: vec3, world_normal: vec3, light_dir: v var current_depth = length(frag_to_light) - bias; current_depth /= u.far_plane; - var shadow = textureSampleCompare(t_shadow_maps_atlas, s_shadow_maps_atlas, coords_2d, current_depth); + var shadow = textureSampleCompare(t_shadow_maps_atlas, s_shadow_maps_atlas_compare, coords_2d, current_depth); return shadow; }