From 77a5829fc914eeac5bd5f44e1d2decca1a8cef77 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Sat, 7 Jan 2023 17:45:49 +0800 Subject: [PATCH] Shadows WIP --- Assets/Application.SHConfig | 2 +- Assets/Shaders/DeferredComposite_CS.glsl | 3 +++ Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 5501 -> 5749 bytes .../GlobalData/SHGraphicsPredefinedData.cpp | 2 +- .../GlobalData/SHPredefinedDescriptorTypes.h | 2 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 7 +++++-- .../MiddleEnd/Interface/SHRenderer.cpp | 5 +++++ .../Graphics/MiddleEnd/Interface/SHRenderer.h | 1 + .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 19 ++++++++++-------- .../MiddleEnd/Lights/SHLightingSubSystem.h | 5 +++++ .../Graphics/Pipeline/SHVkPipelineLayout.cpp | 2 ++ 11 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Assets/Application.SHConfig b/Assets/Application.SHConfig index 5673556d..370665d2 100644 --- a/Assets/Application.SHConfig +++ b/Assets/Application.SHConfig @@ -1,4 +1,4 @@ Start in Fullscreen: false -Starting Scene ID: 97158628 +Starting Scene ID: 86098106 Window Size: {x: 1920, y: 1080} Window Title: SHADE Engine \ No newline at end of file diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index 0a8085b1..e73ea9eb 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -6,6 +6,7 @@ struct DirectionalLightStruct uint isActive; uint cullingMask; vec4 diffuseColor; + mat4 pvMatrix; }; struct AmbientLightStruct @@ -24,6 +25,8 @@ layout(set = 3, binding = 3, r32ui) uniform uimage2D lightLayerData; layout(set = 3, binding = 4, r8) uniform image2D ssaoBlurredImage; layout(set = 3, binding = 5, rgba8) uniform image2D targetImage; +layout (set = 4, binding = 0) uniform sampler2D shadowMaps[]; // for textures (global) + layout(set = 1, binding = 0) uniform LightCounts { uint directionalLights; diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index cabce080c7257a3946de1cbe9f94d151884ade21..df956040e255167463b8ea8206fcc2b8074e10fb 100644 GIT binary patch literal 5749 zcmZve`*&Sc5ywxPXK4$q6sXYFl=uL_Qjr3swwN}MMpF`OtxpUm$!&7mn|tHEH*JHc zMFqqMzEJT^u|7dW@rlpnFaAfq)^aUBpL6!4hc0&4bY{LYduI0R*(Z0XadlR#p0&dR zS+*v-EZdmw0 zKV8#ru;N#5&Ni0kst$d4RP*jQf#=CJ9>lFKLL2uOO7rGPqO08Yyxb+p-Xx`1s9DBh}wDb8xtwsx1 z_V;A_;q^l9%kG6w80%1Lx!LVd?O=fcXQ{2NX5J`Vtg)Ye?(y!ITJ>f(SpxUII!mp9 z@g6Aroq~LEre0g!QPy`Dyf{nBZ{MfDM$0Q*&3&}nUY_li`L(-N>q9obxOLS#BWW5g z;?_00++bYhkK~yIq?bU(DxgK-l`S=i%MFJzwjVu-ISqU&!ZLXO84c4C@#%{l2V+ zwn6H?&Fdl068cVL&#XQSuiDkMyR`cjt9EtmYm(h}ShcHbH{W4u^zFEe>k7>MV$NJ( z)+9Dq!Hgre0U9H!@$|Dc-;%kb7IkyGj2Z97{jR_ww=n~Y+?y&`sp3Aze*V%N%{=ni~aR&Y3Tw9RC z&phtk3YqUQxb+P|`otVZeCrc)pZ?BswLW$0vlrSgBzyR)SMAQS`@^oT-M+g2Wwy$><%L+H+!n56$@1ngZ<#PVlGnb$L}EABzNv8u~jJ+t}kh08lLzq)VR zWsdD|W9VDC6~U& zRQDUpz`j^Qh0lJ+nOu|C7iuXQz;jZ!KZ>$JiRkp7?!;xw%+(Pw_p_ zX1$NYAA`*I8MyJptXJK)AH8}y$=2h1JPTJgUv=s4dokt@l0jc%s$WQ$x^wRL!R5TX z0Jm0ScqZe&1ZCN|yVbS*9@+$j{s&}haDIHhFGKoB+N|}D@K>ufYQK(N{0SfZwvp%0 zaCP^4j=#WN;?}M1cgl4;UpDJ?R$SiCzd`)o>Fc*>9pqiA`+e}Yc2ys`M8Bb;`z~*( z=`VJKN-iv+=GM~2NQ0#plvi5(Z9=#vgc;e5cT0Vd* zeh2g~di5c=%eu6E5E8R4<*4Jsg} zjjvA)5)1tVvUBnjb#H;sL;8qspci5bka6|93)08feh0Kg?e#(~Yd?kDfTDJ7CkuP| z`(rWLV~(5XVv@^zYawG>LklwBR66TY!o;OVso(Q`1TvQPIAa^xw;VnlWc|d$r;F@7 zKa%1sBa7)9vo7ZR#=Xha55m1idGz9RA!pe+;yK@EA+a-%@q900)%P-zY%2vXZ4V(E zTkczW82&NH<=&6OwaX*-CyRb9Oy7}WReGd5v$l29)5{kW_N7f#1=?lol6OXs_B(iwCr7t17tV`P$ zAu;PxHny|yWypJvzI+8a>T*863PoMo;%#k5ek$2xKEIYQaaYV|%+%Mx%%@-E`v!94 zdm8zhP~_8g2GVy6{9BOrnD1{VOk9dQ-$6E)_BiKvk@rF|yWc|=(>G>U%z24E$<>`D z`zDXNzmII)F}u$oi&?Mnv^@j4-??AgOOET&(aSxo<}@Sj7^Cw)Eq7tls%l5gA#@D~#% z?(%+pKi2V0q82dvDV9;%rD(+AhIo1bG-*$%~Ho zR_Ic2v2CTSUilBPcO&v&Ni>^7g|=d(C_ql{&}E+FI?!nbI`dIo@sLgQDA+ zoi6R8*$((>aiZCtE{+^o>yzDm!`YkQd3&k3+*KdVCeT;A{ld+Mi{|5~;3L^&4euxH zT6m}1Tgls%r}3^^$NJ^I8`0ZE>*!!EKiTY6Id1tMY&sw0RgQh&M|yedK)2n+mHk86 zUGSomN3#3ibH+N*UF!_`R6AZ`z*%Z*x0AO^7i%2lpL@Lf)o#%lBun7lSAVq|Fy3RO zzf+K}EEUc59aVh?!OOFx{PukwY`VJA_1uRBy|u=m%CFtEULUgg#jUI8Po-%%k6Tw` zt zS74Fbn1MxZzpsHs?g=pSEx<=1Ki>MpoJV}?6LX*b&U?K+b?Y;~`<*9O><=vJi(2%H z`nDs7U(|OcnE9T8Ti*nv&uO?T;#;3s)aMM=>r=Nr@5Fd#lRf;^>vreQ{b5(vJ_5P_ zb-1(mM(8q5;2Cz~t-tc+_(Z)M(08EoV_IU`C(y^?Vv_zBl{kM``Ws)&nEHFC#uC3X z>As1Ge+jZV^}m9@_HzOnF10MXfezctI};`@ndd!lYx54=C*KdbcA?z|H+G%eHv?w9 z+O1FB_b#S=Hp%YW4mt-np5Fj#iFo#ZCpWwR*R~7UH>+-(_rr}TW*&9ltyt9ifu!sI zNRrK=z6AGt_9OfY09o(T$>#p^H4l|mn##BF>Fm-3zx9)N_UV&SyF+7v;UxTvj)ZOaZ z{sdhLh5lz`Yj9S4tFJ@)NZM}WD`Gt7&1L`o3F5cK8vHJ7g6y@rZ*|87`osnLwKd&0 za$`+*|Gt{;oce#kdVK$%68aKyqo(VBqNZyO`7L@9-Co-dv4=R-D12MO zVC&c$5@xR!@H78qkiOdX(;539W*)ygZ-)HlsOx_fq|Xxjox5F-KH~Fq(%F3rBrdtk zXa9|FU$q-=H~boCGU>*DD^!pFHgtW&BmUcw#U)og{sg-Ai2n}c>ymE#>!Eu58_@L; zkNEFI7MEQ0_};sAFAhPzqr5=3<*?8jT zQY{}w7QY?(2mSdd++|(bJ_3nZmvYqc@lvkpcm#P7iaNB#`JLTIA?;h}pn48@|MuWf z$b0eaiW^^_Wk@XaCbDz#Jaun}AA$4{-$F0MT99$|^Y=_2V>jU1qV}VuT-AOI`7tPJ z*H)DF>i+`mWRE#sK^K!;=JOpI+ZsBM`4-Yyy9pDQo}qrvw+b0cdz|qT$iC(9=^^VU z9zK0!=lQ7=XMilGZ_K)w^BeajS9i9(M|t#Ot(3Fu6!Dzz$04!fP`nqh`g@s5wi6|< zY$uV8E%z;b68_v z()JuAW?jm0r(Z+%-lH#HM~=FVA%6pky0pdH+KK$lWRLlLK4Idnn9rE07r@M?U*vlc zIr6=P{4FT*X>%6z-46dYq&?>QI|&n)BF}e`&80og`90))P|WW4k;U|l*%fnMqEB*l zXUV?FqwXIdTX)Rv50S-UcD0GQ|0LY~&V~D5hW{8kn{An6ESxmn;vzY!@!hZ#wOZsN`uc58bJm0ui;J-a JAEMj={TD+43N`=$ diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp index ca68c709..d5f744fb 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp @@ -158,7 +158,7 @@ namespace SHADE .Type = vk::DescriptorType::eCombinedImageSampler, .Stage = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment | vk::ShaderStageFlagBits::eCompute, .BindPoint = SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA, - .DescriptorCount = 200, // we can have up to 2000 textures for now + .DescriptorCount = 200, // we can have up to 200 textures for now .flags = vk::DescriptorBindingFlagBits::eVariableDescriptorCount, }; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHPredefinedDescriptorTypes.h b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHPredefinedDescriptorTypes.h index 931101f4..fc7f6a1b 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHPredefinedDescriptorTypes.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHPredefinedDescriptorTypes.h @@ -13,7 +13,7 @@ namespace SHADE CAMERA, MATERIALS, FONT, - RENDER_GRAPH_RESOURCE, RENDER_GRAPH_NODE_COMPUTE_RESOURCE, + RENDER_GRAPH_RESOURCE, }; } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 81d8b88e..57c83e10 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -127,7 +127,10 @@ namespace SHADE SHFreetypeInstance::Init(); - SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_VS.glsl", false); + SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); + SHAssetManager::CompileAsset("../../Assets/Shaders/SSAO_CS.glsl", false); + SHAssetManager::CompileAsset("../../Assets/Shaders/SSAOBlur_CS.glsl", false); + SHAssetManager::CompileAsset("../../Assets/Shaders/PureCopy_CS.glsl", false); // Load Built In Shaders static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); @@ -288,7 +291,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* DEFERRED COMPOSITE SUBPASS INIT */ /*-----------------------------------------------------------------------*/ - auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute("Deferred Composite", deferredCompositeShader, { "Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Scene" }); + auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute("Deferred Composite", deferredCompositeShader, { "Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Scene" }, {}/*SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::SHADOW)[0]*/); deferredCompositeCompute->AddPreComputeFunction([=](Handle cmdBuffer, uint32_t frameIndex) { lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.cpp index f1d4dc7f..731489fb 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.cpp @@ -122,4 +122,9 @@ namespace SHADE return cameraDirector; } + SHShaderCameraData SHRenderer::GetCPUCameraData(void) const noexcept + { + return cpuCameraData; + } + } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.h index a17ab1a9..867851ee 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHRenderer.h @@ -93,6 +93,7 @@ namespace SHADE /* Setters and Getters */ /*-----------------------------------------------------------------------------*/ Handle GetCameraDirector (void) const noexcept; + SHShaderCameraData GetCPUCameraData (void) const noexcept; private: /*-----------------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index e16242cb..88dc0f48 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -56,6 +56,11 @@ namespace SHADE //lightPtr->direction = lightData.direction; lightPtr->diffuseColor = lightData.color; lightPtr->active = lightComp->isActive; + + // write view projection matrix if renderer is available + auto lightRenderer = lightComp->GetRenderer(); + if (lightRenderer) + lightPtr->pvMatrix = lightRenderer->GetCPUCameraData().viewProjectionMatrix; break; } case SH_LIGHT_TYPE::POINT: @@ -499,6 +504,12 @@ namespace SHADE for (auto& light : lightComps) { + if (auto renderer = light.GetRenderer()) + { + //SHMatrix orthoMatrix = SHMatrix::OrthographicRH() + renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(12.0f, 12.0f, 0.1f, 20.0f)); + } + auto enumValue = SHUtilities::ConvertEnum(light.GetLightData().type); // First we want to make sure the light is already bound to the system. if it @@ -520,14 +531,6 @@ namespace SHADE // Light is now updated in the container //light.ClearDirtyFlag(); } - - - if (auto renderer = light.GetRenderer()) - { - //SHMatrix orthoMatrix = SHMatrix::OrthographicRH() - renderer->UpdateDataManual (frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(12.0f, 12.0f, 0.1f, 20.0f)); - - } } // Write data to GPU diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h index 320c18b7..d1b9e003 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h @@ -3,12 +3,14 @@ #include "Resource/SHHandle.h" #include "Math/Vector/SHVec3.h" #include "Math/Vector/SHVec4.h" +#include "Math/SHMatrix.h" #include "SHLightData.h" #include #include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h" #include "Graphics/RenderGraph/SHRenderGraphResource.h" #include "ECS_Base/SHECSMacros.h" + namespace SHADE { class SHVkLogicalDevice; @@ -39,6 +41,9 @@ namespace SHADE //! Diffuse color emitted by the light alignas (16) SHVec4 diffuseColor; + //! Matrix for world to projection from light's perspective + SHMatrix pvMatrix; + }; // Represents how the data will be interpreted in GPU. we want to copy to a container of these before passing to GPU. diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp index 325b3f56..d9ff07dd 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp @@ -208,7 +208,9 @@ namespace SHADE newBinding.flags = vk::DescriptorBindingFlagBits::eVariableDescriptorCount; } else + { SHLOG_ERROR("Variable size binding is detected, but the binding is not the last binding of the set and is therefore invalid. "); + } } setsWithBindings[CURRENT_SET].emplace_back(newBinding);