From a89aebd3811c3f44f18439142bedaf16956cc168 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Thu, 14 Jul 2016 23:44:08 +0200 Subject: [PATCH] Added shaders for deferred shadow example --- data/shaders/deferredshadows/debug.frag | 43 +++++ data/shaders/deferredshadows/debug.frag.spv | Bin 0 -> 2704 bytes data/shaders/deferredshadows/debug.vert | 27 +++ data/shaders/deferredshadows/debug.vert.spv | Bin 0 -> 1508 bytes data/shaders/deferredshadows/deferred.frag | 160 ++++++++++++++++++ .../shaders/deferredshadows/deferred.frag.spv | Bin 0 -> 9372 bytes data/shaders/deferredshadows/deferred.vert | 36 ++++ .../shaders/deferredshadows/deferred.vert.spv | Bin 0 -> 1392 bytes .../deferredshadows/generate-spirv.bat | 9 + data/shaders/deferredshadows/geom.spv | Bin 0 -> 1620 bytes data/shaders/deferredshadows/mrt.frag | 33 ++++ data/shaders/deferredshadows/mrt.frag.spv | Bin 0 -> 2412 bytes data/shaders/deferredshadows/mrt.vert | 50 ++++++ data/shaders/deferredshadows/mrt.vert.spv | Bin 0 -> 3136 bytes data/shaders/deferredshadows/shadow.frag | 11 ++ data/shaders/deferredshadows/shadow.frag.spv | Bin 0 -> 528 bytes data/shaders/deferredshadows/shadow.geom | 30 ++++ data/shaders/deferredshadows/shadow.geom.spv | Bin 0 -> 2284 bytes data/shaders/deferredshadows/shadow.vert | 19 +++ data/shaders/deferredshadows/shadow.vert.spv | Bin 0 -> 760 bytes 20 files changed, 418 insertions(+) create mode 100644 data/shaders/deferredshadows/debug.frag create mode 100644 data/shaders/deferredshadows/debug.frag.spv create mode 100644 data/shaders/deferredshadows/debug.vert create mode 100644 data/shaders/deferredshadows/debug.vert.spv create mode 100644 data/shaders/deferredshadows/deferred.frag create mode 100644 data/shaders/deferredshadows/deferred.frag.spv create mode 100644 data/shaders/deferredshadows/deferred.vert create mode 100644 data/shaders/deferredshadows/deferred.vert.spv create mode 100644 data/shaders/deferredshadows/generate-spirv.bat create mode 100644 data/shaders/deferredshadows/geom.spv create mode 100644 data/shaders/deferredshadows/mrt.frag create mode 100644 data/shaders/deferredshadows/mrt.frag.spv create mode 100644 data/shaders/deferredshadows/mrt.vert create mode 100644 data/shaders/deferredshadows/mrt.vert.spv create mode 100644 data/shaders/deferredshadows/shadow.frag create mode 100644 data/shaders/deferredshadows/shadow.frag.spv create mode 100644 data/shaders/deferredshadows/shadow.geom create mode 100644 data/shaders/deferredshadows/shadow.geom.spv create mode 100644 data/shaders/deferredshadows/shadow.vert create mode 100644 data/shaders/deferredshadows/shadow.vert.spv diff --git a/data/shaders/deferredshadows/debug.frag b/data/shaders/deferredshadows/debug.frag new file mode 100644 index 00000000..821de26f --- /dev/null +++ b/data/shaders/deferredshadows/debug.frag @@ -0,0 +1,43 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable + +layout (binding = 1) uniform sampler2D samplerPosition; +layout (binding = 2) uniform sampler2D samplerNormal; +layout (binding = 3) uniform sampler2D samplerAlbedo; +layout (binding = 5) uniform sampler2DArray samplerDepth; + +layout (location = 0) in vec3 inUV; + +layout (location = 0) out vec4 outFragColor; + +float LinearizeDepth(float depth) +{ + float n = 1.0; // camera z near + float f = 96.0; // camera z far + float z = depth; + return (2.0 * n) / (f + n - z * (f - n)); +} + +void main() +{ + vec3 components[3]; + components[0] = texture(samplerPosition, inUV.st).rgb; + components[1] = texture(samplerNormal, inUV.st).rgb; + //components[2] = texture(samplerDepth, inUV.st).rgb; + // Uncomment to display specular component + //components[2] = vec3(texture(samplerAlbedo, inUV.st).a); + + // Select component depending on z coordinate of quad + highp int index = int(inUV.z); + if (index == 2) + { + float depth = texture(samplerDepth, vec3(inUV.st, 0.0)).r; + outFragColor = vec4(vec3(1.0-LinearizeDepth(depth)), 1.0); + } + else + { + outFragColor.rgb = components[index]; + } +} \ No newline at end of file diff --git a/data/shaders/deferredshadows/debug.frag.spv b/data/shaders/deferredshadows/debug.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..241d10fca2e045fc37fd575418a21e003607c072 GIT binary patch literal 2704 zcmZ9NYjadZ5QZnoZZ2Gsa2G);D;iNW0*0FiWCIc}fdmlozHG85$--tgwYyYVeA2S4 z^0)XaEdP{Zm6p$QGE*EfRHyrWyL+Z*y3aB+cyc6!0sf7KcGzC~!XP+=-C;P_3yb#` zXL|j{%dt{P0c@DrDV%HGdOxf6HtLP6TkEVm&Q|-qmt$}>+v~Mfy}kalzMj=)&z;$-uRaN7b}F7*=A>Pm zvDj>9^=|W7b~D@RZ=6~?dnM$tWB3|U=rZ-}L0ho)IC?GGljvu;T@KUe)z0Qtr=7K} ztIV6c3)ib}Znd)Ra;MkqH#_ZofA8IFKll=r$6bCAcc;_cthaK$6sqWEyOI4E@on^r zx`xADaNIw?0WjasH|;#_-|E)aZ**Fn?lxZvKVbNbn=wuu^Q*0utkD54@KVbK6KU#!0z{nlID&$^27V&k2r1MKR)6_8l_FxD`7Dwk3| zN6wO5h4V+FEq59$zZVJNr|St%+TTwudhLGiY-w zh<>p>l=FUmte)pvia&_hZ^rx!XzMpW)q4rs{B)i@cNss2Hr{)s_nF6bfBiSm=6Yt@ z?-OkO2l@Lc+IP5vF1~{~uB3g3C9rYsyR4HXXI)}v&E+}n^&m$t>iQ;P^S{Hkhu+_O zv9l?c?&&PLE-<~;>l?X@`5VTWHrAd`Bff)p4qYu^`P)0N->3Xl;_c;ohPpSsh(@t@``I`J=fu^$62!;u{qZ34BbS0k9owJ?C-~jd>ici z-HM#~)rgJNw}8m~&VJ6^XOVLj{~~@7?fQp!eV-%ih<(;}A7||z;+&;-xsP4!(-&Yl z#pONka;EkApMZW>;vQnl8MjPS1^pFbtUhNr_4#XT&)1*wzr~h!d2i=TF1=9=TTY)d zC%zo(d4#QD! z`x|GDIQb4>oBM05?I8AkL_WnF!gkMu4`ZA2bIdt{ZH#=1c?H|E5|s^vJg`{+w?uVH(hzTe{cC$Ozs-+#QJ*!TV)=lj5} literal 0 HcmV?d00001 diff --git a/data/shaders/deferredshadows/debug.vert b/data/shaders/deferredshadows/debug.vert new file mode 100644 index 00000000..af5ced49 --- /dev/null +++ b/data/shaders/deferredshadows/debug.vert @@ -0,0 +1,27 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable + +layout (location = 0) in vec3 inPos; +layout (location = 1) in vec2 inUV; +layout (location = 3) in vec3 inNormal; + +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 model; +} ubo; + +layout (location = 0) out vec3 outUV; + +out gl_PerVertex +{ + vec4 gl_Position; +}; + +void main() +{ + outUV = vec3(inUV.st, inNormal.z); + gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); +} diff --git a/data/shaders/deferredshadows/debug.vert.spv b/data/shaders/deferredshadows/debug.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..4300cf84548add6c1a36d80a5c8c3c5e782631f3 GIT binary patch literal 1508 zcmY+ETW=FF5QUv=5(s`8DQHw`;?d!KrpX));RKHEmI zU;-;dvuMs)yQc4Pl%zOkh4aFqa80-`1o~7p|I((K6y099_i;a*#*-+Iia4Bpjs|fa zX2)ORlVbY6MoURL3`bEqoJGSp+}+upL?>TOU6D@b#V2<*D-Mq|<5NeHT33GE)|900 zvV0tkv?Qisu4o>P!hW0|#d#5bgKszmHWtfdLKUf-U@ynoZm-oVv(C#TbefohWFtZ_`D5& z)@AKtUrRAK8}_QKhUTWQCOvuZS#Qdpb2j`-=ko?wN6+g-Pb~EGs3O3l$EUw=tS>m* z$HS-JtgmRD-ZTZqmh+cn`}mh+qa`Q#*PYEf-B4BB6&$&)YNk#&YQg9C0!OavnwtXg z$c2AHV64lhZ^SBNm-ht+h~LyqUEBxp@mqqgb<^4Cef-<9D*}4X&i&xC&Y89ZW4^y3 z{u5c$N)6BTN{CA>4EWz-cssAe((elbz1|Z`pOyuBOaIUi|FQu8K^puOfqe|mt;&X@ zuD(><)tZ2oHDbJ01-t`z@^RL-!1?JR`8fA20p4rw$VNjSyymWK_@9cyo_hlO;L(u( zfk3Z(jSn5C=^yvVan$W~9mmnTz9P}f#{&D&vrf-{C^u{T0h1pMHFF0$0`G=%ac+Ec Jf7GED!e1~-UPJ%@ literal 0 HcmV?d00001 diff --git a/data/shaders/deferredshadows/deferred.frag b/data/shaders/deferredshadows/deferred.frag new file mode 100644 index 00000000..1a9ee55d --- /dev/null +++ b/data/shaders/deferredshadows/deferred.frag @@ -0,0 +1,160 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable + +layout (binding = 1) uniform sampler2D samplerposition; +layout (binding = 2) uniform sampler2D samplerNormal; +layout (binding = 3) uniform sampler2D samplerAlbedo; +// Depth from the light's point of view +//layout (binding = 5) uniform sampler2DShadow samplerShadowMap; +layout (binding = 5) uniform sampler2DArray samplerShadowMap; + +layout (location = 0) in vec2 inUV; + +layout (location = 0) out vec4 outFragColor; + +#define LIGHT_COUNT 3 +#define SHADOW_FACTOR 0.25 +#define AMBIENT_LIGHT 0.0 +#define USE_PCF + +struct Light +{ + vec4 position; + vec4 target; + vec4 color; + mat4 viewMatrix; +}; + +layout (binding = 4) uniform UBO +{ + vec4 viewPos; + Light lights[LIGHT_COUNT]; +} ubo; + +float textureProj(vec4 P, float layer, vec2 offset) +{ + float shadow = 1.0; + vec4 shadowCoord = P / P.w; + shadowCoord.st = shadowCoord.st * 0.5 + 0.5; + + if (shadowCoord.z > -1.0 && shadowCoord.z < 1.0) + { + float dist = texture(samplerShadowMap, vec3(shadowCoord.st + offset, layer)).r; + if (shadowCoord.w > 0.0 && dist < shadowCoord.z) + { + shadow = SHADOW_FACTOR; + } + } + return shadow; +} + +float filterPCF(vec4 sc, float layer) +{ + ivec2 texDim = textureSize(samplerShadowMap, 0).xy; + float scale = 1.5; + float dx = scale * 1.0 / float(texDim.x); + float dy = scale * 1.0 / float(texDim.y); + + float shadowFactor = 0.0; + int count = 0; + int range = 1; + + for (int x = -range; x <= range; x++) + { + for (int y = -range; y <= range; y++) + { + shadowFactor += textureProj(sc, layer, vec2(dx*x, dy*y)); + count++; + } + + } + return shadowFactor / count; +} + + +void main() +{ + // Get G-Buffer values + vec3 fragPos = texture(samplerposition, inUV).rgb; + vec3 normal = texture(samplerNormal, inUV).rgb; + vec4 albedo = texture(samplerAlbedo, inUV); + + // Ambient part + vec3 fragcolor = albedo.rgb * AMBIENT_LIGHT; + + vec3 N = normalize(normal); + + float shadow = 0.0; + + for(int i = 0; i < LIGHT_COUNT; ++i) + { + // Vector to light + vec3 L = ubo.lights[i].position.xyz - fragPos; + // Distance from light to fragment position + float dist = length(L); + L = normalize(L); + + // Viewer to fragment + vec3 V = ubo.viewPos.xyz - fragPos; + V = normalize(V); + + float lightCosInnerAngle = cos(radians(15.0)); + float lightCosOuterAngle = cos(radians(25.0)); + float lightRange = 100.0; + + // Direction vector from source to target + vec3 dir = normalize(ubo.lights[i].position.xyz - ubo.lights[i].target.xyz); + + // Dual cone spot light with smooth transition between inner and outer angle + float cosDir = dot(L, dir); + float spotEffect = smoothstep(lightCosOuterAngle, lightCosInnerAngle, cosDir); + float heightAttenuation = smoothstep(lightRange, 0.0f, dist); + + // Diffuse lighting. + float NdotL = max(0.0, dot(N, L)); + vec3 diff = /*ubo.lights[i].color.rgb * albedo.rgb */ vec3(NdotL); + + // Specular lighting. + vec3 R = reflect(-L, N); + float NdotR = max(0.0, dot(R, V)); + vec3 spec = /*ubo.lights[i].color.rgb * albedo.a */ vec3(pow(NdotR, 16.0)); + + vec4 shadowClip = ubo.lights[i].viewMatrix * vec4(fragPos, 1.0); + + float shadowFactor; + #ifdef USE_PCFA + shadowFactor= filterPCF(shadowClip, i); + #else + shadowFactor = textureProj(shadowClip, i, vec2(0.0)); + #endif + + //fragcolor += vec3(diff * spotEffect * heightAttenuation); + //fragcolor += vec3(diff * spotEffect * heightAttenuation) * shadowFactor * ubo.lights[i].color.rgb; + fragcolor += vec3(diff * spotEffect * heightAttenuation) * ubo.lights[i].color.rgb; + + shadow += shadowFactor; + //if (shadowFactor > 0.5) + // fragcolor += vec3(0.25); + //else + // fragcolor += vec3(1.0-shadowFactor); + //fragcolor += (diff + spec) * spotEffect * heightAttenuation * shadowFactor; + } + + for(int i = 0; i < LIGHT_COUNT; ++i) + { + vec4 shadowClip = ubo.lights[i].viewMatrix * vec4(fragPos, 1.0); + + float shadowFactor; + #ifdef USE_PCF + shadowFactor= filterPCF(shadowClip, i); + #else + shadowFactor = textureProj(shadowClip, i, vec2(0.0)); + #endif + + fragcolor *= shadowFactor; + } + + outFragColor.rgb = fragcolor;// * shadow; +} \ No newline at end of file diff --git a/data/shaders/deferredshadows/deferred.frag.spv b/data/shaders/deferredshadows/deferred.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..5b3d628f17ae7f978748e2badd0578778075dbd5 GIT binary patch literal 9372 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 F{tvC+oc90# literal 0 HcmV?d00001 diff --git a/data/shaders/deferredshadows/deferred.vert b/data/shaders/deferredshadows/deferred.vert new file mode 100644 index 00000000..b8926636 --- /dev/null +++ b/data/shaders/deferredshadows/deferred.vert @@ -0,0 +1,36 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable + +layout (location = 0) in vec3 inPos; +layout (location = 1) in vec2 inUV; + +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 modelview; + mat4 lightMVP; +} ubo; + +layout (location = 0) out vec2 outUV; +//layout (location = 1) out vec4 outShadowCoord; + +out gl_PerVertex +{ + vec4 gl_Position; +}; + +/* +const mat4 biasMat = mat4( + 0.5, 0.0, 0.0, 0.0, + 0.0, 0.5, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.5, 0.5, 0.0, 1.0 ); + */ +void main() +{ + outUV = inUV; + gl_Position = ubo.projection * ubo.modelview * vec4(inPos.xyz, 1.0); + //outShadowCoord = (biasMat * ubo.lightMVP * ubo.modelview) * vec4(inPos, 1.0); +} diff --git a/data/shaders/deferredshadows/deferred.vert.spv b/data/shaders/deferredshadows/deferred.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..bc47c34a89840040e067fb3a5788758c287f5f9e GIT binary patch literal 1392 zcmZ9K*>2N76ow}&g#x9NE^NhVT2`s5P(etDrM*cnf(W4I)^Z!mHKcZAJHTaM0Un8` z;s%NT8+)q2L?`F`|D4^^sCO?IQ`2wGJT~Q7G<9KP=1tq`UjI{nJ1<7tyU%v;xM~{K z5uXKf(b`S@p9XOPfSH$ElX#Mbes$?z3TW!K*Z226?)!N-39_IF{rn^tg_)loeGZR{ z{9hkk#YyCkgCv>;QRweJ-I)Z(UrbAxW^00}n@)?vp){Bt;>1GXw)!?E8vBDV8-`gC zeisy5^4Q#^d0fP4BL9Z%A0GRL^x^({>yOQuWGNlve$KO#({vP$zsBJ=+2qHc`Nwf| zQoI`uWZIl7($k|f)#|8wV!tt;EH_{U1l|**Gw9XA&0&=i=zu?S>iI$A*OCaHoV8d$Qe5 zmNY53I?BOo#9oormi8p8%10eAcb@Q^G`{dJE6kgL=%xFSER|uyIWTj z`-UTSL7F^pcg{Y|fhSk~F!>+~v1{b3%<}VP;`x)Bv+HH{WVy z6XR;!lI{9ucl7V(y;t4AlMn1w9P#*WNQ^mqL;Z)ch^5cx`qI>;Uk?0lF?|15V%gzk z3Hy7kTlNgzlLvjSN$8y&;7`vtCGgJYwrqTu!TH>g4gXVlh`B2v4jvz7=}0`u2l+5V zR|3az+@@@}+6=ccV{l<2IKcfm0n2x E0suH!@Bjb+ literal 0 HcmV?d00001 diff --git a/data/shaders/deferredshadows/generate-spirv.bat b/data/shaders/deferredshadows/generate-spirv.bat new file mode 100644 index 00000000..9941aec7 --- /dev/null +++ b/data/shaders/deferredshadows/generate-spirv.bat @@ -0,0 +1,9 @@ +glslangvalidator -V debug.vert -o debug.vert.spv +glslangvalidator -V debug.frag -o debug.frag.spv +glslangvalidator -V mrt.vert -o mrt.vert.spv +glslangvalidator -V mrt.frag -o mrt.frag.spv +glslangvalidator -V shadow.vert -o shadow.vert.spv +glslangvalidator -V shadow.frag -o shadow.frag.spv +glslangvalidator -V shadow.geom -o shadow.geom.spv +glslangvalidator -V deferred.vert -o deferred.vert.spv +glslangvalidator -V deferred.frag -o deferred.frag.spv \ No newline at end of file diff --git a/data/shaders/deferredshadows/geom.spv b/data/shaders/deferredshadows/geom.spv new file mode 100644 index 0000000000000000000000000000000000000000..0f7a014907b210fe7ad5afaf8db9028e610bdb6c GIT binary patch literal 1620 zcmZ{j+iDa+5QaP1LlUDon3IPXCnoU}U4ldrL}4|s2KGV>csq=nW;43ZE;|!ZuY4t6 z!N<_|5ETUfuXj3(gXy8Ds=unM{;uw+jBiXBGp29SG|Xttn{j={Oq;rJV_NNlb|cLW z8@u;+$e1w|l#9)pDd$z?zl-7od{S~oa#gY^nNtSwWoK8NEz|Yzu`7kxCE0YS=!3^s zk*KOqs~t99J`Gblh=x&S!}KURw8OCf`i<>m>AyJ&#Ys2pMM?KK>e_Jk-p(NEyfrmd zDsrs}fp51Lwxf@BC{sw?@fWtAyzh6SEbb@!d%`Q`oZ@kw183#Du)|k&nAs0+18HiP z`GB)r-vXaN*lB!-oyLdQ|M^tieXEaq2rW&T*-lHQB>21weDLRD?PmqX@)*3p&>kDT z$x&~Q!Gk>Rv?W&5Bae6>%_`Oo%m*i`Qj?}O^W}eL#*gJQXWj~T z@I=}E?P8P1?0;$htTc7dKeTUN`n-fid_kHx+Sgr_O^q+=&ONP2z_`EPs)0Wzp%#0w z{oXCv>}`r6=f5FgCg5-)kMrM@5NoOjbGa?yPRQX5_~d-kbl?eRdZB%42UAIS(G4#5Fils%hrKx#nsK()b8?GtNd=2 zf5~6v7pr`pv(waZQl0L8`!et8nMoQmi~CY~ji3GLr!-y1(hPn|2h&`oSJ$4bEsZDJ zOUqX;n{hZbszh^+q(f;It?U;4(!lG;JaQ6gA>SbD$R_e5a+G@W*%+(AZYljuvso%v z*Saf@JKb?_uNW1RUU&R+vE3VWhtGfMy_k&upF^l$?sNx5x%0Bv>2;T{T;3~Q{F<6{ zs`F`r$Z7a;vN0U@C;edw(yTc4%dO#PunnF-8tDXiay2ghez`sz?G^*fD*i6o?=ap% z_sdPT@0F7ZYotYVC)*#PH#_TO&ZZmKlaf|dY+q`l$Hng6pf{Rs@SxZOs&buIzkK>^ z>NhJsaDPR_z2yM5GI-wG9#(a8=_xw*yfYjON7MS*YUcfN3awUCPU#(kEPc;P-&581 zyX)~*_MNHmHu^l`3V#86Cj0WYo+GW|&a>{zT|e^WUGJxFzo_@lME-HAtXrsV&a}rV z>^ZO&avFZ#D}DL4_`M(Pw~61#zV|`Q`~zt7_02zsc5iX>^_`K}MSOD)BPsoU+x+8L z_O9nUL-S7(KZ9-|F6;HrBF3$M6CIpmzgCW)A$|ed-ofufZ1cr~&nMWfv)uHXXgS)y zzQR98r&|QfbN|~pNzDEA+Zl5{9c=qKck}O{?Imu$zGp5LeC}bh+Lx%5`+dZjg;?jg zcsKm6@Vy)1%fq|iGVVEe7u@F>Z$LhtvCEo&K$>WCJ(ClNa|++LTlW`hzBBc`*5kfe z{hRdj8xA4fgGcP*JdR`x^$I(hF*!!wv5d)ggO2um1F_zGly{t3Gd3vwKotHUZBVzi#`4yy{{SMl@<(X`8pS-Jg z5p%>J@@fyDR}pc=<@fnLe^O)oJH#CS4*Zd^?=yZM9rtJr+gf`Y|10M{z?P?RzrnXC z7H9qtTP)_hfi30=>=Cw@{R4ZPvFYrmZ}AD3_2wIox44dNEavnK+rLNp&S?v&&*=wz QbHwGmi5B}82G^1Q0At9SDgXcg literal 0 HcmV?d00001 diff --git a/data/shaders/deferredshadows/mrt.vert b/data/shaders/deferredshadows/mrt.vert new file mode 100644 index 00000000..a8d3ee02 --- /dev/null +++ b/data/shaders/deferredshadows/mrt.vert @@ -0,0 +1,50 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable + +layout (location = 0) in vec4 inPos; +layout (location = 1) in vec2 inUV; +layout (location = 2) in vec3 inColor; +layout (location = 3) in vec3 inNormal; +layout (location = 4) in vec3 inTangent; + +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 model; + mat4 view; + vec4 instancePos[3]; +} ubo; + +layout (location = 0) out vec3 outNormal; +layout (location = 1) out vec2 outUV; +layout (location = 2) out vec3 outColor; +layout (location = 3) out vec3 outWorldPos; +layout (location = 4) out vec3 outTangent; + +out gl_PerVertex +{ + vec4 gl_Position; +}; + +void main() +{ + vec4 tmpPos = inPos + ubo.instancePos[gl_InstanceIndex]; + + gl_Position = ubo.projection * ubo.view * ubo.model * tmpPos; + + outUV = inUV; + outUV.t = 1.0 - outUV.t; + + // Vertex position in world space + outWorldPos = vec3(ubo.model * tmpPos); + + // Normal in world space + mat3 mNormal = transpose(inverse(mat3(ubo.model))); + outNormal = mNormal * normalize(inNormal); + outTangent = mNormal * normalize(inTangent); + + // Currently just vertex color + outColor = inColor; +} diff --git a/data/shaders/deferredshadows/mrt.vert.spv b/data/shaders/deferredshadows/mrt.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..aaa4e3ff21e228612251b6c6df080f53712b567f GIT binary patch literal 3136 zcmZ9NdskFt6o-%8)HKb^OJz7fcZ$f+EK>w4#7IE_yU{Q(2OO9SYi6kawACl5Pt@vD z`A=*0JZH|PBQI<7?%!`;-u=FNAL#EJJDMa%_&Js|lHNL#^nsJ)L^71^a|@3aCOX~f z#MISEJx(S4nWH|ZlQWqllVAibQ^n%Epmvhv)0TYxIeqe%IpJfJ(S-nN%q<;Pp!4M*$`gd)_XTv)wIqY zob~@wOMhiMi1(Fh%}%${+)O>iGtR>8Z?w>lW^c4zFVE*L^UZ4doAHBWc!M3=V%lC! z+ua^-UGgq%txhc~%)Gv}%X|6et^MxGYL0#XS~G*#2eV#af81)w|+VJKtA6}Z2l6zkFm=s z;uqMxi}*&4y}R5+@Qb<4_;cV>>?OoCp5xQ#o_`7K{FqB_n3J6&bA)L3+?Uy{SG(tm z?UkJ8yuw~WtiyA}=Mc{^{ye)jdE>?QQcnA;?B=qTVWR9|+}ZaukDRe$ziGKRtAy?{ z*9g10yhGUE%(=ktg5&H7baQ#0J(y&-2j(!}$L!kWJzwlx$!Y(D-CSW8J7;p9XRd2V zl02Oj+mlZb?Z#hcH2x3|E=6E@A+cqR=YjF%dRc_=h3~3e4PI+x+~(>(8Irs zZY_~tyqLW@s0Y9&ZA48XE6TVFqiY~{~qfVTl>8n-vrB_ zM4WN4^K%h#c4l}n=jJuUS#;jCMcnJ?+J5IW^ISsAC4Y-bJXdZ8`w06eVxAIW4(DeK zkq@7@(DiYi!sl&t`M=0x%sYs2@)7qQx^d23#J!I$A93U8#>&SXK0vq5Kl3|$h_0W! zxt-mQkjqF3@m^y6%;8L4MVv=%&aK#3=k7B^&Uw_|8T=fP{{tWK4aE7CkGL<;BhI{H z{o=m2(GTBu22MWiHj7@o+a0hz@=N*IU!u#qg8K?x?nr_AI_LV>7pdA=o*Vh&NLv-`V7xO$S@WnjK zIWOmmJS*ttkuT<1E%4gneIBEGH}7H1!GDKtt=44?!GDkL*`8xgdH=@zfSAiTeNN{5 zkLcDhis-YR2r1W~Ah*<__3Fie|qT5Xe%j6djCxhZ(g*o96w zxpU5(`aACvSoozyOy%&w<&^d#^`div6m5RusGbzkMUj%ieF5wp)|C%#>~gPM!1Eje5q>Q&ChIs3gdy|C|JioIautoM2+k zJoeLz-;c0wLW@1Z{oTZCcgW{mS(7hx2HruWpL53eA0qPIsMAl*e$-CEj}T*k>vGSJ xvF9Aj?;+C5nm4!^b=Kx$&u=IZ;v9c^c@NfSje9tmHvp(VAcM1#?@;v?_yH>6FsuLo literal 0 HcmV?d00001 diff --git a/data/shaders/deferredshadows/shadow.geom b/data/shaders/deferredshadows/shadow.geom new file mode 100644 index 00000000..04ca7d7e --- /dev/null +++ b/data/shaders/deferredshadows/shadow.geom @@ -0,0 +1,30 @@ +#version 420 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable + +#define LIGHT_COUNT 3 + +layout (triangles, invocations = LIGHT_COUNT) in; +layout (triangle_strip, max_vertices = 3) out; + +layout (binding = 0) uniform UBO +{ + mat4 mvp[LIGHT_COUNT]; + vec4 instancePos[3]; +} ubo; + +layout (location = 0) in int inInstanceIndex[]; + +void main() +{ + vec4 instancedPos = ubo.instancePos[inInstanceIndex[0]]; + for (int i = 0; i < gl_in.length(); i++) + { + gl_Layer = gl_InvocationID; + vec4 tmpPos = gl_in[i].gl_Position + instancedPos; + gl_Position = ubo.mvp[gl_InvocationID] * tmpPos; + EmitVertex(); + } + EndPrimitive(); +} \ No newline at end of file diff --git a/data/shaders/deferredshadows/shadow.geom.spv b/data/shaders/deferredshadows/shadow.geom.spv new file mode 100644 index 0000000000000000000000000000000000000000..290cad980cdec1e70fb5929b8ccd8a90e4f3c70f GIT binary patch literal 2284 zcmZ{l>rNCw5QQ7|!c7I_Dk3hRqN0chh$6^MVG|OGME`CEnBXYPZgv-<{?bSA9ee@b zz~|8SFlu7r`Fgr_G}@%>I;X0us;hd|Oyg*iF%9}_HtQx?ou*NL#<2Ihy`a6#_e!ox#wE8T_aq(i!UtQ2G;|h`yzQLT z6Wf5ZW#mC^?^Q_Fw5XQS^5d0KEvy99pdOZL&w{C-VOJ*%8F#jCBl%?nGeWSSOA{XPm@TK)R&pAm>fAnhqptKph3ae7>IeI6q7$28+gL+hs zi)-Su=DPU$VZ~NRd6bH&$xtKzHbu_bB`O+nFHLAdq?Dj!-mgI z?Yt3x*D2}5gC_@=ZyAo7W}HqOV)8E1G4YufM~&Es0p>Ry4*Q~Z`oT=WtJ<* zrGM|gis2h27H^5~1Ya<{^14kojQ0AU~ik2PF(KAtY#(558mIOd)<~`^Y@&S&i&r19_)7{_`s8g zp2GP&3(~29Jk0aHg#INt5I}QDDW13 z6s-KfdZW|f(x1JWk}Cbavt%myz40oWL}}(nGdqdq_FdOXTgm$g7T!NxS@Rep?#?EU zHp$jGWz7!Gfs4~H3*$(&oO~{DdSJdV5-sm4X7;X(L(Cp(vcBwA8Jn7599Q+g*bjQ@ zZStE!!H@F|t~D)b%EEdw_TN*i2b99(_~lPbA7Jpj5L)u!iRlZhE!D1kPu3B)Cr`|7 zyW;2#j5>9BYJyRRm^TLNE2e%!#zB85&mH8WCuTk{_?A4m@aNhMvvMy7{8LCt{z@pd i*%^Ibi)B7yIP#BV)E+B?x@{S~(GPlJG+(;?LiP=@wnHxf literal 0 HcmV?d00001