From 4cd9a6cea0af59019e70fd2780c1cc0775a4cab4 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Wed, 11 Jan 2023 10:35:29 +0800 Subject: [PATCH] shadows WIP --- Assets/Scenes/Scene2.shade | 10 +++---- Assets/Shaders/DeferredComposite_CS.glsl | 26 ++++++++++++------ Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 6277 -> 7493 bytes SHADE_Engine/src/Camera/SHCameraSystem.cpp | 4 ++- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 3 +- .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 5 ++-- .../MiddleEnd/Pipeline/SHPipelineLibrary.cpp | 3 +- 7 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Assets/Scenes/Scene2.shade b/Assets/Scenes/Scene2.shade index c8aa9c6d..de902c55 100644 --- a/Assets/Scenes/Scene2.shade +++ b/Assets/Scenes/Scene2.shade @@ -5,7 +5,7 @@ Components: Transform Component: Translate: {x: 0, y: 0.304069757, z: 1.73034382} - Rotate: {x: -1.48352981, y: 0, z: 0} + Rotate: {x: 0, y: 0, z: 0} Scale: {x: 1, y: 1, z: 1} IsActive: true Camera Component: @@ -26,8 +26,8 @@ NumberOfChildren: 1 Components: Transform Component: - Translate: {x: 0, y: 0, z: 0} - Rotate: {x: 0, y: 0, z: 0} + Translate: {x: -1.86388135, y: 0.0544953719, z: 0} + Rotate: {x: -0, y: 0, z: -0} Scale: {x: 1, y: 1, z: 1} IsActive: true Renderable Component: @@ -56,9 +56,9 @@ NumberOfChildren: 0 Components: Light Component: - Position: {x: 0, y: 0, z: 0} + Position: {x: 3, y: 4.5, z: 7} Type: Directional - Direction: {x: 0, y: 0, z: 1} + Direction: {x: -0.298000008, y: 0.522498012, z: 0.798600018} Color: {x: 1, y: 1, z: 1, w: 1} Layer: 4294967295 Strength: 0 diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index 576ce74b..51f147bb 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -24,7 +24,8 @@ layout(set = 3, binding = 1, rgba32f) uniform image2D normals; layout(set = 3, binding = 2, rgba8) uniform image2D albedo; 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 = 3, binding = 5, rgba8) uniform image2D positionWorldSpace; +layout(set = 3, binding = 6, rgba8) uniform image2D targetImage; layout (set = 4, binding = 0) uniform sampler2D shadowMaps[]; // for textures (global) @@ -47,10 +48,12 @@ layout(std430, set = 1, binding = 4) buffer AmbientLightData AmbientLightStruct aLightData[]; } AmbLightData; -// bool IsInShadow (sampler2D shadowMap, vec2 coords, float depth, mat4 lightVP) -// { -// // vec4 fragPosLightPOV = lightVP * -// } +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); +} void main() { @@ -61,6 +64,9 @@ void main() vec3 pixelDiffuse = imageLoad (albedo, globalThread).rgb; // Get position of fragment in world space + vec4 positionWorld = vec4 (imageLoad (positionWorldSpace, globalThread).rgb, 1.0f); + + // Get position of fragment in view spacee vec3 positionView = imageLoad (positions, globalThread).rgb; // normal of fragment @@ -100,7 +106,7 @@ void main() if ((DirLightData.dLightData[i].shadowData & uint(1)) == 1) { // calculate shadow map here - vec2 texCoord = vec2 (gl_GlobalInvocationID.xy) / vec2 (imageSize (targetImage)); + fragColor *= CalcShadowValue (shadowMaps[0], positionWorld, DirLightData.dLightData[i].pvMatrix).xxx; } } } @@ -111,7 +117,11 @@ 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)); + // vec2 normTexCoords = vec2 (gl_GlobalInvocationID.xy) / vec2 (1024.0f); + // vec4 shadowMapVal = texture(shadowMaps[0], normTexCoords); + // if (normTexCoords.x > 1.0f || normTexCoords.y > 1.0f) + // shadowMapVal = vec4(0.0f); + + // imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), shadowMapVal.xxxx); } \ No newline at end of file diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index 633fd1975d4df1e6788128068fcfc40efa3fb9f7..8a11aa08d53003ad9e277c52698e550336f1e4bb 100644 GIT binary patch literal 7493 zcmZ{n33#1V5r+R}2MR6wUQ!UPQh{Qnl$NEWG*nVrEEaGf+$J~am7CmfbJG??2qKH9 zC|Wmg7X-lt6mdlmRNPk-S40GNL0nh`eBb|`Nq_o0o<83*GvCaaGw1wsPH(yw@15nN zwPnA~ESr{Xoo$xhA?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 literal 6277 zcmZveiJR4B6~})wFvB3Ak|Lx?gS220nu&@8I50M1Gb};0H~wbkGIR5C?{x1S7NdfQ zvLsq)U#%=l4J}(S%51THwST4Ud3v5cpWl7Y@QcTn=gc|hd)D`T&-=UdA6b?aYfks7 zd0Ez#U6d`#{@#JI#aTBOYkQ`em3#t~KKqK^CTpWZg=t&; zKw~^_R~z+hgN3~}TMD199;(y^tNZrNw5V>}-0VttUK^`SG}L>ue)Q=^t7`DxYULm* zcu%&fgtrp58eVTS_vf{ar}?g(#acz&_2{+gD}GT#J4-!dp}MMC0H{KAj9bob>>Bweac5?t%|nV{2ok-fpprz5)Zz(s4KHd984< z_g?-P!&R}@YQ3E-fqRdw=|;eK&nx_$j(q=EwK5yg>3bNw*iWk8ga00|fs*g;c5`OD zZS9T?bL5Kc7JV6KU#)htQlD&3>1SW!_El{Sr0F@2+t>I^jq#cs$y@huZu7FeVCDLq zQ|`oQbLGXp#c;Er6Co>b~!5AkQ-N zmB^mC`YL$YuCCps-S=F!t84E{cHeT@uCCpBchaNp%w=9zV8)AikAc~fSYHVz+?eR&Cs+Wy2?@3rt=s2?&e-cjVYKQZI< z_dS*SQ@6j^vvcf*;WxL4HMegd;?(u=2d<3qV_E!m1!jzX z(~!L%g}Ya|KF8p$=+(W7&4Khk4lnOjeI?YD?9RIO@K@JvUE`hevRz%f{cHad+_`>! z(w%+%!>+Es>oO*!8@`fi)>B@BXWX4VEk*YX#I*OLJ9lD|{udQEe^~lkU(B5Pdq3t9 z-;i|QU*x|8+5Gxn!Cz;qA2QbxxO(Ke0=ZMyJNk($}2o zem7k9y$)^;`@W99%C|r+b@y~zp=H?`PS~^DkT7w{Io|?)OGa`&g3WEZmR(x#&uEf8X`>Y?tBxF1Wtl!3ti6 z-y6^Qd@otyqi$bE;riIuF}S*Q-vc+Vn0=`qPgtDCiKOd)D#_MT{}|kRu&?lc5ZUjB zy7eD|x*%ugQMkU=H2zy~ zdio>!rI7RK_rdR%m}I}!`ZN5wYDMj~T^=AcGH*-Sv z?ESf%w|{|nZuVAKgUZD41psz0JYmu)n>Bg@w>At;z{4Yk=M?CVs1X)~imGk$bYmfXdMZPxa=D!Xq=U;=ak9g#N8M3(KD(81Dw4471 z_$#0rlWzW-pvb=t`DRETaqq_Wcq=6C@=Tm9F=gj!Lz11T%}E}BZ-M^JNp6KZ-|~OZ z#~tujK`!k>aP4yY?1kS6nZtRphi$W1PqrO-2Q&`U1`oXxu-XE6H8k)y9MP;d?y(;qCps1&93ewkaoXapKO1dK^q_I?7kP> z`Z2rjLp}~!PumG7V&9LfJ!bblWb=u~?0x`QJZATPWS4zu`yeD{U&?U~A3}~kP9c97 ziaxZ({=NT?B>TcNJ0C@NKD`rd-pfh2xcQCwI3yPOCy-Yccuz5ppDg4o6JN+Xc1Ax1 znODEtAbrez8m=vR|1@&+K8E}mD0AHkd>*o1ypt~^ zOk9e0@_?A7`F8Welg z_8_FMv-WjJd(6u>67~@MVdi@m{F{)tnBTfb;4bGy+ryBU^P+6-1@OnAMbHlJ>M{7Y z6DIER9H;Sp6#gAZyRpmQ--VulrqJiXzn8E^^8bFq?xRQJe*l?7+%q|oFyD0aCRe{7 zZm)9n14)<18U7I2GmP)ekC4TtAoFVzGv05B`DWn8KMDT{bS~-k|5Io_6#s8|3Rxd< zf0v!3pFvMSE^C~Hic2>selZtf`g^9oggjIA1@K=%<@ L+W$+ITcQ5}wX$pv diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 924100d4..703de2c0 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -313,7 +313,9 @@ namespace SHADE camera.orthoProjMatrix(2, 3) = -n / (f-n); camera.orthoProjMatrix(3, 3) = 1.0f; - //camera.orthoProjMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); + //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.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 64fc2431..14326b93 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -283,6 +283,7 @@ namespace SHADE "Albedo", "Scene", "SSAO Blur", + "Position World Space" }, { SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS .data()}); @@ -290,7 +291,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* DEFERRED COMPOSITE SUBPASS INIT */ /*-----------------------------------------------------------------------*/ - auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data(), deferredCompositeShader, {"Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Scene"}, {}, SHLightingSubSystem::MAX_SHADOWS); + auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data(), deferredCompositeShader, {"Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Position World Space", "Scene"}, {}, SHLightingSubSystem::MAX_SHADOWS); deferredCompositeCompute->AddPreComputeFunction([=](Handle cmdBuffer, uint32_t frameIndex) { lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index c3ba7ec3..31f95921 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -395,7 +395,8 @@ namespace SHADE switch (lightComp->GetLightData().type) { case SH_LIGHT_TYPE::DIRECTIONAL: - 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))); + 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(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 {}; case SH_LIGHT_TYPE::SPOT: @@ -517,7 +518,7 @@ namespace SHADE if (auto renderer = light.GetRenderer()) { //SHMatrix orthoMatrix = SHMatrix::OrthographicRH() - renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(9.0f, 9.0f, 0.1f, 20.0f)); + renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(5.0f, 5.0f, 0.1f, 20.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 6d7e6104..a5dd929c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.cpp @@ -17,7 +17,7 @@ namespace SHADE SHPipelineLayoutParams params { - .shaderModules = std::move (modules), + .shaderModules = std::move(modules), .predefinedDescSetLayouts = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING).descSetLayouts }; @@ -35,6 +35,7 @@ namespace SHADE auto const& subpassColorReferences = subpass->GetColorAttachmentReferences(); colorBlendState.attachments.reserve(subpassColorReferences.size()); + for (auto& att : subpassColorReferences) { colorBlendState.attachments.push_back(vk::PipelineColorBlendAttachmentState