From 6faa4e676bc2b39b4beb1c6f85730b1ce1b959a9 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 24 Feb 2023 08:27:04 +0800 Subject: [PATCH] Updated shader for scanline (needs refining) Shader hot reloading is working --- Assets/Shaders/ShinyHighlight_FS.glsl | 19 +++++++++++++++--- Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 3829 -> 5201 bytes .../Graphics/Pipeline/SHVkPipelineLayout.cpp | 4 ++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Assets/Shaders/ShinyHighlight_FS.glsl b/Assets/Shaders/ShinyHighlight_FS.glsl index 511c0704..92020d9a 100644 --- a/Assets/Shaders/ShinyHighlight_FS.glsl +++ b/Assets/Shaders/ShinyHighlight_FS.glsl @@ -62,6 +62,11 @@ layout(location = 4) out vec4 albedo; layout(location = 5) out vec4 worldSpacePosition; layout(location = 6) out vec4 objectVFX; +float map (float value, float srcLow, float srcHigh, float dstLow, float dstHigh) +{ + return dstLow + (value - srcLow) * (dstHigh - dstLow) / (srcHigh - srcLow); +} + void main() { position = In.vertPos; @@ -72,13 +77,21 @@ void main() outEntityID = In2.eid; lightLayerIndices = In2.lightLayerIndex; - float vpHeight = float (In2.screenSpacePos.y); - float scanlineScale = 300.0f * (1.0f - In2.screenSpacePos.z); + float vpHeight = (float (In2.screenSpacePos.y) - (genericDataBuffer.data.elapsedTime * 4000.0f * (1.0f - In2.screenSpacePos.z))); + vpHeight = float (int (vpHeight) % genericDataBuffer.data.viewportHeight); + float scanlineScale = 2500.0f * (1.0f - In2.screenSpacePos.z); float lowerLimit = vpHeight - scanlineScale; float upperLimit = vpHeight + scanlineScale; if (gl_FragCoord.y > lowerLimit && gl_FragCoord.y < upperLimit) - objectVFX = vec4(1.0f); + { + float opacity = 0.0f; + opacity = map (abs (gl_FragCoord.y - vpHeight), 0.0f, upperLimit - vpHeight, 0.0f, 1.0f); + opacity = 1.0f - clamp (opacity, 0.0f, 1.0f); + + + objectVFX = vec4(opacity); + } else objectVFX = vec4(0.0f, 0.0f, 0.0f, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb b/Assets/Shaders/ShinyHighlight_FS.shshaderb index fea73931ac0cab9fef9813b505f0739019fdbdb5..af550ffe7223c404cfc381826e13c34f2c0d149f 100644 GIT binary patch literal 5201 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 NsSDeGRWF!c{tx;q5B&fD literal 3829 zcmZ9OYjYG;5QYzAcY{H0aubo51O(+05CKu-l7z5{E)q!uypF@pWHT_CS!ZVheABZ0 z3;q(cEdA#1@vG&f$|~Pyb~+h2RHtw6>F(2~&n!Ft*zSrowE6I`bDP|V+vd6hliTGs z%i;?D)1CqUx#YizkGL&vap8_PdvD1L!d^Rzx_O#;Q4)lYqom`ux<;|T*;;H(_VQrz z-1#$v-tLBq48-1{e>HJv)sGS!FNn5@c8m6lj*2dbE{U#+J{5IDI~9k0DqPZ#s&(#n z1+6JUv*k_Qp7wfS*U$Vs^m;3P5N2L_|3TQ!d(UFzQn_C2C!N0E3B7Y?&vgCvL&e!b z9FCWyNk55}(`?oIrtinmaujCrkKk|Ky47sWdhKr4>*Y`4(2Jua^nxf;rf4lBR}rVg zMM*pE2US2_i0b+4u3q$@oA#nSN{gPZc^Y7v`$&npwP(D%WfUZHabetbU+Qv7xIs`Na3ocFV^++TNxWV`9- z3t8H|?&rQT4Hq_<4Li?Vpf}VH@YK2zbyi{#hp@xewf8mo6fevoKPIS-8Ig^%<6{LR z(xT>Z@iM>kA$J6a7Im1sTE??N=ovoh2%}&fOV5g$TKuy0jP9KF?D_V_&#)w-*LW(P~)q5<9(Ii^50UG|TTsLB1lL zUgD#d=Cc#hzg5{QIj8%}%X)2tyT`}cxcgzJv2>k{8rShn-7nvgQ8s9yGv`&ESx2W9 z{LDIft<;(I2@wlFIL3Ss=^uH~ zAr@HXjZZf|5J7fxTADD0}K6VlbEJ)Q!$eqFa8xxqNeWi10Hj z_&F2jv6-;*n2mVW2eT0qoAttG0o#iraCXlYk27Pldbslm5sP}ztv|bk0ynNbL*mH$ zBvI>_Xut6MW}tIFWBN-iV6k5+b!G<}_z`jN#2S@EFTi4lL&Tx}O(OinL1*T$?Ul}* zjg|U|Qm3aZ_U{x2Tdji`r4GaEYKuCoPG%PW0ZseM;?zlu>N5SHkO$-dcS!Op;^^c) zD9*x0Y;@+GH7cE1r+(tIm;1*yDw)|uC(f8SeZoc@^l=e3dN3hACSuXs!{Wr`4D|Mh zIC;Q9_=)?v_$Cp4;-VidZTOFs@}S2xcU(F-O`nv^;=I<&wYZ!+Db|>ib(3zENPO#b-p+Yx>-CI=_KcKfizIQ;I?# zc8Pe8yt&JYiSH#5_AAQBn@2bNUdiBjbB5n189R91COY_I;%|tKiYz{}_hxCIQnurg zPl(1vVDMG3C#B`1Z-kl};!P1g_Andhwx=c8_V6xj&rQkrzE|zU_(;SIWB;MF z-IB~(!$)l944cLHSTgxczbzSz#axsO20QziOKgV!L~?ci9qH`?>O!U;9q|q`X32Balrrp diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp index e08be902..fa9bf6bf 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp @@ -298,6 +298,10 @@ namespace SHADE descriptorSetLayoutsAllocate.clear(); + dynamicBufferBindings.clear(); + + descriptorSetLayoutsPipeline.clear(); + // We don't need to use vulkan to destroy descriptor sets here since they are just owned by the container with handles vkDescriptorSetLayoutsAllocate.clear(); vkDescriptorSetLayoutsPipeline.clear();