From cb9223db0bc3f636650542ee3c12c38d50f69573 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 9 Jan 2023 11:06:10 +0800 Subject: [PATCH] Enabled partially bound bit for descriptor sets with variable size - Shadow maps can be sampled from compute shaders --- Assets/Shaders/DeferredComposite_CS.glsl | 12 ++++++++++++ Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 5749 -> 6529 bytes .../Graphics/Devices/SHVkLogicalDevice.cpp | 1 + .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 6 ------ .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 8 ++++++++ .../MiddleEnd/Lights/SHLightingSubSystem.h | 5 +++-- .../Graphics/Pipeline/SHVkPipelineLayout.cpp | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index e73ea9eb..2402d4f8 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -7,6 +7,7 @@ struct DirectionalLightStruct uint cullingMask; vec4 diffuseColor; mat4 pvMatrix; + uint shadowData; }; struct AmbientLightStruct @@ -65,6 +66,8 @@ void main() vec3 fragColor = vec3 (0.0f); + vec4 shadowMapColor = vec4 (1.0f); + for (int i = 0; i < lightCounts.directionalLights; ++i) { if ((lightLayer & DirLightData.dLightData[i].cullingMask) != 0) @@ -77,6 +80,13 @@ void main() // Calculate the fragment color fragColor += DirLightData.dLightData[i].diffuseColor.rgb * diffuseStrength.rrr * pixelDiffuse; + + if ((DirLightData.dLightData[i].shadowData & uint(1)) == 1) + { + // calculate shadow map here + vec2 texCoord = vec2 (gl_GlobalInvocationID.xy) / vec2 (imageSize (targetImage)); + shadowMapColor = texture (shadowMaps[0], texCoord).xxxx; + } } } @@ -95,6 +105,8 @@ void main() // store result into result image imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor.rgb, 1.0f)); + + imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), shadowMapColor); //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(ssaoVal.rrr, 1.0f)); } \ No newline at end of file diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index df956040e255167463b8ea8206fcc2b8074e10fb..fc527efa0308db8d380e4a8cfabff95cb1ce335b 100644 GIT binary patch literal 6529 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 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?(%+pKi2 ssaoBlurPass = gBufferNode->AddNodeCompute("SSAO Blur Step", ssaoBlurShader, { "SSAO", "SSAO Blur" }); - /*-----------------------------------------------------------------------*/ - /* SHADOW MAP PASS */ - /*-----------------------------------------------------------------------*/ - // Shadow map pass will have no resources bound at first. Lighting system will add resources to the node. - // It will initially also not have any subpasses since they will be added for each light that casts shadows. - //auto shadowMapPassNode = renderGraph->AddNode(SHGraphicsConstants::RenderGraphNodeNames::SHADOW_MAP_PASS.data(), {}, {}); /*-----------------------------------------------------------------------*/ /* DEFERRED COMPOSITE NODE */ diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index 8a2fb3e3..bc9554c4 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -60,7 +60,15 @@ namespace SHADE // write view projection matrix if renderer is available auto lightRenderer = lightComp->GetRenderer(); if (lightRenderer) + { lightPtr->pvMatrix = lightRenderer->GetCPUCameraData().viewProjectionMatrix; + + // Boolean to cast shadows in first 8 bits (1 byte) + lightPtr->shadowData = lightData.castShadows; + + // Next 24 bits for shadow map index + lightPtr->shadowData |= (lightData.shadowMapIndex << 8); + } break; } case SH_LIGHT_TYPE::POINT: diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h index 3cc5bac8..f3a98d14 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h @@ -44,6 +44,9 @@ namespace SHADE //! Matrix for world to projection from light's perspective SHMatrix pvMatrix; + //! Represents boolean for casting shadows in first byte and shadow map index in the other 3. + uint32_t shadowData; + }; // Represents how the data will be interpreted in GPU. we want to copy to a container of these before passing to GPU. @@ -62,8 +65,6 @@ namespace SHADE //! when a fragment is being evaluated, the shader will use the fragment's //! layer value to AND with the light's. If result is 1, do lighting calculations. uint32_t cullingMask; - - }; class SH_API SHLightingSubSystem diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp index d9ff07dd..6a6ef879 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp @@ -205,7 +205,7 @@ namespace SHADE newBinding.DescriptorCount = SHVkDescriptorSetLayout::Binding::VARIABLE_DESCRIPTOR_UPPER_BOUND; // Set the flags for variable bindings - newBinding.flags = vk::DescriptorBindingFlagBits::eVariableDescriptorCount; + newBinding.flags = vk::DescriptorBindingFlagBits::eVariableDescriptorCount | vk::DescriptorBindingFlagBits::ePartiallyBound; } else {