From 826df94c96d9576a0a27930c699058097b961916 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 6 Mar 2023 00:02:06 +0800 Subject: [PATCH] Shadows WIP --- Assets/Shaders/Anim_VS.glsl | 9 +- Assets/Shaders/Anim_VS.shshaderb | Bin 6053 -> 6505 bytes Assets/Shaders/DeferredComposite_CS.glsl | 32 +++-- Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 10085 -> 11109 bytes Assets/Shaders/ShadowMapBlur_CS.glsl | 58 +++++++++ Assets/Shaders/ShadowMapBlur_CS.shshaderb | Bin 0 -> 4569 bytes .../Shaders/ShadowMapBlur_CS.shshaderb.shmeta | 3 + Assets/Shaders/ShinyHighlight_FS.glsl | 3 +- Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 5273 -> 5397 bytes Assets/Shaders/TestCube_FS.glsl | 7 +- Assets/Shaders/TestCube_FS.shshaderb | Bin 2557 -> 2913 bytes Assets/Shaders/TestCube_VS.glsl | 9 +- Assets/Shaders/TestCube_VS.shshaderb | Bin 4133 -> 4585 bytes .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 112 ++++++++++-------- .../MiddleEnd/Interface/SHGraphicsSystem.h | 1 + .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 19 +-- .../MiddleEnd/Lights/SHLightingSubSystem.h | 5 +- .../RenderGraph/SHRenderGraphNode.cpp | 1 + 18 files changed, 183 insertions(+), 76 deletions(-) create mode 100644 Assets/Shaders/ShadowMapBlur_CS.glsl create mode 100644 Assets/Shaders/ShadowMapBlur_CS.shshaderb create mode 100644 Assets/Shaders/ShadowMapBlur_CS.shshaderb.shmeta diff --git a/Assets/Shaders/Anim_VS.glsl b/Assets/Shaders/Anim_VS.glsl index 2213b2fd..5282f062 100644 --- a/Assets/Shaders/Anim_VS.glsl +++ b/Assets/Shaders/Anim_VS.glsl @@ -20,10 +20,11 @@ layout(location = 0) out struct vec2 uv; // location = 1 vec4 normal; // location = 2 vec4 worldPos; // location = 3 + vec3 worldNormal; // location = 4 } Out; // material stuff -layout(location = 4) out struct +layout(location = 5) out struct { int materialIndex; uint eid; @@ -61,11 +62,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); // Compute bone matrix mat4 boneMatrix = BoneMatrices.data[firstBoneIndex + aBoneIndices[0]] * aBoneWeights[0]; diff --git a/Assets/Shaders/Anim_VS.shshaderb b/Assets/Shaders/Anim_VS.shshaderb index 6318555888e0c1f04b668c241c14b5ab73baa8b8..41ddaec30d51d8329f421590fc375cb48161e8fd 100644 GIT binary patch literal 6505 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 literal 6053 zcmZ9O`FmVd8OLv$WQr6h1zJ#`&ZKCotp&BzDpDF+48_m{TZ${;lDQ2RCo^F(NoieZ za9^Rg3kbOHJMJRl0x6*)(sf zoQj-|oP%sZo`-Blu0dXnEFwpdCFBJ1Z)A{vE0`Z6=@1#l#;3+6CdS6Enwp-Qo0{(( zX=PKbyq!%o^KLfX%NH~KPO13i?djG+v+6L6N42hD);NVV9JOTSGM-I)SvOBxd)v+I z_QGanPbEpRyt(XaeXV@vmfm=JBG?ddGiVjC{b zByab!nXJ1f?WHiau!CA)wO%5MxXpudR=f0*@bv!aUWw3p}Pl%dkC(&2RZj;4c=e(5NoKrhp54OYz_8P zfA6pQQ%ZfQ)cwx6p7+n8zau#F$vFq-nsU|>oLH`Zmj;V`QJZ(qwe>lhisc(<>f*IT zc|LW-b=2Lrx??@{c?b28@7sooy_iGWWyH8Q_anEt%o+Qsqn`$Ee)H(B?wyy@zM9!s z?Ge8Qto>ZfJ5<^e=q ze|6uBoONByTu035x|c9F5P4_CJkMoz@7m3y?mLq+&o<_Isq23!cmR>tU)^^o=ULU6 zcOXe}>b_$+?c>bGYxjKjF}t>$_6cUsS3c_T-ADWs zxbOR9FPm_l%Y|6{CU}PH!Mnf6ZJkaKFEPH_Roct#2PnehW56yX&Z*C^>ce z=XYTM+0OfRf9}Cy+<#&GKI*%H`69%9s(beSjR;-4zX{YY$L{+*1MzK-l4UjXnTX#8 zzXv;6L0up1o~b{b&q3BA<}lZJh`c_&)u$om@S9)`b$ueogYPM7yi!&%c*Z;egWd!xsLcc z^9vCPFKQhH zySJ$IN^rH--RN?TsA~^cu3GC=C0DKWC2+>;uf1C97`kig6SZCqw$@#U=c=xswO!2o zQsf#$|8eGP5&h$SsOuAZyAEt0PUD7-Fux43X0f&dWxw}>wYk4W!6%8FV}ieS_V9Y- zKq*W`9`_nC2f@aeKVohG%PS6T)tHx~8zUDnuK>#{j)<9L5BtzxiCBxd_4S;5oAT~k zpI0Gr(bLy}{Z@KU+{=xKKJugFonpQT@hs0re3Q}Z6s*6)wQgdTi@2M?5$8LMxM{F) z)^D7CauJt-Bd!UKxIqORN|^#HsN-Ul|;`xo5%!N$r( z><7U5Y74&)f{pbK1ot7Zv2qdnVX(g1!tWzsV+SkTN5RI*MeMy`eYN@b#XjDLxEE_O zw?5HNZPBay!PS0#4BdWukHhByuzd9ML9lW1(a(p#(a#6L(T9(NwT+f{@Dt!AB=Xn6 zpG4%NpPvF7Cm(q}4X*a{Gw5=TIIquwjdjG?d=9Lyw($Er*jRfP+!w&c%0=uK!TM?o zzb}D}wRgdN8EmXv#C`>=ueR{}D%jX+Kfi`+9n_cQXGAIf1M~JO_3C{>Mr?kpBby10FX3 diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index 2cf33ae1..18f53de4 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -2,6 +2,7 @@ struct DirectionalLightStruct { + vec4 directionWorld; vec3 direction; uint isActive; uint cullingMask; @@ -22,7 +23,7 @@ layout(local_size_x = 16, local_size_y = 16) in; layout(set = 3, binding = 0, rgba32f) uniform image2D positions; 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 = 3, rgba32ui) uniform uimage2D lightLayerData; layout(set = 3, binding = 4, r8) uniform image2D ssaoBlurredImage; layout(set = 3, binding = 5, rgba8) uniform image2D positionWorldSpace; layout(set = 3, binding = 6, rgba8) uniform image2D targetImage; @@ -54,7 +55,7 @@ float LinStep (float val, float low, float high) return clamp ((val - low)/(high - low), 0.0f, 1.0f); } -float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV) +float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV, vec3 worldNormal, vec3 lightDir) { // clip space for fragment from light view space vec4 fragPosLightPOV = lightPV * worldSpaceFragPos; @@ -69,6 +70,13 @@ float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV if (converted.x < 0.0f || converted.x > 1.0f || converted.y < 0.0f || converted.y > 1.0f) return 1.0f; + float returnVal = 0.0f; + + float worldNormalDotLight = dot (normalize (worldNormal), normalize(lightDir)); + + if (worldNormalDotLight < 0.0f) + return 0.7f; + if (fragPosLightPOV.z > moments.x && fragPosLightPOV.w > 0.0f) { float p = step (fragPosLightPOV.z, moments.x); @@ -76,15 +84,19 @@ float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV float d = fragPosLightPOV.z - moments.x; float pMax = LinStep (variance / (variance + (d * d)), 0.9f, 1.0f); - return min (max (p, pMax), 1.0f); + + returnVal = min (max (p, pMax) + 0.7f, 1.0f); + + return returnVal; + } else if (fragPosLightPOV.z > 1.0f) { return 0.0f; } - else - return 1.0f; - // return step (fragPosLightPOV.z, ); + + return 1.0f; + } void main() @@ -104,8 +116,12 @@ void main() // normal of fragment vec3 normalView = imageLoad(normals, globalThread).rgb; + uvec4 lightLayerAndNormal = imageLoad (lightLayerData, globalThread); + // light layer index - uint lightLayer = imageLoad (lightLayerData, globalThread).r; + uint lightLayer = lightLayerAndNormal.x; + + vec3 worldNormal = vec3 (unpackHalf2x16 (lightLayerAndNormal.y).xy, unpackHalf2x16 (lightLayerAndNormal.z).x); vec3 fragColor = vec3 (0.0f); @@ -138,7 +154,7 @@ void main() if ((DirLightData.dLightData[i].shadowData & uint(1)) == 1) { // calculate shadow map here - fragColor *= CalcShadowValue (shadowMaps[0], positionWorld, DirLightData.dLightData[i].pvMatrix).xxx; + fragColor.rgb *= CalcShadowValue (shadowMaps[0], positionWorld, DirLightData.dLightData[i].pvMatrix, worldNormal, DirLightData.dLightData[i].directionWorld.xyz).xxx; } } } diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index e0b019b110f203343587a12900cb4cdfacd2b8c4..57401b13063ae5536870be4281bf45663baf213c 100644 GIT binary patch literal 11109 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 PzIq4stK-?~cj0dVKJ1B) literal 10085 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 0 && uv.y >= 0 && uv.x < imageSize.x && uv.y < imageSize.y) + { + return imageLoad (shadowMap, uv); + } + + return vec4 (0.0f); +} + +shared vec4 sharedPixels[16 + BLUR_WIDTH - 1][16 + BLUR_WIDTH - 1]; + +void main() +{ + ivec2 globalThread = ivec2 (gl_GlobalInvocationID.xy); + ivec2 localThread = ivec2 (gl_LocalInvocationID.xy); + ivec2 inputImageSize = imageSize(shadowMap); + + // Load color into shared memory + ivec2 start = ivec2 (gl_WorkGroupID) * ivec2 (gl_WorkGroupSize) - (BLUR_HALF_WIDTH); + for (int i = localThread.x; i < SHM_WIDTH; i += int (gl_WorkGroupSize.x)) + { + for (int j = localThread.y; j < SHM_WIDTH; j += int (gl_WorkGroupSize.y)) + { + vec4 value = GetShadowMapValue (start + ivec2 (i, j), inputImageSize); + sharedPixels[i][j] = value; + } + } + + // wait for all shared memory to load + barrier(); + + ivec2 shmStart = ivec2 (localThread + (BLUR_HALF_WIDTH)); + + vec4 sum = vec4 (0.0f); + for (int i = -BLUR_HALF_WIDTH; i <= BLUR_HALF_WIDTH; ++i) + { + for (int j = -BLUR_HALF_WIDTH; j <= BLUR_HALF_WIDTH; ++j) + { + vec4 sharedVal = sharedPixels[shmStart.x + i][shmStart.y + j]; + sum += sharedVal; + } + } + + sum /= (BLUR_WIDTH * BLUR_WIDTH); + imageStore(shadowMapBlurred, globalThread, sum); +} \ No newline at end of file diff --git a/Assets/Shaders/ShadowMapBlur_CS.shshaderb b/Assets/Shaders/ShadowMapBlur_CS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..d02afaf1c4385f91bf082bc5cae9570086ea2cd9 GIT binary patch literal 4569 zcmZ9O3!9Zy700&>XBa@a3ItLO-c2GvGGd~qy+q6q& zq;y`Il`csCnxxYFGz}&ddQH}A(X&%~!B@L`yH|~l4Xj#s?P{0INo}gaH#c>p3V1p) zSZfT)e+Ai!Y(wUeL!ag6WwBNp|E8h;jWL~Ws@;9no}Oy=*1rCck-pKf2b=Z2W@D({ zH_&L+`^Op+b>lipagCw==J-H4ph85sk4lbjfW^%aMz$mBSFEnryJ3`n!`J5%^ka2_1XX?u^q+U zcQyN}g{y05Vz|FH))*e@+EVx{N!^5uWv+2ntm&4XvV@%NsSAH&Xk>h>>yyUZYd8Gp zSgkdNHqLpI=g#5Qo@#4&e8i&e?=IIDF>T2`-B;l0X#_ptJhIIQ(nzgU8_f3opR(K2 z!`RHBRUg>ic%a@K#Uy_v9Vz(1-rP!2^QheTV1bW;qy97C$@-OaqF84>P6b>^Gt${f zZt}1;H^*Cep;DFodJY#O-oCI`fc><+ce9b@*>NPJbtM2U<>9%*vSsKN&jN~f#cKNgKxrn{{8{lW`4cYb# z{LJb4>kBKTl~lL)^_i0oaV{IM-Gj3;_f2SP%bQ!<^OG}vBieZT3BTv5KWxu4;(NgE z+5EBp9bo6Tvbb3(eFH3~M9iJw@|u2Z=Vp(?XlLraVulZa^)JW&{p^#|-iwygcKr{~ zo~^t+Yx{=e^dHE$oc|DQ(YbTy!ajwKyYPD+XONV(Y_^`~ceb!U z$@ez)Am!~&$)!XWs2Q3#rAh9;=QMLO|kv` z3BNP#Vh- z=51i#h5hxQw>}Pv^E4_t3C4C1ocL!MBcNB5o1p9`R13B(n zU}N>!qvtQT3BTuYH{u=_Aoguv-$vw(_kL)9z`gqp+WV(|m)Jh^y@;Rw8d|?Pa_t10 z<0SRG>jQ{fKk^|twC_R8#AIt2v@K|HC8~y=gZPbGcUR+8OBYA`}0}<81tYfid#?^4W}o&7;r# z__pMt#sgsQls?~?_Igfe7WzSC4&oYp#`sp{qlX`Y%RTMGwkQ4O*pIko6FCo{e}p`Y zxNaX}PC4V8q4RVO>ZoxLY)<#&-FXC&^LO3#`sB)INb87vodwVy-G1>^eI{G{bF86sFTkaGR=OyR*I4@_b z?Hw_nI`aJmT%O-wvE?G4J~`LNz4MO5e%=7PpY6OB_wy!lW{MojdwmPucw=I(a^_lt z{u^>O+rGWOBR6K--2XtV)la;!`sF_2MO}~h{~hDzAbzuvFLNdx=<`eX0T zVUAgVj@c{%%fFuA%o4ENV&pyYE=BwKe)N3?ku$eAa$f|te);|_$Ci)Wp9RaA+gV2* z^*hXV9{O{Lb?n=CYuHC8+Rr|W`8?8z*oQd!SOK<=@*Xe7mXDZAz|N-}b1Alb{GGcD z>^gaS?L=Ek9lc%-wio+1-ahR0O0=K78gm6A=X!DUaTR##%)S68A2C;h?X^7DmDuvp z>leYUlegEXrH)=#f$gOeG2TAxbv4@0UXA$@B4@ASxVP)T*JRs!do5z`JM(?K4s4A4 Q|5&SS4s&U*M|*$&4|n0d!2kdN literal 0 HcmV?d00001 diff --git a/Assets/Shaders/ShadowMapBlur_CS.shshaderb.shmeta b/Assets/Shaders/ShadowMapBlur_CS.shshaderb.shmeta new file mode 100644 index 00000000..cc90d5c9 --- /dev/null +++ b/Assets/Shaders/ShadowMapBlur_CS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: ShadowMapBlur_CS +ID: 38004013 +Type: 2 diff --git a/Assets/Shaders/ShinyHighlight_FS.glsl b/Assets/Shaders/ShinyHighlight_FS.glsl index bb41a0fb..be26f866 100644 --- a/Assets/Shaders/ShinyHighlight_FS.glsl +++ b/Assets/Shaders/ShinyHighlight_FS.glsl @@ -57,7 +57,7 @@ layout (std430, set = 2, binding = 0) buffer MaterialProperties // For mater layout(location = 0) out vec4 position; layout(location = 1) out uint outEntityID; -layout(location = 2) out uint lightLayerIndices; +layout(location = 2) out uvec4 lightLayerIndices; layout(location = 3) out vec4 normals; layout(location = 4) out vec4 albedo; layout(location = 5) out vec4 worldSpacePosition; @@ -76,7 +76,6 @@ void main() worldSpacePosition = In.worldPos; outEntityID = In2.eid; - lightLayerIndices = In2.lightLayerIndex; // 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 408bba83d06bbbc37f21629ca6e54476d96e147a..572f3b31d0ed23942fb76dda3dfd28153ef4d70c 100644 GIT binary patch delta 922 zcmZ8gOKTHR82#pzu}w8@+M<>55lpEH1vjM?D+M7fRPeEAbjZL$2;SW&UxNzyO@CSI#^o|5CoPOUq-($|5N#D)9y*6=nY+SPA*kxbD zl2JJ=$8RRyk8~k_1p56i_ne|D>&V;nu%UF|PL*n4E!7CqcwgObw)G$P$BZYQ9737Gs#(SvpM0^MiD@Xdbdv4N~K6rxztKoratt3%gSM9-9?~$eZ{)Nu6vB|MA|KQ}B zg`Ao@q|qd`Q$rffQ5!Q_ZigCARUDzl*($ajAzlG+f`7v06CvaD902yNFoT9l~hSMB1@`s4@ z;^N>kcc%?j8K3;eYlEM~i?+9j2d(S#XJ$Lh*t7vG;a%TB+yoYZY2Y>%@h<#s zo4^v*@-lT`9$*h^D*$_Wr3hfXW4JO}Vsj^;hVjvF8ByQ0K*KGIt{8&Jz^)&yw>da=x9HX2BkEYKgvC MnzObByQNw0FQhwmj{pDw delta 837 zcmYk4OG`pQ7=}lW=bSEf11TtwN+^n`RYW(#2&^EAD7ruw(@~F=9n5MIxM&gWilIgH z2ig>byM95N+O}>{`~E@iYjem?UT5a{zWFYrxBYj0t8z&2D<~2n|i(@o0 z-i?bud!@r}dSC#Ra~BV4(2kUU>{ox|IPfwEdo_gmsO#C{fJ|XQVf~`qQ)60TU5fA7 zi4-}kyu|i7PC%0sV0U ze~tOZp%SB~KzATU_d<;B!MY2P$MEBDh&^Z&V$3cy2Qij|Bq91QkdNmSv<;C*F&zJX zWL~_)9xNyFx>y>3@Lac=!JaIJbe#4O;tR0&BIJ#f$DY0`6y}IW5bu(^x;d9zJvEK^ K66NovA@dhK(P&8k diff --git a/Assets/Shaders/TestCube_FS.glsl b/Assets/Shaders/TestCube_FS.glsl index 90b1922c..678ffb0e 100644 --- a/Assets/Shaders/TestCube_FS.glsl +++ b/Assets/Shaders/TestCube_FS.glsl @@ -17,10 +17,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; @@ -35,7 +36,7 @@ layout (std430, set = 2, binding = 0) buffer MaterialProperties // For mater layout(location = 0) out vec4 position; layout(location = 1) out uint outEntityID; -layout(location = 2) out uint lightLayerIndices; +layout(location = 2) out uvec4 lightLayerIndices; layout(location = 3) out vec4 normals; layout(location = 4) out vec4 albedo; layout(location = 5) out vec4 worldSpacePosition; @@ -48,5 +49,5 @@ void main() worldSpacePosition = In.worldPos; outEntityID = In2.eid; - lightLayerIndices = In2.lightLayerIndex; + lightLayerIndices = uvec4 (In2.lightLayerIndex, packHalf2x16 (In.worldNormal.xy), packHalf2x16 (vec2 (In.worldNormal.z, 1.0f)), 1); } \ No newline at end of file diff --git a/Assets/Shaders/TestCube_FS.shshaderb b/Assets/Shaders/TestCube_FS.shshaderb index 2974523d7405e05bdcf30d419f0663694bcc271b..5374023a8a56c4d4726e2a1768556e058c308433 100644 GIT binary patch literal 2913 zcmZ9MTXz#x6vt1=#aeDf1Vp5!t=0=#Yb}T(U}|d!1{w&``ZQ~rIkcnGnK+qL`sRz@ zNPY3mPvwhi`TtGMDZ#VW&c6N6-uvvmC$l>zO?fIO7GE)D%FLM4=7+J#oHHk6F(v=w z^)dg`@xR1p%(Ursp9Y&dPlCt}`*}PlvOI{>$UcwLJ#*63%loZPud_TXqUE*gD}+8{ zDrE*@pH;r9ICK!kDUMe~XGBV2-ViN`z7jP>Ezzv*gIB?lDyq_$zZI;io2^dJe7qhE z?I6sf;t8T1E(U|1X_Hb~;s22q?VQ+#O2RmO3+IPE8+XcABpV)ETJ zQ!C#-$cAwdXJs#HdfzF%k5iZ5%ZD~Ey4g^+YH6dFqr(>%dXlQ_Fu_(YF?9WxEKedX z>UcXfl=g??3*@B#ZB;;x%wZgBSnA9qOm=OQ;jfvi(hK{%80EH%i)~J}2Vv38v%yAK zgvvFx$!z*rlI7xcO%NQlyZdc+N9r-2cZA7cKb)}fj$NyuIyJ>;h%1-P<1itiS`$+V zIq`8KiqPRb3*xRe=@s)14jt<8@_~!z3!=~XrbIT5jiSKf>dnR;ubUNOt!zpEH<V0 zk52yc`i0Lc9`zw#l*D@)qD#W_AB0YS8~U9V2aEld)0r7I@H67ziG|MJFFO7?-QxS^ zE;u*@hS;aYsS^yb(dh-Y3)0VuH=KUW>CB76{d3}ACu?JN%Ptj)VD zPOZe4JYK&d<_*<$qjLI;?0Xw zXG26h^aT+%da)?p5OLi9>N zns`&c?BZ)8_Lm*KEhK$8FT#FDH~4PQJ^rF(@a(9^Uy_U+JiCkzp4q)GS`zvA%;^JX zZz>z}`$)7P0)vnF5*zHtBK$q4^Z$a4_{@4m#13QU4s++f20Iw$|CxxIeOz{7&Dpnw z;my}Y+{5l`zajbmwSO)fc4}vrz7YA^@%eWW^GoOd&E>cyojlm-72h>B@-d4$BI;!S zd~feMJ9zdK9sIiZHzMlu?_yUroE?1A=^lSiI(R=j@NE%xFzjAOL=E>v)W9A-5Mkfa zo9W#{XT#26*G_2@iMQo+-UzNK`y=tkA|JOanb>vlp7V8;pV;3!8$0b|K9x)kV&d@$0nf|P-|-1U4&>ci?oWMLZKk8DyIL>&@Ju%@O^S8_m5eAnTXaPfFBC}+>Vf$4gwj?yA-%L+t z*Dq^NppgxyVWKYH)EWxhMw<+VQYag}X)nSZuWWyYy$CHW$#x6%%B-=#tV<;lyIbhV z`Ki#4dFipVq2SxyVtY!P6@k&v{v$bfXF)*UR0aHl@PWQ4{;GhV?lXVQ>G&BF9RD4y zcLn~@?0za-o$2;Zu`)!5-xIix^ZUY@u;X~wY1~O?8v^q}CnvGbqq-N{w^2X(_l~`c vmQ&V~YtDX;I#s?a?Wi*As;&LDfKFG;41T5G;(_oN3gAe~ diff --git a/Assets/Shaders/TestCube_VS.glsl b/Assets/Shaders/TestCube_VS.glsl index 1b45c333..07b89b6b 100644 --- a/Assets/Shaders/TestCube_VS.glsl +++ b/Assets/Shaders/TestCube_VS.glsl @@ -20,11 +20,12 @@ layout(location = 0) out struct vec2 uv; // location = 1 vec4 normal; // location = 2 vec4 worldPos; // location = 3 + vec3 worldNormal; // location = 4 } Out; // material stuff -layout(location = 4) out struct +layout(location = 5) out struct { int materialIndex; uint eid; @@ -57,11 +58,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); // clip space for rendering gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); diff --git a/Assets/Shaders/TestCube_VS.shshaderb b/Assets/Shaders/TestCube_VS.shshaderb index 1bb76ec42331e3ece2cf26e15e72fbbb613e2633..e607761c64bec9e2e8ee7eabc6921c6bed9b9f1b 100644 GIT binary patch literal 4585 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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 bbbbd1dd..54e5a1ff 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -141,25 +141,28 @@ namespace SHADE //SHAssetManager::CompileAsset("../../Assets/Shaders/Text_VS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/Trajectory_VS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/Trajectory_FS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMapBlur_CS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/Anim_VS.glsl", false); // Load Built In Shaders - static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); - static constexpr AssetID VS_ANIM = 47911992; animtVertShader = SHResourceManager::LoadOrGet(VS_ANIM); - static constexpr AssetID FS_DEFAULT = 46377769; defaultFragShader = SHResourceManager::LoadOrGet(FS_DEFAULT); - static constexpr AssetID VS_DEBUG = 48002439; debugVertShader = SHResourceManager::LoadOrGet(VS_DEBUG); - static constexpr AssetID FS_DEBUG = 36671027; debugFragShader = SHResourceManager::LoadOrGet(FS_DEBUG); - static constexpr AssetID VS_DEBUG_MESH = 42127043; debugMeshVertShader = SHResourceManager::LoadOrGet(VS_DEBUG_MESH); - static constexpr AssetID CS_COMPOSITE = 45072428; deferredCompositeShader = SHResourceManager::LoadOrGet(CS_COMPOSITE); - static constexpr AssetID SSAO = 38430899; ssaoShader = SHResourceManager::LoadOrGet(SSAO); - static constexpr AssetID SSAO_BLUR = 39760835; ssaoBlurShader = SHResourceManager::LoadOrGet(SSAO_BLUR); - static constexpr AssetID TEXT_VS = 39816727; textVS = SHResourceManager::LoadOrGet(TEXT_VS); - static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet(TEXT_FS); - static constexpr AssetID RENDER_SC_VS = 48082949; renderToSwapchainVS = SHResourceManager::LoadOrGet(RENDER_SC_VS); - static constexpr AssetID RENDER_SC_FS = 36869006; renderToSwapchainFS = SHResourceManager::LoadOrGet(RENDER_SC_FS); - static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet(SHADOW_MAP_VS); - static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet(SHADOW_MAP_FS); - static constexpr AssetID TRAJECTORY_VS = 41042628; trajectoryVS = SHResourceManager::LoadOrGet(TRAJECTORY_VS); - static constexpr AssetID TRAJECTORY_FS = 45635685; trajectoryFS = SHResourceManager::LoadOrGet(TRAJECTORY_FS); + static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); + static constexpr AssetID VS_ANIM = 47911992; animtVertShader = SHResourceManager::LoadOrGet(VS_ANIM); + static constexpr AssetID FS_DEFAULT = 46377769; defaultFragShader = SHResourceManager::LoadOrGet(FS_DEFAULT); + static constexpr AssetID VS_DEBUG = 48002439; debugVertShader = SHResourceManager::LoadOrGet(VS_DEBUG); + static constexpr AssetID FS_DEBUG = 36671027; debugFragShader = SHResourceManager::LoadOrGet(FS_DEBUG); + static constexpr AssetID VS_DEBUG_MESH = 42127043; debugMeshVertShader = SHResourceManager::LoadOrGet(VS_DEBUG_MESH); + static constexpr AssetID CS_COMPOSITE = 45072428; deferredCompositeShader = SHResourceManager::LoadOrGet(CS_COMPOSITE); + static constexpr AssetID SSAO = 38430899; ssaoShader = SHResourceManager::LoadOrGet(SSAO); + static constexpr AssetID SSAO_BLUR = 39760835; ssaoBlurShader = SHResourceManager::LoadOrGet(SSAO_BLUR); + static constexpr AssetID TEXT_VS = 39816727; textVS = SHResourceManager::LoadOrGet(TEXT_VS); + static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet(TEXT_FS); + static constexpr AssetID RENDER_SC_VS = 48082949; renderToSwapchainVS = SHResourceManager::LoadOrGet(RENDER_SC_VS); + static constexpr AssetID RENDER_SC_FS = 36869006; renderToSwapchainFS = SHResourceManager::LoadOrGet(RENDER_SC_FS); + static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet(SHADOW_MAP_VS); + static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet(SHADOW_MAP_FS); + static constexpr AssetID TRAJECTORY_VS = 41042628; trajectoryVS = SHResourceManager::LoadOrGet(TRAJECTORY_VS); + static constexpr AssetID TRAJECTORY_FS = 45635685; trajectoryFS = SHResourceManager::LoadOrGet(TRAJECTORY_FS); + static constexpr AssetID SHADOW_BLUR_CS = 38004013; shadowMapBlurCS = SHResourceManager::LoadOrGet(SHADOW_BLUR_CS); } @@ -217,7 +220,7 @@ namespace SHADE renderGraph->AddResource("Albedo", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second); renderGraph->AddResource("Depth Buffer", { SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT }, true, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint); renderGraph->AddResource("Entity ID", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::SHARED }, true, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); - renderGraph->AddResource("Light Layer Indices", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); + renderGraph->AddResource("Light Layer Indices And World Normals", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); renderGraph->AddResource("Scene", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE, SH_RENDER_GRAPH_RESOURCE_FLAGS::SHARED }, true, windowDims.first, windowDims.second); renderGraph->AddResource("SSAO", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR8Unorm); renderGraph->AddResource("SSAO Blur", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR8Unorm); @@ -231,7 +234,7 @@ namespace SHADE { "Position", "Entity ID", - "Light Layer Indices", + "Light Layer Indices And World Normals", "Normals", "Albedo", "Depth Buffer", @@ -248,7 +251,7 @@ namespace SHADE auto gBufferSubpass = gBufferNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS.data(), worldViewport, worldRenderer); gBufferSubpass->AddColorOutput("Position"); gBufferSubpass->AddColorOutput("Entity ID"); - gBufferSubpass->AddColorOutput("Light Layer Indices"); + gBufferSubpass->AddColorOutput("Light Layer Indices And World Normals"); gBufferSubpass->AddColorOutput("Normals"); gBufferSubpass->AddColorOutput("Albedo"); gBufferSubpass->AddColorOutput("Position World Space"); @@ -258,7 +261,7 @@ namespace SHADE auto gBufferVfxSubpass = gBufferNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_VFX_SUBPASS.data(), worldViewport, worldRenderer); gBufferVfxSubpass->AddColorOutput("Position"); gBufferVfxSubpass->AddColorOutput("Entity ID"); - gBufferVfxSubpass->AddColorOutput("Light Layer Indices"); + gBufferVfxSubpass->AddColorOutput("Light Layer Indices And World Normals"); gBufferVfxSubpass->AddColorOutput("Normals"); gBufferVfxSubpass->AddColorOutput("Albedo"); gBufferVfxSubpass->AddColorOutput("Position World Space"); @@ -314,7 +317,7 @@ namespace SHADE auto deferredCompositeNode = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data(), { "Position", - "Light Layer Indices", + "Light Layer Indices And World Normals", "Normals", "Albedo", "Scene", @@ -327,7 +330,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", "Position World Space", "Scene", "Object VFX"}, {}, SHLightingSubSystem::MAX_SHADOWS); + auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data(), deferredCompositeShader, {"Position", "Normals", "Albedo", "Light Layer Indices And World Normals", "SSAO Blur", "Position World Space", "Scene", "Object VFX"}, {}, SHLightingSubSystem::MAX_SHADOWS); deferredCompositeCompute->AddPreComputeFunction([=](Handle cmdBuffer, uint32_t frameIndex) { lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer); @@ -669,21 +672,21 @@ namespace SHADE #endif } - //static bool shadowAdded = false; + static bool shadowAdded = false; - //if (shadowAdded == false && SHInputManager::GetKey(SHInputManager::SH_KEYCODE::B)) - //{ - // shadowAdded = true; - // auto& lightComps = SHComponentManager::GetDense(); - // //if (lightComps.size() > 2) - // //{ - // // lightComps[2].SetEnableShadow(true); - // //} - // for (auto& comp : lightComps) - // { - // comp.SetEnableShadow(true); - // } - //} + if (shadowAdded == false && SHInputManager::GetKey(SHInputManager::SH_KEYCODE::B)) + { + shadowAdded = true; + auto& lightComps = SHComponentManager::GetDense(); + if (lightComps.size() > 2) + { + lightComps[2].SetEnableShadow(true); + } + for (auto& comp : lightComps) + { + comp.SetEnableShadow(true); + } + } renderGraph->Begin(frameIndex); auto cmdBuffer = renderGraph->GetCommandBuffer(frameIndex); @@ -866,6 +869,7 @@ namespace SHADE 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); if (EVENT_DATA->generateRenderer) @@ -878,17 +882,31 @@ namespace SHADE 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 }, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eR32G32B32A32Sfloat); + 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()}, SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data()); + 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()); // Add a subpass to render to that shadow map - auto newSubpass = shadowMapNode->RuntimeAddSubpass(shadowMapResourceName + " Subpass", shadowMapViewport, lightComp->GetRenderer()); - newSubpass->AddColorOutput(shadowMapResourceName); - newSubpass->AddDepthOutput(depthResourceName, SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH); + auto shadowMapDrawSubpass = shadowMapNode->RuntimeAddSubpass(shadowMapResourceName + " Subpass", shadowMapViewport, lightComp->GetRenderer()); + shadowMapDrawSubpass->AddColorOutput(shadowMapResourceName); + shadowMapDrawSubpass->AddDepthOutput(depthResourceName, SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH); + + // add dummy subpass to transition the shadow map images for compute shader usage + //auto dummySubpass = shadowMapNode->RuntimeAddSubpass(shadowMapResourceName + "Dummy", {}, {}); + //dummySubpass->AddGeneralColorOutput(shadowMapResourceName); + //dummySubpass->AddGeneralColorOutput(shadowMapBlurredResourceName); + + // add compute pass to blur shadow ma + shadowMapNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName, shadowMapBlurCS, { shadowMapResourceName.c_str(), shadowMapBlurredResourceName.c_str() }); + //shadowMapNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName, shadowMapBlurCS, { shadowMapBlurredResourceName.c_str(), shadowMapResourceName.c_str() }); + //shadowMapNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName, shadowMapBlurCS, { shadowMapResourceName.c_str(), shadowMapBlurredResourceName.c_str() }); // regenerate the node shadowMapNode->RuntimeStandaloneRegenerate(); @@ -905,16 +923,16 @@ namespace SHADE tempLibrary.Init(device); tempLibrary.CreateGraphicsPipelines ( - { shadowMapVS, shadowMapFS }, shadowMapNode->GetRenderpass(), newSubpass, + { shadowMapVS, shadowMapFS }, shadowMapNode->GetRenderpass(), shadowMapDrawSubpass, SHGraphicsPredefinedData::SystemType::BATCHING, SHGraphicsPredefinedData::GetShadowMapViState(), rasterState ); - shadowMapPipeline = tempLibrary.GetGraphicsPipeline({ shadowMapVS, shadowMapFS, newSubpass }); + shadowMapPipeline = tempLibrary.GetGraphicsPipeline({ shadowMapVS, shadowMapFS, shadowMapDrawSubpass }); } - newSubpass->SetCompanionSubpass(companionSubpass, shadowMapPipeline); // set companion subpass and pipeline + shadowMapDrawSubpass->SetCompanionSubpass(companionSubpass, shadowMapPipeline); // set companion subpass and pipeline - // add the shadow map to the lighting system - uint32_t const NEW_SHADOW_MAP_INDEX = lightingSubSystem->AddShadowMap(renderGraph->GetRenderGraphResource(shadowMapResourceName), EVENT_DATA->lightEntity); + // 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); 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); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 0b98f843..33227f8f 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -481,6 +481,7 @@ namespace SHADE Handle shadowMapFS; Handle trajectoryVS; Handle trajectoryFS; + Handle shadowMapBlurCS; // Fonts Handle testFont; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index cace495c..cd308487 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -53,7 +53,8 @@ namespace SHADE SHVec4 transformedDir = SHMatrix::Transpose(viewMat) * SHVec4(lightData.direction[0], lightData.direction[1], lightData.direction[2], 0.0f); lightPtr->cullingMask = lightData.cullingMask; - lightPtr->direction = SHVec3 (transformedDir.x, transformedDir.y, transformedDir.z); + lightPtr->directionWorld = SHVec4 (lightData.direction.x, lightData.direction.y, lightData.direction.z, 1.0f); + lightPtr->direction = SHVec3(transformedDir.x, transformedDir.y, transformedDir.z); //lightPtr->direction = lightData.direction; lightPtr->diffuseColor = lightData.color; lightPtr->active = lightComp->isActive; @@ -601,14 +602,14 @@ namespace SHADE } - uint32_t SHLightingSubSystem::AddShadowMap(Handle newShadowMap, EntityID lightEntity) noexcept + uint32_t SHLightingSubSystem::AddShadowMap(Handle newShadowMapBlurred, EntityID lightEntity) noexcept { // Add to container of shadow maps shadowMapIndexing.emplace(lightEntity, static_cast (shadowMaps.size())); - shadowMaps.emplace_back(newShadowMap); + shadowMaps.emplace_back(newShadowMapBlurred); // Just use the image view stored in the resource - Handle const NEW_IMAGE_VIEW = newShadowMap->GetImageView(); + Handle const NEW_IMAGE_VIEW = newShadowMapBlurred->GetImageView(); // Prepare to write to descriptor shadowMapImageSamplers.emplace_back(NEW_IMAGE_VIEW, shadowMapSampler, vk::ImageLayout::eShaderReadOnlyOptimal); @@ -634,13 +635,13 @@ namespace SHADE // add to barriers shadowMapMemoryBarriers.push_back (vk::ImageMemoryBarrier { - .srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eColorAttachmentRead, + .srcAccessMask = vk::AccessFlagBits::eShaderWrite, .dstAccessMask = vk::AccessFlagBits::eShaderRead, - .oldLayout = vk::ImageLayout::eColorAttachmentOptimal, - .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + .oldLayout = vk::ImageLayout::eGeneral, + .newLayout = vk::ImageLayout::eGeneral, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = newShadowMap->GetImage()->GetVkImage(), + .image = newShadowMapBlurred->GetImage()->GetVkImage(), .subresourceRange = vk::ImageSubresourceRange { .aspectMask = vk::ImageAspectFlagBits::eColor, @@ -658,7 +659,7 @@ namespace SHADE void SHLightingSubSystem::PrepareShadowMapsForRead(Handle cmdBuffer) noexcept { // Issue barrier to transition shadow maps for reading in compute shader - cmdBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eComputeShader, {}, {}, {}, shadowMapMemoryBarriers); + cmdBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eComputeShader, vk::PipelineStageFlagBits::eComputeShader, {}, {}, {}, shadowMapMemoryBarriers); } //void SHLightingSubSystem::HandleResize(Handle compute) noexcept diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h index 69b00f2c..3613f762 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h @@ -28,6 +28,9 @@ namespace SHADE // Represents how the data will be interpreted in GPU. we want to copy to a container of these before passing to GPU. struct SHDirectionalLightData { + //! Direction of the light + SHVec4 directionWorld; + //! Direction of the light SHVec3 direction; @@ -213,7 +216,7 @@ namespace SHADE void Run (SHMatrix const& viewMat, uint32_t frameIndex) noexcept; void Exit (void) noexcept; void BindDescSet (Handle cmdBuffer, uint32_t setIndex, uint32_t frameIndex) noexcept; - uint32_t AddShadowMap (Handle newShadowMap, EntityID lightEntity) noexcept; + uint32_t AddShadowMap (Handle newShadowMapBlurred, EntityID lightEntity) noexcept; void PrepareShadowMapsForRead (Handle cmdBuffer) noexcept; //void HandleResize (Handle compute) noexcept; //void RemoveShadowMap (uint32_t index) noexcept; diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp index 34bfe8cd..36d2e20a 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp @@ -798,6 +798,7 @@ namespace SHADE /***************************************************************************/ void SHRenderGraphNode::RuntimeStandaloneRegenerate(void) noexcept { + AddDummySubpassIfNeeded(); StandaloneConfigureAttDesc(false); ConfigureSubpasses(); CreateRenderpass();