From bf08be045ac023437f61fa2b267495255567e9c7 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Thu, 9 Mar 2023 14:56:03 +0800 Subject: [PATCH] Solved bugs with shadows Switching a scene causes a crash from shadows. --- Assets/Scenes/Level2.shade | 4 +-- Assets/Shaders/DeferredComposite_CS.glsl | 6 +++- Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 11569 -> 11569 bytes Assets/Shaders/ShinyHighlight_FS.glsl | 2 +- Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 5733 -> 5921 bytes .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 28 ++++++++++-------- .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 10 +++---- .../Graphics/RenderGraph/SHRenderGraph.cpp | 6 ++-- 8 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Assets/Scenes/Level2.shade b/Assets/Scenes/Level2.shade index dadf7bf0..ef197542 100644 --- a/Assets/Scenes/Level2.shade +++ b/Assets/Scenes/Level2.shade @@ -45,14 +45,14 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: 0.242245644, y: 1.56757355, z: -6.07086945} + Translate: {x: 0.236000001, y: 1.56757355, z: -6.07086945} Rotate: {x: -0, y: 0, z: -0} Scale: {x: 1, y: 1, z: 1} IsActive: true Light Component: Position: {x: 2, y: 1.5, z: -5.5999999} Type: Directional - Direction: {x: 0, y: 0, z: -1} + Direction: {x: -0.0780000016, y: 0.159999996, z: -1} Color: {x: 0, y: 0, z: 0, w: 1} Layer: 4294967295 Strength: 1 diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index e9f9eb0c..2839e106 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -73,9 +73,12 @@ float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV float worldNormalDotLight = dot (normalize (worldNormal), normalize(lightDir)); - if (worldNormalDotLight < 0.0f) + if (worldNormalDotLight <= 0.0f) return 0.7f; + // if (worldNormalDotLight <= 0.01f) + // return 0.7f; + if (fragPosLightPOV.z > moments.x && fragPosLightPOV.w > 0.0f) { float p = step (fragPosLightPOV.z, moments.x); @@ -94,6 +97,7 @@ float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV return 0.0f; } + // return min (worldNormalDotLight + 0.7f, 1.0f); return 1.0f; } diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index 1ec2bcf0d56aa6c9634e82958dec3fd7f3f954af..a48a176f5d45e271183945cd393248c18c43ea5f 100644 GIT binary patch delta 14 VcmdlOwJ~Z#ss`hp&1o8^SpYG;1|a|d delta 14 VcmdlOwJ~Z#ss`hZ&1o8^SpYGm1|0wZ diff --git a/Assets/Shaders/ShinyHighlight_FS.glsl b/Assets/Shaders/ShinyHighlight_FS.glsl index 18f979fe..b2a2e940 100644 --- a/Assets/Shaders/ShinyHighlight_FS.glsl +++ b/Assets/Shaders/ShinyHighlight_FS.glsl @@ -77,7 +77,7 @@ void main() worldSpacePosition = In.worldPos; outEntityID = In2.eid; - lightLayerIndices = uvec4 (In2.lightLayerIndex, 0, 0, 1); + lightLayerIndices = uvec4 (In2.lightLayerIndex, packHalf2x16 (In.worldNormal.xy), packHalf2x16 (vec2 (In.worldNormal.z, 1.0f)), 1); // float vpHeight = float (In2.screenSpacePos.y) - MatProp.data[In2.materialIndex].highlightPosition; // bring the frame of reference to the object's screen space pos diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb b/Assets/Shaders/ShinyHighlight_FS.shshaderb index a3a6230df5e550a976d687e26fd3bab001c76575..7bbcb950f9afcf7c089937860865cd4c234a5f2a 100644 GIT binary patch literal 5921 zcmZ9Oi+@~I5yx-IZqlYtq)-rzNeeAntWe9#N+G4`CK5;>wXM(PcK0T^bhCH4dpBu) z(Sk@7Ux-?HsP(Pj+r9*=P!#bW@IUe6PpBmrR&g$EC+;S74*91Lo1!Aw&Ur8LA3*#n+A<<^hjUp!O673Ux zNK_TQAi5x0r#Q@0;*xrlZ4g{k&{D7>sEk*KAKYDSN3Adov#8ph4eL=_O%6RA)w1@b zJ~AoYY9nmUbi$dax?}rIt*~}jah4N@@|sDr(~PH+bgueHCv3#iag@s5kG(Q6Q5hep z)>^GHXsEv^JhBClF=arF z?0p`q?R3sT*f3DF8r1SWai5p; zp5Xl$G|127IUmmwq{rCEFN*7nzU1R_9S@I2Y3^-t=(TQP6g8)Gek0d$*5m$+HMhIm zxks+==Hd&cf84L6lZ`a9I6FGF$N6*LE?F<$(Uow?-pcDN*yw zfsRLzMvai0Ktg3zazdEqHMu8Kh5642ZzKy*Iv&r(iopDn!a6OrcoFM$_kX5Q-J6Cp z_asSLmy0}0!HeRFDp&SSKP{c>Kj-ady7aSM`nfLs{3UwXy*c>_A-4W~H;A*w|0ASywrK zZwN1}xw|txt=A|&f7lpH=dUk#Q~JzOj*I>k^=wGC0VZgma|eq$_Yj?2uyYU5xxeV# z!;K<_>BOYoQT2yA#MqRxMGQL_amo)OT5$_j1cDF26MOlIMi16p0kqdE5 zCl?03yTo}{u_04O+37vOi1_LCxnHFqk1on3_YGQ_Q*!qOomz;=T|u|?`A+c`uN7hE zn}wa4sE0jfSUrYy_XfXWZ_JOnnQQ&Ay|;MO3}*Ro4mOGyk*|_O zu7i$BI(hlG7Hmkn#6BS#UgR4T{~g}W9uG<%6el+LPOq~*82;o&Jl0014s`4TTID)% z=Hds3@FDi~;>$$%5F357$F7vVMe?B6w|e~s=?vz-Q=Iw5+&KHJZT|0;Om3DtcLDn~ z`Xb*fPOii#4%4rd=XM$Jd%NWKilejk4siw;vC+9#i~)a#$e;KS^SK+`tpUm00d!*B zAx@59#6ss@fYFDY;)5c_fTHn@AvQQ<{k&5$xnm~|`Yw;L&Rt&4`&tTiOJ@z!_ey3^ zqxEl0GBKI|0WWX#cIuiC1;MeqtiSuD75o1|uQUIkm-D=Ho$nX^*gq`JTG%;DAM>)E z#g9wJH^)l>devi=?;+{tUz1F{O(N{XofT0t>&4>Osl)92m;%Gz67LhyAB)eM{dYNF zKPs76HXr`9CO--!SUzKLC2pvcDIOoXYsd49v0p0c%Qp>_ekcBi_lj3UyfxtD!+jkUf#btHy;nre++Tb)ijRxH56Fj_?-MZ(d_rG_ zP2%^9z#+ym5$E9n&FK}N6yd`#>;cJO_!{=0$Cx{*-C?~cC*uo!}A{FZ+Ubi=e8bquhHoV=XycZeXfsq zd|0{g9)3bZew=4)cK)dGlOpVo`kFuGv8MDbl0Pj1BNz0~h{*dXt&jew2p{mo$2cY# z+~ypY%$z6voW~@CvDY@|amnD1%ZI!^D>~-%yjQ$mVAhi-B!ij$Imx_v$Nl^#C4=Ed zud#ty-#+i~OYis>gn?V%o|0^R!)9lb{Jto{ZhQA7$?OC7qj-kCEFGKG^%cpSAMhu9 zu3wc*JZy%2O)~h?BJw{W4rcX!T{1P9{te0a*gD^oj1M^TpAiQ$|8Gey&VN=q^R0i+ zNyZ19`6tD}=pT3H+oBgl#dG={kJ}pGmCm{^YtHlHr$qRG|5Gu)FV6Un&dn+D?}@

