From f217562fefe0f546dbdb2d760c8a0320e43da6a4 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Wed, 11 Jan 2023 20:04:53 +0800 Subject: [PATCH] Shadows are sort of working --- Assets/Application.SHConfig | 2 +- Assets/Scenes/MainGame.shade | 9 +++++++-- Assets/Shaders/DeferredComposite_CS.glsl | 14 +++++++++++++- Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 7493 -> 8333 bytes SHADE_Engine/src/Camera/SHCameraSystem.cpp | 2 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 9 +++++++-- .../MiddleEnd/Interface/SHGraphicsSystem.h | 1 + .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 4 ++-- .../MiddleEnd/Pipeline/SHPipelineLibrary.cpp | 4 +++- .../MiddleEnd/Pipeline/SHPipelineLibrary.h | 3 ++- 10 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Assets/Application.SHConfig b/Assets/Application.SHConfig index 10ba697b..370665d2 100644 --- a/Assets/Application.SHConfig +++ b/Assets/Application.SHConfig @@ -1,4 +1,4 @@ Start in Fullscreen: false -Starting Scene ID: 87285316 +Starting Scene ID: 86098106 Window Size: {x: 1920, y: 1080} Window Title: SHADE Engine \ No newline at end of file diff --git a/Assets/Scenes/MainGame.shade b/Assets/Scenes/MainGame.shade index 49602e78..69bb9e7d 100644 --- a/Assets/Scenes/MainGame.shade +++ b/Assets/Scenes/MainGame.shade @@ -8440,10 +8440,15 @@ IsActive: true NumberOfChildren: 0 Components: + Transform Component: + Translate: {x: 2.05652523, y: 1.65113854, z: -6.62914371} + Rotate: {x: -0, y: 0, z: -0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true Light Component: - Position: {x: 0, y: 0, z: 0} + Position: {x: 0, y: 1.5, z: -6.71799994} Type: Directional - Direction: {x: 15, y: 90, z: 15} + Direction: {x: 0, y: 0, z: -1.11899996} Color: {x: 1, y: 1, z: 1, w: 1} Layer: 4294967295 Strength: 1 diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index 51f147bb..b31daf25 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -52,7 +52,19 @@ float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV { vec4 fragPosLightPOV = lightPV * worldSpaceFragPos; vec3 converted = (fragPosLightPOV.xyz / fragPosLightPOV.w) * vec3(0.5f) + vec3(0.5f); - return step (fragPosLightPOV.z, texture(shadowMap, converted.xy).r); + + float sampledDepth = texture(shadowMap, converted.xy).r; + + if (converted.x < 0.0f || converted.x > 1.0f || converted.y < 0.0f || converted.y > 1.0f) + return 1.0f; + + if (fragPosLightPOV.z > sampledDepth && fragPosLightPOV.w > 0.0f) + { + return 0.3f; + } + else + return 1.0f; + // return step (fragPosLightPOV.z, ); } void main() diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index 8a11aa08d53003ad9e277c52698e550336f1e4bb..31ea035c0a64e3e947bae4ceb483ce0661300999 100644 GIT binary patch literal 8333 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 X46+VodvI={ixhA?eEQ9 z%SYGO21<=eZFKq4G_MCaR@qptF0Bj=O^kCQ&TGq-AxqV@<-wYEM|Qk%wegCRPqzL% zt~2Y~lF#?moU^9jTT>}-z$90Dc4~od?!7%b4Q{knA1PIvk=D>Z#f|6lEG|EvzS3Fc zdUK6+&*GMr8l~nMHj8K1Q>)ep&G+CpnED>c(N51;LnV)C&(1;Shuu?~7;TKR^RAqO z&QjadMoZN^#CaY3bB?_|R;!FQk|%ikaeS;6G|`=Tyj@-zSz9Sj&1lwrE_}Ynw0=AB z7r`wl#IA1CCk7g>-Spv(T(RA}F6UX-c%xn(9d3A3Q@nLm#+Rg9u$i~6fr%>DWOzks z{0z>mGrI(?xPJ4Ln{)IzO8LIy{5!Hs;h0lk-Ct{V6@2royRsY5mo~5B)R}JHTSx9E zWb?VBd#=uNUt88M@4kxldq(o^Yp~hk&pIQ0ZD4Huic+Iq*@!x|hHp=^Ut(Wf*{9*Q zthsm|`W=IXoqK<7f@5BR^*lPWTc%=9$h*ICc7CPve!W9qvu2K^`3b#0_rOo}F-_=Q zxesovR4-WFJ$VsMpJb%STGX>F&2@kK=2U>cizmlkO#- z@9s8WFQD!FurKgj!=8=q`D^CJ2j~XI#GQ-$)+gsYe}l4le48nvHWE zj_)GL)&|xKk{kok9hAw(XXxF8lB(HLf(tr!H#rD3vxEu%%{E!T70|R zv#q#!&ACi_)(Cq~;_XA@y2-y)ijvzEduycmtWUpd8!NvXw%<-Y{M(}Im!Hkd?U2ql zuXFXA*ItviZu7by=gIGk?N7UI;5Z=Jv(O`cA9Ul*pay!uW9CW9g5x!rUBb$}hsN?OPZ5 zjzl+~@qWLhNbA#I9In>}T=UrEFxH&f%MurMU$SG5C+7C#QLb?^`u|(QbzS3>G~ZZr zYM+|8uzfQf#t$Mr2lwt8LrFJZak!7!z&XRoVXQf|*Co!gJOkZ)?mNCQKNmBED!eb4DFkpnJ~xuT1_9^5_N?B<0yB~Jqj%c(Sx&gWL)o$M*6FZ69)s~5T;nk0LSRp7`wsRL zY~Re|3%33>TiB-+Z0}vUU>on>CXwHKV+Gs$;NKPD*S@M?JO7q~?YnzN!8YH01>5)i z{(^11zXi>I1pD)hjsT0nIoQ5;M?E7pG_y6Z2YKPHiH0+#~!q_4Q{o3ZuZna=Anbo0qypK5svy8Jxw zDCc%L(qUct-U{TbOWiuWQ*Q%3$@W~{4x+A2=-q3 z(ax{XEc+d}2Q+{&p7rm+@xXoDmu&m|0rWqBsM}ok0_ROf{t@VR-u=m5n0n$**gF8% zGpGLeHh)IfA26T2_ZQ$f#&`H@;*5_omh+8>y(+cit|+yyMS2#>IE%lbdlvD2{T*HI z3SfSHa?ZaR>HKSu&VLB`Pw;TE7a;!y7J~Tw_HT4!|o%0W8C{eAo}7Ebp4L_zv4yc&X>0iW1eQFyuI*0T_-Rx diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 703de2c0..6feece48 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -315,7 +315,7 @@ namespace SHADE //camera.perspProjMatrix = SHMatrix::OrthographicLH(9.0f, 9.0f, 0.1f, 20.0f); camera.orthoProjMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); - //camera.perspProjMatrix = SHMatrix::OrthographicLH(4.0f, 4.0f, 0.1f, 200.0f); + //camera.perspProjMatrix = SHMatrix::OrthographicLH(5.0f, 5.0f, 0.1f, 20.0f); //camera.projMatrix.Transpose(); camera.dirtyProj = false; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 14326b93..79053c2f 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -181,6 +181,8 @@ namespace SHADE // Create Default Viewport worldViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast(window->GetWindowSize().first), static_cast(window->GetWindowSize().second), 0.0f, 1.0f)); + shadowMapViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast(SHLightingSubSystem::SHADOW_MAP_WIDTH), static_cast(SHLightingSubSystem::SHADOW_MAP_HEIGHT), 0.0f, 1.0f)); + std::vector> renderContextCmdPools{ swapchain->GetNumImages() }; for (uint32_t i = 0; i < renderContextCmdPools.size(); ++i) { @@ -781,7 +783,7 @@ namespace SHADE auto shadowMapNode = renderGraph->AddNodeAfter(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + resourceName, {resourceName.c_str()}, SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data()); // Add a subpass to render to that shadow map - auto newSubpass = shadowMapNode->RuntimeAddSubpass(resourceName + " Subpass", worldViewport, lightComp->GetRenderer()); + auto newSubpass = shadowMapNode->RuntimeAddSubpass(resourceName + " Subpass", shadowMapViewport, lightComp->GetRenderer()); newSubpass->AddDepthOutput(resourceName, SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH); // regenerate the node @@ -793,8 +795,11 @@ namespace SHADE SHPipelineLibrary tempLibrary{}; Handle rgNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data()); + SHRasterizationState rasterState{}; + rasterState.cull_mode = vk::CullModeFlagBits::eBack; + tempLibrary.Init(device); - tempLibrary.CreateGraphicsPipelines({ shadowMapVS, {} }, shadowMapNode->GetRenderpass(), newSubpass, SHGraphicsPredefinedData::GetShadowMapViState()); + tempLibrary.CreateGraphicsPipelines({ shadowMapVS, {} }, shadowMapNode->GetRenderpass(), newSubpass, SHGraphicsPredefinedData::GetShadowMapViState(), rasterState); shadowMapPipeline = tempLibrary.GetGraphicsPipeline({ shadowMapVS, {} }); } newSubpass->SetCompanionSubpass(companionSubpass, shadowMapPipeline); // set companion subpass and pipeline diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index b8c43c75..9e30e204 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -441,6 +441,7 @@ namespace SHADE #endif Handle worldViewport; // Whole screen + Handle shadowMapViewport; std::vector> viewports; // Additional viewports // Renderers diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index 31f95921..2e3b21d9 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -395,7 +395,7 @@ namespace SHADE switch (lightComp->GetLightData().type) { case SH_LIGHT_TYPE::DIRECTIONAL: - return SHMatrix::Transpose(SHMatrix::LookAtLH(lightComp->GetLightData().position, lightComp->GetLightData().direction, SHVec3(0.0f, -1.0f, 0.0f))); + return SHMatrix::Transpose(SHMatrix::LookAtLH(lightComp->GetLightData().position, SHVec3::Normalise (lightComp->GetLightData().direction), SHVec3(0.0f, -1.0f, 0.0f))); //return SHMatrix::Transpose(SHMatrix::LookAtLH(/*lightComp->GetLightData().position*/SHVec3(1.27862f, 4.78952f, 4.12811f), SHVec3(-0.280564f, -0.66262f, -0.69422f), SHVec3(0.0f, -1.0f, 0.0f))); case SH_LIGHT_TYPE::POINT: return {}; @@ -518,7 +518,7 @@ namespace SHADE if (auto renderer = light.GetRenderer()) { //SHMatrix orthoMatrix = SHMatrix::OrthographicRH() - renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(5.0f, 5.0f, 0.1f, 20.0f)); + renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(30.0f, 30.0f, 1.0f, 50.0f)); } auto enumValue = SHUtilities::ConvertEnum(light.GetLightData().type); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.cpp index a5dd929c..74795034 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.cpp @@ -7,7 +7,7 @@ namespace SHADE { - Handle SHPipelineLibrary::CreateGraphicsPipelines(std::pair, Handle> const& vsFsPair, Handle renderpass, Handle subpass, SHVertexInputState const& viState/* = SHGraphicsPredefinedData::GetDefaultViState()*/) noexcept + Handle SHPipelineLibrary::CreateGraphicsPipelines(std::pair, Handle> const& vsFsPair, Handle renderpass, Handle subpass, SHVertexInputState const& viState/* = SHGraphicsPredefinedData::GetDefaultViState()*/, SHRasterizationState const& rasterState) noexcept { std::vector> modules{}; if (vsFsPair.first) @@ -53,6 +53,8 @@ namespace SHADE } newPipeline->GetPipelineState().SetColorBlenState(colorBlendState); + + newPipeline->GetPipelineState().SetRasterizationState(rasterState); // Actually construct the pipeline newPipeline->ConstructPipeline(); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h index b7485e50..ca46c71a 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h @@ -34,7 +34,8 @@ namespace SHADE std::pair, Handle> const& vsFsPair, Handle renderpass, Handle subpass, - SHVertexInputState const& viState = SHGraphicsPredefinedData::GetDefaultViState() + SHVertexInputState const& viState = SHGraphicsPredefinedData::GetDefaultViState(), + SHRasterizationState const& rasterState = SHRasterizationState{} ) noexcept; Handle GetGraphicsPipeline (std::pair, Handle> const& vsFsPair) noexcept; bool CheckGraphicsPipelineExistence (std::pair, Handle> const& vsFsPair) noexcept;