From b6b2c75fc3b228bce3958e77e999fcbce72cb152 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Tue, 7 Mar 2023 17:39:51 +0800 Subject: [PATCH] Implemented Shadows (f0kin finally) --- Assets/Shaders/ShinyHighlight_FS.glsl | 8 ++++-- Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 5397 -> 5733 bytes Assets/Shaders/ShinyHighlight_VS.glsl | 9 ++++--- Assets/Shaders/ShinyHighlight_VS.shshaderb | Bin 5705 -> 6141 bytes .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 16 ++++++------ .../src/Graphics/RenderGraph/SHSubpass.cpp | 23 ++++++++++-------- .../src/Graphics/RenderGraph/SHSubpass.h | 7 +++--- 7 files changed, 38 insertions(+), 25 deletions(-) diff --git a/Assets/Shaders/ShinyHighlight_FS.glsl b/Assets/Shaders/ShinyHighlight_FS.glsl index be26f866..18f979fe 100644 --- a/Assets/Shaders/ShinyHighlight_FS.glsl +++ b/Assets/Shaders/ShinyHighlight_FS.glsl @@ -32,10 +32,11 @@ layout(location = 0) in struct vec2 uv; // location = 1 vec4 normal; // location = 2 vec4 worldPos; // location = 3 + vec3 worldNormal; // location = 4 } In; // material stuff -layout(location = 4) flat in struct +layout(location = 5) flat in struct { int materialIndex; uint eid; @@ -72,10 +73,11 @@ void main() { position = In.vertPos; normals = In.normal; - albedo = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv); + albedo = vec4 (texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv).xyz, 1.0f); worldSpacePosition = In.worldPos; outEntityID = In2.eid; + lightLayerIndices = uvec4 (In2.lightLayerIndex, 0, 0, 1); // float vpHeight = float (In2.screenSpacePos.y) - MatProp.data[In2.materialIndex].highlightPosition; // bring the frame of reference to the object's screen space pos @@ -100,4 +102,6 @@ void main() } else objectVFX = vec4(0.0f, 0.0f, 0.0f, 1.0f); + + objectVFX.a = 1.0f; } \ No newline at end of file diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb b/Assets/Shaders/ShinyHighlight_FS.shshaderb index 572f3b31d0ed23942fb76dda3dfd28153ef4d70c..a3a6230df5e550a976d687e26fd3bab001c76575 100644 GIT binary patch literal 5733 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 literal 5397 zcmZ9O`F9*g5y!{Tu4K#d5n?BVfFs$E1RP9aoC^~>axAX|imgP(4&fNayCZ4h(ad^w zRPHY*SFRJg1GRT~8FC}}NN7c{2B@y8B?owywpQ5lDwg{T!5VSeJt zxLJ0tjgd>`hG~?|ccb|@+_U?xcGNtnJZs6r_Od+dX31P$EQY7LQJTypaUuUO{>G6b zjp>Q7*=~oO@=O|sX_CcZD=D;6vJ|tH%j4scteJLO)quJps{5~NM;o=5#i)J9+}(St z{|CgblW!?XyGrfwuym(rPUp)#yuODgllcYb9}#YK$`${H9`^pa>vucvBxRDj{@2yZ z9g1NLDudZeaZ%3X9dR|saem#U)foDpsYOu=H|SzG>E*mgTTIj-H)lJgmDmes+?&&J znDdU(6LBlYUk~;Om+|ScTf}~TJ-A2QBT+e15nJ}Z!3;-kJeX|2RkkE?Y$IujSYXv;%S_1fY%o7FvyU1wR3cQTdjcD3_fT;DCk zZhQQEsx_23ENrS@b@yJRY+9)!|GoJQPg7Okt=Q{pk25o$b(K5z8}XGj4|M0|^kwPYF?@{G zJ2n*jPI!K`#+7(-@lCwu&LmCuXd3G0n0(tL3@~r7ig|}%>cr1G1oK@2^A5L57>3D7 zFDBJH-VkF)PpxqH;mBig^a*aQgk1MZ4@&q>5o2%5ay3*H+<=65-Wj!!$1t@ph}|c> z(b+X;ukK?Ym=OQRExou##hzTTYwov(Iduv7c`so00_Hb}Z|o+I`8~qV9;l!5W?22k z_4mT=jP=6e*e9Iz!|s9QV~=pQf9?eRU{D`;wI4NiFQ||B8}u)FOgUHw`$k#RKI){V zo7DSFg&Wf;aZcFASM^O=?^f^Uj7Nn>rO6Gy*JJ8|Bc58x$J*Ouu`gob(Fl1yD7{94 zpFCjhE!U1Sp1!`sl)2z-s8Vnzq0(XLY?HO4#T%7 z@@_eZ`+)4-(qPv9xHJQf++f}iW1D|3)K7kd`Md+((KgxKcQCo`m!?KIa)EgRaP;95 z(xVav{oN}~PWC~6`F&w6;t>4geNcLh1V4Gf`#gt#zqgqSJ|NASh7ZYRuxIP%lx%Vm z|0!>8m$v>MmR;@t5s!&~%-g*hdziOJJpQB7#)Ne_E4~TTflxofec-+0V;{ejrY1P@gL(6CVEV{!0qfnXy9UqOWWfDP z4Bs|l=^?*=^bw4Hq7R3C_*5T0+lSBhVSdZ2`7ie2OMUoqAHLFuuX;SLUC{dvOZYC_ zE_qOUpuZoH!0*$J$2_+9j|vmd+qd{#vf+v68v!PMzw|>A-i77AP4>9tA*YAjyLebO zZ;}{%)!2i=_-9ocb0;Kl?-|+T;LX{-AC(PH{9$P@@w~OqIDU0a?&7f(e!%@Mf|<)5;_Z#==JL+I z;P~EJyg}CEPJeO5H{k9WnDyxMmn8jtjyylE8+1Z;Q(}F_XZ;{|%ln`5YsH?+gz5X7 z1ddw3^AhTQQR{;jB*ehyK1bqtoAabFb1wKfCuPHNmuyZd8~z!^3`#Fb$OBKWLeE)G zGGREwxoqCx(|&$iHXL!x#|LM9D;$6Ao$H8$x4xCKt#A0K*VgOG#&2hLS~lmvJ>mOj zac5-XvweM8Hs3Ay=X|YSkxf2)#(hmTJl{_0=lcO?d7qNao(!LpO^mJcv}|I|Ntl0D z8qVUMkzJkttT6Mff6vJ#2A=unrQzrwcl8Cy1xfXue%|3mMBdR~&S zZe2n=Yf{(ur5V&k%*&ErNvI2(e(-&MMPfDnPyzL1{&SCsvwU!t?-#PkH>0z< zRr;3_xT-MkE$`!uIXBLTvohb?va3E~{;SIFm+(7Jt?ZMrR&t+m4oR=8*uxcjeZ?NB z*c)WC_9kiD!)DpU7`|RMc@4iuHo2`QH^?Ri-eR`MCb!|OvdL+4Zj?<7ynQ=vl1(mr qHt)T%son6+va4&qPna0^7kpoCkxedq_FZ_tZ1#okf7&mYUj83_h%5sD diff --git a/Assets/Shaders/ShinyHighlight_VS.glsl b/Assets/Shaders/ShinyHighlight_VS.glsl index c0268737..483af1f0 100644 --- a/Assets/Shaders/ShinyHighlight_VS.glsl +++ b/Assets/Shaders/ShinyHighlight_VS.glsl @@ -17,6 +17,7 @@ layout(location = 0) out struct vec2 uv; // location = 1 vec4 normal; // location = 2 vec4 worldPos; // location = 3 + vec3 worldNormal; // location = 4 } Out; @@ -36,7 +37,7 @@ struct GenericData }; // material stuff -layout(location = 4) out struct +layout(location = 5) out struct { int materialIndex; uint eid; @@ -76,11 +77,13 @@ void main() // uvs for texturing in fragment shader Out.uv = aUV; - mat3 transposeInv = mat3 (transpose(inverse(modelViewMat))); + mat3 mvTransInv = mat3 (transpose(inverse(modelViewMat))); + mat3 modelTransInv = mat3 (transpose(inverse(worldTransform))); // normals are also in view space - Out.normal.rgb = transposeInv * aNormal.rgb; + Out.normal.rgb = mvTransInv * aNormal.rgb; Out.normal.rgb = normalize (Out.normal.rgb); + Out.worldNormal = normalize (modelTransInv * aNormal); // Get center of object in world position vec4 worldPos = vec4(worldTransform[3][0], worldTransform[3][1], worldTransform[3][2], 1.0f); diff --git a/Assets/Shaders/ShinyHighlight_VS.shshaderb b/Assets/Shaders/ShinyHighlight_VS.shshaderb index 9818708504495b5706c860c5448aa90b2077dc57..95eac304277d9591e76c296a0c74bea47b4eb2ad 100644 GIT binary patch literal 6141 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 JKf19K{2w*kCO!ZF literal 5705 zcmZ9O`*&Pb6~}LrW>QKEluD@zHEje_OKTOVRisTHn6?HIY-oL;;W~4ZUYyK~Gn2H% z2L(mI7f?m;U7sk{_X}TjE&nQiaVGd0X?z(%gF4rZ)g{MB(CpQ-ITK->3^Onj6 za6NE|-QZ5J51arGgUjGG@OSV}a0LwWZ;1KdBwb52Q`7TPGc!}u_s!Qko%vq>d^4MG z=B;eLk$1CtKVQl8TUYVRTlMC0qv|k%N42gI)>zLPj#@IhDlet|tedCJ;)SUo&4k)1OYyXWfB!gxjk$a&gB>mS=xL|j?VrvY{WJK6&3)N#ZO1Y%(%??K2wz$A z@bbb!W^MLSo1@`{V0edKVqSc`##Mj!{;Ia-{A|`8G{_ihmUn22>tS8;?xo#Vec)tY&f4XSSD)0AUA@BD3WsHw>s(f49u=&Q-{pMT?c9r@TX6@_1F;?~+IK~GP z+}hQ*F#;Dp_Cuc=uHyJmmfRrD-c;k%jr0CRF1f4Y>{~TX-MHsL#K}e66g{IcasQW&veevz6JGA?Ls``mik9@up?XG7%-gk#JI)aNn+5g~-(Jy*#tb393 zTc}^$>B#5)q#}+*8)fl)Lo9n0>zl})O zG2R%VeGI?YllFT`-ToT43*DHFz@h(j%xi$W{_4ILIqjR6jny9Un~}9!*Bh8!-#zJn z6SFpX^QrsZ8gx7(Sus|WOZ8@g*~w{G=`lGDDkl#NlpgV`F?^;h?OMO}N5t;?LQ>u;Rv$~z15 z_y@o+&~6@e-=&=PyP3`D`D$19oyyq{*Vqq|#zL|-nex=2i&uW9=w3eI2b+`QRIaE_j_XwVLq{qRbFJ)W^LbOwoWZe!1kLr>~*g7w`CAnO!sP^xsOG zy#DHbkMuYHKT6rPwX6Gm(yqRh`AVtpqo?lA+z#vd4~)M<`ucuu1Fo;``Oj8#&(pt2 zwBL)}@5BwjZ^$9CY+}9rFsjAHNB=0CV{5F^9T7 zk>f4M=CJpXV+>h7a%@L7hu;%(sE+~dJDJ}OCV+Nxj5F^7@}ciR_MKlOM*BN}KJwep})k)b)#64Qi zh3?w=M6Jh=t#uOES9SfY&2PX5zzLxLH1qvH|F|FO`o!KIMD`pua6>(}4+3l60kqAP z=Y0}coBPu?2jmk($Ti2DR`#Q6>*u8wS+^&6+3T*PI_5!XPDxCLb6?1^#u$;BO6M2!_MinHYZ<4XT*S32an&Al z%DCu(esae3nEPNim;}~oAJ#E118w2Af*gL<6@F)twT0igil23a-+5$h@tz+;b`9gT z?Fa6w%dE{a+R6NBFab6LbB!~92FR;>W}gMdc_-CB2lSDToO0&8!2ATz|8WrYJz4UR z^Yf)o+=DNm%Lzx^1K*PO;3;5^z%%9h_#&LK+GG8vkzK!fFP=fy*I~{2$VJSv$i`If z#Fx;GiFcuoT*Q1C*%;3u-o#gsjTr*2qmNwd`>V*t%ia3HGM#d7%9{ z@Knitz2q-4dnaCI{uX!%Yy^H2Tx*p1+dx~VymQ|vxrqBNdc;j4N8I<2wME?bk>zH~ z8h(ImF8QeI60)^vi~jr&*}YcJ;Ya9~fW!XiBNs70MmDB;4nIM^1mYa@k&B-G6nW6o z!T0}X=yJkgoaf;huQ2}{YygwM8q|%^?wj}(m;lu`@#~Uz&2i-4fZZVe&iE~|KJxl_ zXMYFwfw&vLFFB@F?hhqrjp6sllC$P`&woNTUVrVr=Xj5QMs|ID+`|FpzktiYJK-MH L_4_Z~*bn{(aS`y8 diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 54e5a1ff..999337ae 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -128,7 +128,7 @@ namespace SHADE SHFreetypeInstance::Init(); - //SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); + SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_FS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_FS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/SSAO_CS.glsl", false); @@ -865,12 +865,13 @@ namespace SHADE // we need to wait for the device to finish using the graph first device->WaitIdle(); - auto const& EVENT_DATA = reinterpret_cast*>(eventPtr.get())->data; - auto* lightComp = SHComponentManager::GetComponent(EVENT_DATA->lightEntity); - std::string depthResourceName = "ShadowMap_Depth " + std::to_string(EVENT_DATA->lightEntity); - std::string shadowMapResourceName = "ShadowMap " + std::to_string(EVENT_DATA->lightEntity); + auto const& EVENT_DATA = reinterpret_cast*>(eventPtr.get())->data; + auto* lightComp = SHComponentManager::GetComponent(EVENT_DATA->lightEntity); + 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 companionSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS); + 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); if (EVENT_DATA->generateRenderer) { @@ -929,7 +930,8 @@ namespace SHADE ); shadowMapPipeline = tempLibrary.GetGraphicsPipeline({ shadowMapVS, shadowMapFS, shadowMapDrawSubpass }); } - shadowMapDrawSubpass->SetCompanionSubpass(companionSubpass, shadowMapPipeline); // set companion subpass and pipeline + shadowMapDrawSubpass->AddCompanionSubpass(gBufferWriteSubpass, shadowMapPipeline); // set companion subpass and pipeline + shadowMapDrawSubpass->AddCompanionSubpass(gBufferWriteVfxSubpass, shadowMapPipeline); // set companion subpass and pipeline // 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); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index 14a5d864..db78c5aa 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -77,7 +77,7 @@ namespace SHADE , name { rhs.name } , viewport {rhs.viewport} , renderer {rhs.renderer} - , companionSubpass {rhs.companionSubpass} + , companionSubpasses {std::move (rhs.companionSubpasses)} , dummyPipelineLayout{rhs.dummyPipelineLayout} { @@ -115,7 +115,7 @@ namespace SHADE name = std::move(rhs.name); renderer = rhs.renderer; viewport = rhs.viewport; - companionSubpass = rhs.companionSubpass; + companionSubpasses = rhs.companionSubpasses; dummyPipelineLayout = rhs.dummyPipelineLayout; @@ -237,17 +237,19 @@ namespace SHADE BindInputDescriptorSets (commandBuffer, descMappings.at(SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE), frameIndex); - // If companion subpass is not a valid handle, render super batch normally - if (!companionSubpass.companion) + if (companionSubpasses.empty()) { // Draw all the batches superBatch->Draw(commandBuffer, frameIndex); } else { - // if not bind pipeline for companion and and execute draw command - commandBuffer->BindPipeline(companionSubpass.pipeline); - companionSubpass.companion->superBatch->Draw(commandBuffer, frameIndex, false); + for (auto& companion : companionSubpasses) + { + // if not bind pipeline for companion and and execute draw command + commandBuffer->BindPipeline(companion.pipeline); + companion.subpass->superBatch->Draw(commandBuffer, frameIndex, false); + } } } @@ -493,10 +495,11 @@ namespace SHADE subpassIndex = index; } - void SHSubpass::SetCompanionSubpass(Handle companion, Handle pipeline) noexcept + void SHSubpass::AddCompanionSubpass(Handle companion, Handle pipeline) noexcept { - companionSubpass.companion = companion; - companionSubpass.pipeline = pipeline; + companionSubpasses.push_back(CompanionSubpass{companion, pipeline}); + //companionSubpass.companion = companion; + //companionSubpass.pipeline = pipeline; } /***************************************************************************/ diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h index 1300ee2b..640ccb2d 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h @@ -33,7 +33,7 @@ namespace SHADE struct CompanionSubpass { // subpass whose data will be borrowed to draw - Handle companion; + Handle subpass; // Pipeline that will be used for all the draw calls from all batches of the companion subpass Handle pipeline; @@ -114,7 +114,8 @@ namespace SHADE //! Optional component to a companion subpass. If the subpass handle of this object //! is valid, the subpass will be drawn using this companion's data. - CompanionSubpass companionSubpass; + //CompanionSubpass companionSubpass; + std::vector companionSubpasses; private: /*-----------------------------------------------------------------------*/ @@ -165,7 +166,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* PUBLIC SETTERS AND GETTERS */ /*-----------------------------------------------------------------------*/ - void SetCompanionSubpass (Handle companion, Handle pipeline) noexcept; + void AddCompanionSubpass (Handle companion, Handle pipeline) noexcept; Handle GetParentNode(void) const noexcept; SHSubPassIndex GetIndex() const noexcept;