;jk_fxa{f%Vm zGyS)ci?Mzu9UpM=J1tHu-bqbFpKv`$;7ko)So1S6^VHlgkfWk**Es+ zRdKVu)@8$oJ$qgJ&m!hu6yc9fj{jBWw~P4QMJ@D!v0QYU{QAUK6y*Mbys{v#D#)uP zliONxt8txVd`!PwGI33Ri)3P3&#sV+54icPmrQKauarzon{$<9e8BB(*&vx%*lga_ nlF8llYa|!feyenRz)$$TTq~Ja*p7SbZIY=A+y7KAI=%cq$?j-b literal 5733 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 diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 397edf74..bc50d0a7 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -865,32 +865,30 @@ namespace SHADE std::string depthResourceName = "ShadowMap_Depth " + std::to_string(EVENT_DATA->lightEntity); std::string shadowMapResourceName = "ShadowMap " + std::to_string(EVENT_DATA->lightEntity); std::string shadowMapBlurredResourceName = "ShadowMap Blurred" + std::to_string(EVENT_DATA->lightEntity); - Handle gBufferWriteSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS); - Handle gBufferWriteVfxSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_VFX_SUBPASS); + + // we need to wait for the device to finish using the graph first + device->WaitIdle(); + if (EVENT_DATA->enableShadow) { // When the light first enables shadow rendering, we need to prepare the relevant objects to render shadows; namely renderpasses and subpasses, pipelines and descriptor sets if (EVENT_DATA->firstEnable) { - // we need to wait for the device to finish using the graph first - device->WaitIdle(); + Handle gBufferWriteSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS); + Handle gBufferWriteVfxSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_VFX_SUBPASS); + // Create new renderer for the light component and give it to the light component Handle newRenderer = resourceManager.Create(device, swapchain->GetNumImages(), descPool, SHRenderer::PROJECTION_TYPE::ORTHOGRAPHIC); lightComp->SetRenderer(newRenderer); - // assign shadow map index to light component - lightComp->SetShadowMapIndex(lightingSubSystem->GetNumShadowMaps()); - - // Add the shadow map resource to the graph renderGraph->AddResource(depthResourceName, { SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH }, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eD32Sfloat); renderGraph->AddResource(shadowMapResourceName, { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource(shadowMapBlurredResourceName, { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eR32G32B32A32Sfloat); - // link resource to node. This means linking the resource and regenerating the node's renderpass and framebuffer. auto shadowMapNode = renderGraph->AddNodeAfter(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName, { depthResourceName.c_str(), shadowMapResourceName.c_str(), shadowMapBlurredResourceName.c_str() }, SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data()); @@ -929,6 +927,10 @@ namespace SHADE // add the shadow map and the blurred version to the lighting system uint32_t const NEW_SHADOW_MAP_INDEX = lightingSubSystem->AddShadowMap(renderGraph->GetRenderGraphResource(shadowMapBlurredResourceName), EVENT_DATA->lightEntity); + // assign shadow map index to light component + lightComp->SetShadowMapIndex(NEW_SHADOW_MAP_INDEX); + + // Get deferred composite node compute and modify descriptor set auto nodeCompute = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data())->GetNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data()); nodeCompute->ModifyWriteDescImageComputeResource(SHGraphicsConstants::DescriptorSetBindings::SHADOW_MAP_IMAGE_SAMPLER_DATA, lightingSubSystem->GetViewSamplerLayout(NEW_SHADOW_MAP_INDEX), NEW_SHADOW_MAP_INDEX); @@ -964,12 +966,12 @@ namespace SHADE std::string shadowMapBlurredResourceName = "ShadowMap Blurred" + std::to_string(EVENT_DATA->lightEntity); // Remove render graph node - //renderGraph->RemoveNode(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName); + renderGraph->RemoveNode(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName); // Remove render graph resource - //renderGraph->RemoveResource(depthResourceName); - //renderGraph->RemoveResource(shadowMapResourceName); - //renderGraph->RemoveResource(shadowMapBlurredResourceName); + renderGraph->RemoveResource(depthResourceName); + renderGraph->RemoveResource(shadowMapResourceName); + renderGraph->RemoveResource(shadowMapBlurredResourceName); // Register light component shadow map index into light system as recyclable lightingSubSystem->RemoveShadowMap (EVENT_DATA->lightEntity); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index a2b9cc0a..b17964e4 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -62,15 +62,13 @@ 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; + // 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); - } + // 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/RenderGraph/SHRenderGraph.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp index 34206e5b..c44c9464 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp @@ -111,7 +111,6 @@ namespace SHADE renderGraphStorage->graphResources->at(resourceName).Free(); renderGraphStorage->graphResources->erase (resourceName); - resourceHdl.Free (); /* * IMPORTANT NOTES * @@ -134,8 +133,11 @@ namespace SHADE // Get handle to node since it exists auto nodeHdl = nodes[nodeIndexing[nodeName]]; + nodes.erase(nodes.begin() + nodeIndexing[nodeName]); + nodeHdl.Free(); - nodeIndexing.erase(nodeName); + + ReindexNodes(); } }