From 77291fee8811b372a516881e2f5ebdfa2103f7d5 Mon Sep 17 00:00:00 2001 From: Jaremie Romer Date: Wed, 21 Jan 2026 06:13:30 -0600 Subject: [PATCH] Moved from glslang to dxc to enable better debugging --- resources/shaders/compiled/NormalsPixel.spv | Bin 5520 -> 5564 bytes resources/shaders/compiled/PPEndPixel.spv | Bin 1912 -> 1976 bytes resources/shaders/compiled/PPFxaaPixel.spv | Bin 8444 -> 8904 bytes resources/shaders/compiled/PPNoisePixel.spv | Bin 2520 -> 2648 bytes resources/shaders/compiled/PPOutlinePixel.spv | Bin 6936 -> 6888 bytes resources/shaders/compiled/ParticlePixel.spv | Bin 1080 -> 1104 bytes resources/shaders/compiled/ParticleVertex.spv | Bin 2592 -> 2568 bytes .../shaders/compiled/PointShadowMapPixel.spv | Bin 2224 -> 2232 bytes .../compiled/PointShadowMapSkinnedVertex.spv | Bin 5832 -> 6420 bytes .../shaders/compiled/PointShadowMapVertex.spv | Bin 3700 -> 4004 bytes .../shaders/compiled/PostProcessVertex.spv | Bin 1384 -> 1220 bytes resources/shaders/compiled/SkyboxPixel.spv | Bin 1996 -> 2076 bytes resources/shaders/compiled/SkyboxVertex.spv | Bin 2016 -> 1928 bytes resources/shaders/compiled/ToonPixel.spv | Bin 14292 -> 15340 bytes .../shaders/compiled/ToonSkinnedVertex.spv | Bin 5532 -> 5684 bytes resources/shaders/compiled/ToonVertex.spv | Bin 3420 -> 3248 bytes .../compiled/UniShadowMapSkinnedVertex.spv | Bin 5688 -> 6272 bytes .../shaders/compiled/UniShadowMapVertex.spv | Bin 3556 -> 3856 bytes resources/shaders/compiled/WireframePixel.spv | Bin 724 -> 676 bytes .../shaders/compiled/WireframeVertex.spv | Bin 1848 -> 1784 bytes resources/shaders/source/Normals.psh | 22 +++++------ resources/shaders/source/PPFxaa.psh | 36 +++++++++--------- resources/shaders/source/PPNoise.psh | 6 +-- resources/shaders/source/PPOutline.psh | 10 ++--- resources/shaders/source/Particle.psh | 8 ++-- resources/shaders/source/Particle.vsh | 8 ++-- resources/shaders/source/PointShadowMap.psh | 4 +- resources/shaders/source/PointShadowMap.vsh | 6 +-- .../shaders/source/PointShadowMapSkinned.vsh | 4 +- resources/shaders/source/Skybox.psh | 4 +- resources/shaders/source/Skybox.vsh | 4 +- resources/shaders/source/Toon.psh | 30 +++++++-------- resources/shaders/source/Toon.vsh | 8 ++-- resources/shaders/source/ToonSkinned.vsh | 8 ++-- .../shaders/source/UniShadowMapSkinned.vsh | 6 +-- resources/shaders/source/core/Animation.fxh | 14 ++++--- script/shaders.ps1 | 30 +++++++-------- .../graphics2/diligent/DiligentEngine.cpp | 1 + 38 files changed, 106 insertions(+), 103 deletions(-) diff --git a/resources/shaders/compiled/NormalsPixel.spv b/resources/shaders/compiled/NormalsPixel.spv index a89e730448364dfea00672c9f0afcc520b3788ad..25c600b1fb56ed288f73756a95fedaf92d8ff8cb 100644 GIT binary patch literal 5564 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 diff --git a/resources/shaders/compiled/PPEndPixel.spv b/resources/shaders/compiled/PPEndPixel.spv index 6b749480f4e24245ce711246cf8e698c52621c85..855cd283be306d48a05879de82d8d79e20835e19 100644 GIT binary patch literal 1976 zcmZ{l>rPWa6otpu78KpPvPqtQ(^GkfjZ+WQP4nb?^!sWZlyS@TH0kp+`5Ae^6l;QzZ$ zZQ`XKI}Lle_w^`OIXbBw9v_!pxIFgSe>aMqKYd*ae)xu$hOqfH<3XfM7Eh z-wDBnH@R@fcD&*KSe4+44}tqPMQ3zAQ!KM)rQ{zdmU*_N@ZmiW!)&}G@K1_iM&1+{ zZ{n-wyRH-Yp?G{Zq&KDX;!bULa!blAyd7$@liN~oY`)bUDf3m8!`^nK#DKq1Hs9l} z6ddlzclCh-{pd?S_IyvuEUq6r&sp4Yx-Xl3gF8+SbO(2w_y^>3%F8AO+;Q5|9sFOM d;Pyoo;Jz<~KYJkuzR$Hoz8Aiq`dUwapb0+G_&_u6*t!! z-5?AayGOlNhxPH@cUPbBmkR%|aNp3rmmgQRRZk#>J>}(F~bES#-bY_Xw;@ zE7CFLfolkzvL+|{U6*n~-Ta)83B{^@@8d?V?YBCiI_G0duxa&!{$Zu2iOexh?-YOF z;+Yftp^Gzdn!n`Y%+c-~MBOv>nKi{v)z6>cY5k#iPTtsUhUI=3l@I%RL3lFjuwsF~ z*NybJ&L{BX&WOcdHd~!EmJ?4?!jYWvZpb=Cp-7dJ*lpQWxQWq5*xWw|I)}t^X8BYs z;hepcs~f$-t9qQnj>^^2QB;Vln4)^K2RK|;24`d;F~=C(gTbB6;|>^awHTa(jXD^2 zz{VU5uEFSM@4_?K6$gW3uvrJAADHK0@CpWZMNJ8xb5g|m^NAb#|wVjOYT>M2P zyPDD&zC7u)>cA8JVCusWKKCYtUY7Nw1F1ir`ZDT28t;Le|0(%aJ=L3(Pi^-1H1#!h zjNM85P0MF4^4Tf*)F6(XkuuMOBJ9`R^K?e8>i=p^mUocniuGqzYhD5Js7Eh;2M9Q` z+1~{i@tYhZ+_|RSi?ZOi044a`!)NcvjQGAQ%N<*jog>_REX(^6o(HwtWM=k2KK^=& zk-w#LRti7F@hd5|tnZLo>=GgGmk_?0XF{pDA*J4mP`KTe!atmo1HU^`@Nde2-`6Py zPd`;P{^Qp9kMfDVk+!7t;!JJ0dMoAo@TAm+gLhJJ{6*RKQn=z@2A)1h$pPOM#ygu* zaAyCl9`vUdJ?RC9Z7J{Yq|}DbjuhO^v#T@QgWGxbbOyKcbai&;@#T{PZs!Sf20uFw dbN$f7%=|^l-0(p@vpyGh?26c5Ghm)b{{g9~oErcD diff --git a/resources/shaders/compiled/PPFxaaPixel.spv b/resources/shaders/compiled/PPFxaaPixel.spv index 9b223d760a4b1c47e3bbd5dd1b5d49278d066b89..3f8fb5ae4505367df6d1c135bf23e3a742093d60 100644 GIT binary patch literal 8904 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 literal 8444 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 diff --git a/resources/shaders/compiled/PPNoisePixel.spv b/resources/shaders/compiled/PPNoisePixel.spv index 98b69ed15f53b7756077df0071708e5ee0292a03..94ed2318ce33ad327053d6d8bc08e9dac7b03ea7 100644 GIT binary patch literal 2648 zcmZ{lSx*yD6vr>c7F0ysaM$9#)_oTgu@)7j(u%kwO=BlyB23A2F!-i1#y6jQ@zoFE zH}OOG4SX^2|C`=}^Wq`Ld(Qvt=iaHkxr2Q!-{YJcbg%R;w8`Zh2(M~CthrZ z5ja+`ytp9l6ZeaUWWf);SAW>Q3dp;)`g1OMw-l7B?M_mS+pmL8N5@hSCt=VbPhaXI zH#Z+QTVW6-wWJv*(#^(fW*c8@FGn&K^ha*$nynnQR%7TjYKNVm9<1DFaOswh8O-)C zU$+l>H(NbiU|pJ{Kb`46Bgj_J&i$O{TcvQZIUh*RrxxebLb4n)Em&W=r%bL|7`^ef zg0}ASbefAx3qfo#?0KTS(2i5@#;TQk%o;|ex6QazFV8h5rl)7_S{$>smy^_3n{Cv` zXDa2ou)Jqm81?XV+SjBog#%$(CPxuXGF!})7lfjq~teC-=3+#}%qVDYt zZc~pNgcZfqJn8j8$&l$AB~#0EddT{3l1>e?ZG zAC~-i_}iH2+ogXm52yab?-2i7`8B#-Q9C7r(c39)9etOW9K_*^-)^1wQHPn?S5XY@ z(=D+N%f*Quf4C_By*inv>$f)jZm_Wfa3geRuR7wL@qH1$A5a9gOA&l8;6g0_>==4v&Jzl4O?f{HlPw2!({mZJv4Ag>{>9@3#I!EO@ zqVtrPSaf!FT1>rh#WHtEOh3F|e3j2AKV&`Jl#C6AvORF`qhfln-O=}$$LSNFTVj0pzUdR6+hTBhxX*Dh zcf@am&2q=%RsW4nNCz_>@O!!|jJ~)pYTp*)`$4&>RTi^L{A_pkB-2y2UPU^%)ti(I zW^DED3$uFUB|pATl#x4lAjStW?4e|fGi=IZIh|F#K;FV5G4c3g=XcNU;<04xFl2Y} z)z_UCh7Z4G1KJtARK@u54Pv*QJdsTA-0w#pKO>oX#Mqu{lGzi#w{|ae$>5)S+*8TK zg4^z9C4(E=?w$$D?v6h2wVljK#s@O&xnzqo?1jg&yL%~&c>J+5%a~pjza7~AsPa|u EU;6UM=Kufz literal 2520 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 CLsEnQ literal 1080 zcmYk5U279j5Qa~)+4MuGiZrzGvy z$6k0-==+>=0y{9wdEfasGjn!>%Fd!O3+9noGCz!yr=}vtm=&{ZlI|dl;yCKG)8E-N zOMlJspT&5R53_M`_rWNyW@DpH(rHeMtLDeu_f%Omfh|Uz$Es76MX!hB9LIt5NZOKq zl|E5Cel??0U_#k{N)E-A^FlEj^7Tiz#q4G@)ltl%c~j!j>G1kbHo9@Xs=ce5oaN1n zfnq~@uf?a6Y@#Ug>BDlq@L7H}y0x`K+g~?{XGPN`MCynhwzxnt$J-8COh08mxa?>C zO&@RSHQQrQ*Iez(^fZopU*w}MJ0ec25DsjgtKLV?_$nT=$8t?DHIqTwZ}p;fU-+4# ziQlqYcDZ$(YvLNxb=}DufU6!ac}(7#*k##<6xk43lO>)W%QDCBe2!YNF|UNzbtVt4 zA^cnxfj{(^9V7T(yQ9r{p$XU}{Ep|rw1{~7w!#?t6O31rl6mgdfyKNZQov~(TjeW-> zfW!mv2zdZ5a*+!zxX9z=28sXcp0?W-v{l<(e^qr={ng{K(dqH1Iub?E?&zj|SrgG{ zxma5^v-9anl4oh( zq(wW=mQ7wHX22cJM{ZFk?wdURBQdY#@zQjPB(r&I%D_F;;(VIvO5jpc71*h7IZyg= zzShWkSuR!gI~#QmOeagb8&+?lpMrumOzUy<;&QgLLE0i(a8^I- znx1xg1GBR!NrzW3=24hc61nE2SM^74{%$=1n-AY4on47lOlz_Eq}f^!K5pMzi9eZt z+Gw>N&s~zMwZVTjENqaBe_E@xQNf0-(R$c=T*feiFs8XMH~-YyDx2Oq9PkDBIvq2v zU-xBf<^XIf2Vmdg;J&^f-W;=>k)ZR=&{_A@HFXk?jXNeKEOg#7I{DDyA+*zbXy-0; z?!liocT&Rg`jk_x&U`{UI(Fh8s8V0&v~*U8k$bPjD(imq=6$G{xI0_0t#SB;apWfM zjl|yt4`6Qt3|_%L1Q_>#{T*O%2KF()r~&Ms0E0WQe*+Buz&-^S9D#ifFn9v{Pr^*m zJ%|1~!p@>6kA+-#%yWUhl|wMkPg`eZx<@-b{w3jVzJ1n4zREgwSUC0J!#xKSzgK%* zLav!opU|0gP`*EEuS>9T-Y1EoH@6Q-->(xGvpB5Z1KPpRu^-fqeM~~GL)z;S)}&rN zJQ3sLh((CQmso_em%8qu59%j=vgFg>f!}dugctalEc-<#_K0@+N6?RIACb76mFOp( z$;tiLk7>saj()t<$%D@KMt{_eexlU9f4$W4-=|xrv`;DGq}^TpeE(tn+{65+ksi=b zX?HV=qTi&$0q+wGoxXUR#Gum`wvke&59;(feK04l(+6)4AL8kQcja~LyjQQ+b>^Ev zzoEz}?cBwpxBr#>wD#Y17u^0Vp&oR&`9(r3I^3L*P|sauoz{LGXGVbsSBUG!kFbX3G<^rdZYI15^x`Pqr`~6CAOFk7-wb!hn$%UJ#uCy L^!7y+|0?+k-{0Co literal 2592 zcmZ9NOK%%h6vuDl*lAjxs&FexgPSfZMXf{;QfX;$BiB+CyRmBlUATiiZ3gU_Xgp36 zKqxET;_(gm2z&q*ELgB$!G~eN28sXg%-nj&txoPa|MR%#HEw0;%8GNR+*x59*?ppiGxX$9bI?wtC?+UySKeD%f=gT+_*-R z7hJ`H5$8qsobk*0I}M^3;lAjB=mSwGibNC9zNn&qRo#Efx$2hnZ{b(fd#_6F25AH7lB9;MnB9{2EIiESY1od(;h{uDsJhp5``9z_!~o;m z8Rw5-w@wd{8o}xfP2+?)zyp4br1#QI>pj9bKP=qa+?Lv|dLaGcsDJp83)5Jg;stiQbd%`GUe-+Jakjv`5zv~z6P_R6pa1G8br+VLz4;!)VX zoBI*0+w07;!jV|)V2;UA2aG++vAoq)^_gOGtpC3ax~ENLH#zk4p8k57UcGbzyCRw6 z?U*~*of5{Z!MdWB;$PIwJRX@`vE8hQ=WV~I7ffF4E&iOAddJ?PCl>r=5y#8xxoEcR zGw%}{p5yECa=9*#`S-jZb(Q^)Px_s#-M>w&V-Y<9qgJpVOBj0%_Hzm2J+NO&7<~i# zwSScC8DS7YPrYAiyklA{xSzU^?aWzb>}ww z{oVGv*DMCVli1KBCmZC2&2_V3$9emz$kkWucNLr7VA$U2^*48#Tdcm>hPtt}Q?J?Y zZ(-Z*^xFM)XUFXL9u~RP?EAp3zxCd*+3D>1czh#1KWg4DWOnDAHi-MOCRfo7Ul+$L z8lv;EX9mdVk?B7&wy#Jg*M^9L{(0T#nfnF(RZ4~-uW3*C<~)Y)B}Kld8+=VX-wAR< zzL#|K4%p2?rWXJ9>*5=tQ=+TVds(9Suj|H^*yzdYhRC_&ch>a3AUjJgJ|A+2sF~cb zhu}St*V~ebi$8fGvpZnuZx=jqk-NIdk+|3+^VOm&vLlOCJs=MpDKM^t4h6o*Y%n;oDU;yz#XNf9%n-Lq91lx^G0}h0UfgX8)~-eQ4O7e*@o% k2lsy8iwDF1wz|l?z~Gq;J%eX1)CkWEjz#|}CSF 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 rGZ){jOwlEJ9=Htk!hI2dx9!~fAq*(UlA`+|or literal 5832 zcmZ{nS!`5Q7{{-j&J+QuBAW}fP~(FT#NEV=3R)&9v@#6_HNnf=DZM(q)67gk-tbY; z7$4lCZzjeBqmrl?W3bd+&?2I7iCf%WeQ?1o`v0AKzRso5V-M&1{@;4ObIy0iTw6~^ z5S$du31$U7ZGju71#LotV0LhFP#WC4wQpdcumAe3Bh^NA>+pC|ZpO7Ftj5h<7Y4E` zINiSfQva$(Gg@`YrK@o=FUUDx`011uqg`_}j1%ZN5_D>wuDL|BNAo<*oc_y8{&d^GD}(ipDQM~g{RQ9P3=eeJbbsmEc} zizF*JJIcIG`52y;zdgcyJc~uTE?;DfR=yp!Ja2U2xJUl$!sI0A3Yjt@1qEB6#yT&Rh zmg-ZF##p61UJdJJVEWvmdKksyF1Ld7!JQbZHDc~z>L8E*~EV>*vnvK#(7}a+A^O@yh%$BT5Ez*l; zM?1amIg*csQ4}ZJRf+cCJ@Kw~zUJ_ZR?XXkDesZv26Z{E)z!&AdThZMJL1Yt1-so2 zpZD>H@RmN6Oz$T+qjd&_;4kqrb%{y;+FU9otF#+zc*FEFhtWuGs&E^;tl;|Gw5%9; zJnwp+J^13fbU*aM!4rHJTyJ#PO|^P8N`tP~J=#Wa4bEb{{xzOjpE?8U5zpw8U0EyV zw8rr{*AqE^d|H28;`mm-Y}w~rzeJ9&VXezF8OAS9S(g*NlwtPd38rm2jQeF+o5#2h z__{|cdCqlw&h<&lbB{2FC-)-Pgx1)9Mc|(3yV+P=y6s{>SS1(*Ry+o9(iGVwx;P( zf3WThMh(DLW-#^$wmO4R8?dV~7-t8zCWG;g!F0u^eujIGuATw&~yKFOXL#@n8$;qg?Y9jCb)pS|;j zSuODMyY#bnp5Dox@o9b3@;AO^pL2Z`Ilkzz*&N|5N96R{E@5sgN_%f^Q4sVF4Q(o3 zx7zuj_oAaE2&4nw(z(#-@LLld&L184md-^^hu@;y!4*!Y!}Vu$N}IP9H)CuZXmHP_87QLV)KK6oQaJszAo3qH}bVwk(0|xWkPO6P4mG@4E8jrNu2C7pId|z zqf4H)X+?jj=(1LL@JK6sw=^qSsWI4x^2f^-Zu{|Kl^5vTW4?dw49-jxb;&Vb1pYW5KU|l+aLv9UReeHZ_ zuACe7&+g%{_|!J-q430eUn{=f(CPx5W;B@JBsnXZWFb z?gIM9ybODj|0J3|Ms4UlRx^4IJUBfC9v^>dWe;G)gr|pqA)kFxdJm}+a(H@*{sQFl zJU!3L;prdx3y{zEH17+0czTEa0_2N5%^r}$(?|3dAYU$mdvE^X=^bF`!>9l6o9dsT z#09zcM@{g1CY#YPeyMmM)?eTHcA?bZ9^ zJkF8>?(qd)Mr_kPTQqXh?V6!WUZ#7FXyi94I(Kr5Vi22Q*v%dTHtZIU$yB`{?K`&$ z!ybL)ysN$P%RPERJhA9)ziG!c@r*yTKV-LQf>8(P-?cvFdDdTi-+ZtCim2QbJj0-e7AJqUldR6z&X>Zu>GQkwX$F2 ztmM|I^(FDh@0UINE26>3kMrY>9}rC~8HT+o3|+=uUT;D?y2woLplEEhOk5&EDB5;g;hu(fDKRmmS~XkA#8q z{d`R4#vA!qJh<6?A{sj_({`VV0ngffCLa7r`Nq%ZqVWZ8zP=ERFVe6az7z(Y_4So_ zaP#%GX#9Z>>Nc*G{Wqe)ZCZ?Pg%N|Z7*HnkvG0U|GZ`$F1HQf&fDXSihza(Ccw!*K zH+%X~G&qCzm3W%>h3s}sFwO`10oifSM@5s4Ayy%TqyfEC_;=!J2-v-VeqD5ca=641yEE zbg1n+J998b?${lCo9TMo~Z~`VKq>HFWKEIRbPAn zUfIwShd&OxaV=}AE5z{I(NyQ&5mxo7%m>|akjK%|U}q=J7uNB-9G0Oho58!%8zNOK zFjkc8>QOZyFEoP-1RZZ<8EzWIDO0pz5u2PdeXVTZKIKeMZH`bT8J5M)-ahLvgiTd?< zd+l9-u|~ZMWJlix*m3Uy+0l0aHtJn~k9rs2quvGhsCNNA>Ro^z_b!mV>0KcA-^Ge5 zpf0dE5j-`)v*78;jN>Yv+I*heFL`qKSrK;FQ?oCJM^0Si)ac9Mk+UPGR$mT}oERC;9J<_Li+fH!{J7-D8v1Ft zoWU$EIu_Ty(L?>F`)=EOaM#p_Epcq#`J2HS+BMwY5ipB`4sp(^#~*2LiRR>s^T(nf zc=_Or_)m0diHM0Do_S*#e?ezr8_#!z8968Yi`wx?uIKf;r5y|&`K)&26C&bW(%urW zW_0_^5HXJ<^o?4wr)KKHZbmoFn;-`E7VGFveB|cmg0f*&v7M=B5FYe@W&|FbyNAc-bM4rG&4_0f{QS5_FzmQXcto6|lkWL`UGddRmB`~TBJe19VwaUHxig+#@Le*VUf^p?ggw2WcH`*vRf(Ia9L({gC(d`E=*PvwB0yETTt zwlMDNo`^f)&0FsGYrHK9clbcWJ>k2OHQb#pibwXxSi{X!TW2t8pQ3JCYd%w<6_4Yu z-t{58?K2Os#m8ykYZf<8$@>6j?ex1*PrRa^GvfDbQ}W9(?1r%_?(7je&b}pVIo{gN z?!_4Q7-zfj=H^}+&G&o#0WyBE=ib@=Zj@uW{iuX=H|p&5!hszydtPl2cH=#tTh;sE zEq429%)94)a-8>ylO!56lC7R1RP{s5s;C+k6ej@VBKkCQA)6k^}o z=XugKoiNSP_IB9q-%v*Qp71e_Y2Tw3*TQTN-?S%{KEL;I>373!H%_*MjJY|*fxYbe@^Qn#q|njCTa%9TxTb zgg7;(W{au?Gb0c!NynZA=e)`06MNa!_Y6FIE!+0yOdI_Vq!4^swa|CRugfTn7mPNeLC2``m zyd3yh5@^r++Z?gln#_3?Z&4Sw+Ons%)CJ$jr$j7l8{+7=2YZ(JGHj&4sF`7$!H#vCz{C=;?zg{bmMY13j-( z%sQ|s?WqlNO?FR<6A$doLS~kM5$9R)nrK9HzL4n?7U#JGw!}FpnRg(UJdeQ7IWTfy zmeD)pa7G*%A1{jI1B@Jy&lVW^bHyG% zS@M|^M<(87aqo4k8kQT%{7a;VwVoZvwTH4t)%FDZfFVKHEGj>I!F_mc|PXJ&4AW@Z-ff$obriREMNPh~Gj6B|n}OXv?~ zmX&~yg*n@*gnnnL#cXR5a@d^{bpf+;&a?OM>h-G8=f732eV7gH)X@K7w};A z2cEmwkT9e72eTv2w*v3|!R(9kn}PTKV0Op(t-yPKFna{g`L`v^$Gvbzywi>Zzt`B6 a&5Rzy+wDp4b0*$~9BkeS?n|$9DES82oGf+# literal 1384 zcmYk5ZEI6O5QWFYRNI0gwW%*vV@pMC2wGGG@g-^qv7tBQw%7Usx5cIyh$)x|`ptjl zpYnrW1kbZ~2Xo7G=gc`Xv%9k?m)6giow7wcYsXf67p$a+*@Dem+RO5GlC-<6{PSos z%8$Q|KTU@xrfgf5 z$jbVwX#Fj5MXFg{MfK5UX=mKX24AOx@157e75$OlBi=ii$PKyF3$eY-+NwnEqU^5B zszt4G)hx~OtkvIb?W-C(YM~3Cbl|A#C2423lk5Z?^{*GIP%rFX^;9W;l_Y)kwxs(j zX}uXvX2D-pk2%F^GQO&~d95|sins->V9pL^FJS6y#@r?O@T>ZNQ7bvbYQoD}HOLUB z*Gh;p*&-i&NybM#YF`fM=P$=s0{+imE%@hkRi@Xfj2sLtJiV`Jr8gRC(d&kc-kw{N zPaZj*>)JKNIHzmZqi(j3Yd6I4vRr#BYG>v}10n=;=E=co&# zfpbkGYS4L%2TniCV_OlUqt*+poS&ILiMSbK@NeXE4(<#dyd7ikJJDw^@ZjRNV)jV; z=e~FgeAM})2)`k;yoJ7uvw%5!8u3$M_ViN5ewxZ+etR-e7d*P0l%Ylrz*Eo{T9$mw11~THDiTNEwpIO2E)hl=``v;oCS?d4* diff --git a/resources/shaders/compiled/SkyboxPixel.spv b/resources/shaders/compiled/SkyboxPixel.spv index 0822395574740f72ad5a0fca47b602e0819a23c8..1a60234fe9d80e530b81cb8fb957b5fbb51e31ac 100644 GIT binary patch literal 2076 zcmZ{k%TE(g6vl^^mWRqid81gsH&`DFV`6*|LV%S-YH`<;_KKtJOf#KU*zqU0@DFh9 z%9Se@E?l^9;Xh-1Bqn~pI~^EEyyS52`ObIFeCON?>C}9Wlj(9CXTZ6w->hLL<$$n% z9C4g}r`OrsD3(^96-rgptORZ&^n;S?Rn4yJ?I<&C^T-(#yIVWwdfD{|q+~F_GqS8~ zNC=!BSz15fZ$->FeHIJ%8YaKuwcWt?>c$H<0>5E`&^1l+BaTv>O1W-=a?v%f#dv8d zq3hdkW~G_hd?Vtld+h`zt0-}_H3GL@4)&J)njgqj{V0a!rm6T|^)MR8=p{tZVdx-_ zUZQVq_)Rxbl(o^Q_nN!&B3$-cUWiY{Xbzq!2g^0LAy;U|;=MXQ@4zv)PgwKS-nPHH z&J`Tg=oj8SfjBtJ& zC;AXKLM?8k!)=!9jheBuqzmr5V0Ob+V49^Pv8*d?!Apf*fENw-#dhC1gTcHhX z7E6VtC#x$3`qS0&Cgb?T zsSBUpl5u?Ed}mEl;ci*;(RKtQHY8h9otQ`cIFGkW-lJpK@jQ6RJhYLwFNO^7k7oj6=_$F!51md!{JJ;8~2a4~pjhKq5IEvGu;@|gwslj?#w$92Ku zMZc_b`r?Fkc;rt4YJp9u5_15b0@RBAX`QKo9^z-Uqdn4@QeED5+W!4;hI3v!8qhnU zQ%*bhtacU}rj^58alWS*{V*f)@X^P+W8tHVH^;(97u>FnAL~Nf9c7}07>mE{Ut-T` zzpq?+;a!oxBrbX{$oM{Q2oBmW%D~@?lhb}l2F5%3DgBqVv;K%r?27EFjBjy{YhTlu z+Pt^8_JYpfaG1-YjDEr4Fqi8xaD46~FJlHpF`3;B865B}MYxljGI081{gxJVq6uwD cAN)t>{oc}38RBUybc32(m2yix_c0IJc5tl z+LaIB!i5VLE_@h`m&C;X>z;-aiu}~6zb>b`s(UicqbYOnx z=9Dz3Ra_58UU(#QDh^&v=#(*8=^skUinZgj>aSbAd2i1Re6QwsQ6cbmogi|ZP<&3k z;zu?rH7BT)T<5JqcAU6h_*|m~JtZ-V-kuebQy0`|7Ip)-RtXN~{Hh2`3tT_8oJ#fNuSgGw+op?sXv)4j#(VKWuTGcVG!JZ4n<$5%cj5Du0 z(m5|^%jw>j(SkBko9FL5!HvpB(mZx)=V71BgCp;Okk)6%aEBJhZsFcp96N=3Z*klQ z_tE0mA>1d6qYt>x7RT=3zE~W)gZpZ6><#Xl#j!KE??PU4V^1RjlG>LNGq%~C?Z>wL z?9ujP+kSRABp}phkEv~XbFrOK6U9<_W%hA?entK+eLc)}B>tL{Z>d*j<})nxsSb0& zX13VO1Un=2%RVPf4E`Sd?~)!CkRkoD@O}`J#t{psLoBrb=M=-L(<7VS$iLsPnIRna z^hpm3O~SQ?-LEsdAb&ubSZd-&4+_M0%X3kBK)*vH(&_W)cqGIjgUY=uO&s~uz9Nml z(;M~}ge2`{TxZ@D;;-V6P~*Jrz99`i2`Ry*4mNv5E@;BHq{*QsJx&QoYEQ@3;mmbS zl$p*5!~lGNdmc(R3Cx^(u=5QLe?e#VNe%qiygzVv^~Ewr_KU#%7Q=TnC6<~C0`+Fa zGWVwfyJ8>2F#Bf${0GG_`{xagnf_AM9ckpR;_|kGK^5~g; Q5Ie2sW1jf_X%qK^|CC9z)Bpeg diff --git a/resources/shaders/compiled/SkyboxVertex.spv b/resources/shaders/compiled/SkyboxVertex.spv index 40778369c54ccc471f9a857ffd20ce0968519018..2f2893be8b7ca15a8eecfe63d4b44c825509eade 100644 GIT binary patch literal 1928 zcmZ{j%T5$Q6oy-d8Sn-oa`A=@cn3#xVN8q{AO>b7BI1&aOslO-_oSy8VW)4Pi4Wi- z_y8_kxNzaZ$8lrg|5bG{6{3}#sdN7GpKJA$dZzn=@_`@-27;UVKR#bhMbmA;cno*LkWN9nP@;GV-@>`B*!DhV~ zW%czqdMn23XfuyfQ=<~}n>_SjIklwYQ7S>7@zYByi<|XqcQM^cGjci~J+`CGG--6b z&PVS#4Ru|6am-|EuB7eQc2tp<$iF+|2i=6J=T4hyl@EZzFzbG?wyy!Vu#e{V3TjcSk`8bzRm8YJU{ki zVK1A?)|mbW#tx53mQ{y6bBK3wd<(=q*oW{%uL@LcJN!1oYQ?*9ozZsY>&ld|C5qX!g1J?^iV<`hfNn4 zds!)FJ};ek`1tAXqw=zk3le&SGcSxcxF})Id}pqoO9k%gT$T;Sao82r76IcUhKer)ai=0CYK+DQ5K>`Rj8l7=LspRAt0<(!pQ+Apiv%d*V}n|>4qZ7=9nqHx2Dy1v&DZ2 ztmS6gi<&jx+mg#G&(;agB{`@i_9+INDVLlXusQl=--!HnGuoL8TVWK(#x`!#@s`72 zWzXv3sJBZ+dnTP3$8oRt%u3kt=^XXs?0GraTK>zm?p)Xlx_ev$F@e{N=34%Sw(`ze zf4aDuV3%W1th2uJBHS(pE8h11+(Y8Mj#srNnjxn#wKGtyTN$n|q1?6EL^m0LybhDuk3&}mSRdwMs%*@i#VsUob`Y(qyyzDstTBD{c;AV4cjhh#J)=+D9bxZeTzRIX(|6);Cpzx{ z%$+l>J?|&}`t({GdC_krI_IK4(32XmlMlU=FznB?XMWU%9i8_DhP|HbT|9atVK-C- zbumvCF@Hp;?T#oh4<(%USd{y&Crpq3td%h8bbjrGk-wr$)W<&z;_=7MoIWTowot;X z@R<>#FB=kiN55P>uM_Uh;o}ZtImU+$maa#iWy{j_^u&nAA3N{PyQH2i?WqYL>R~S1 z66)bSp&n+mBZ0enyh#}GuAaBr!|Cs$y2yP$N*t%AyRtGjIQxd4^!~4IaZ~aSJRP(( diff --git a/resources/shaders/compiled/ToonPixel.spv b/resources/shaders/compiled/ToonPixel.spv index 15e35f4adb0318e3c3757abfeec404c293a8ce3e..feb4c85dbee48503dccb6b50aaacf18d176656bd 100644 GIT binary patch literal 15340 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 X;KN6qHq)>@hAwPkRR1a#heQ7b5|GZe literal 14292 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 literal 5532 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 RGuX(_%pZOFPdDBY{SW=S9%cXl literal 3420 zcmZve%WoV-5XL)R?>Y~jLO9_O%1RW;pJc4|XMN1WT^ z4!FJUrYqOoZb*o8``td*UR+t7YqjR)XIIa6``y*`i|JaCWNFk*iYq6b&NV!DZoWM~ z(Jwj^Pd;^mD0jG;4@R6j^}`yL^r9q1Uza4`1Oj-jUSwQ`i2N0@W2E zj8Rw32jy!QQIV{jjr-@DX}^flwfJ;YL{62Bc)uvF$fLBsp5?t}+KDd@eAL&Aia1ZA zZsk&*hP&@pT#MNkTK72draC@_=RWX1Tw**beA)7rCHWZOtX|fMyV~pec})8)ZlC%} z4BjAD-A(M`aR<){n@ukzd6xF#v{=lujW{ooSYZ@rpZ803Yf&%Gqm?9nLzD}#e@E~} z6@$AdInDG^K;a(AF(lc@lU|fxnaR2t&!)4bkJs+UYgyVEc+JO~>4uAB;JS5=w=Hun zX8nZDB4)$qYslA4&Ydr2vWsakz}2uWjiY>~n`}rGyYBgWrLR}8#n>mT|Js#Tv&-e{ z8opon#eUrOE+3=3#{(tqzpr&E&hw-b3sQ!fn?%v#z3AVSb~Bw&*@n^29$QeKMP0Fm zeSdrGr4@gUOS6t@o-Sk2`-{6`Z5bBCVm3U_#~Sf-;_b8lZD4wj`SHG&v%K3Wiv(w; zJU*YTMcooVqso{g*3oivhS3vXyy2YwJ*1s?;jZU&C(H?Ne?~rZ797r-Z8709EBJ|p zeni4D`{B~`@oY}$5#pK6``@(-8{`;v$K|8ODG525EvpfoWi^^TIA8NKW;HTzVU5^U zBe88R_UTVH@!pC6t;BZGy9P9z-r04Lr2F{QK4)%cagy%4y)JG4w(GmZ*2~K-uwYkt< zo?e)lWo$i{xrOW3Xv6;vtGJ7;c5}JeTJXFr5yJYh;Vrb5&Q8ylv9>EtS%1U-9fY$y z`^xG}tF>e~cPbv=z};P|>{?|r-{j)G@6ngSJEA_tk3K4mHy)Q96pOdT#*fXrV#B>x zHs3ccVd1}BJAUGi>0f?tz(Ecx3UdQCCY|}m9vAO^?ZgCowz8Rj%k!Z0amgOZarvhB8q;o&m)RaoN z4{U1S4>;dHt<&_``x1JS{=>&^+z+JVH|~ehL+-JF`;m0~aOtJ%68ejH#Id;a&&QJM zk{9(Q^vov`zJq1hr_#ap1lVU4Mn5eo4{!Flg!Az6)3fg>F1{}$_=dGS^rE|9|!@iRa7S{NEg@rZ#AdK_y@zd{?>qqI-2ytbzZTI`^xD^YHOcs++EA=UdUYw8KH))=uA`)2qBKI(^EW Opwpwg&p)d48Ogt@?p{Iw diff --git a/resources/shaders/compiled/UniShadowMapSkinnedVertex.spv b/resources/shaders/compiled/UniShadowMapSkinnedVertex.spv index b9fc45d8a02d4e567b0e2c07fed13e1270b41cc0..838645406f362868c16d797a60d09492d32203a1 100644 GIT binary patch literal 6272 zcmb7{_jgoP5XWE0Zh{CwIu>F8u>eL8M3j~wEffhPAYy^X?hAR4yp6jXilTzO1BwkB z_V$y%@Pq%C^&F3WKkwbiUc!cRyq;lZzB6;D+`IS1#&PqTgM32}1TDc&`j<5&7#D!R zFHaAG3BmZFr+e>#jr)2J6r)O^91m4XN{VqIstA&AQ))vllm<%W z-MveFoLU@yua8rU!+MgO7e#QRu;BdEp)To$Kt{?8} zi^}cW*?B`)4HcOWbeusA$#Q|Qig91xa3y+(aiTXle`d+v8P=Tc!5k|?QDJx>EL(v2 zGs|*VjE7y1?9UvBN|m@8m(n{y@8HZaPLinHnH(Na2E)@i#^tEs0t{!4rQzyT{>(5= zs!^g8CnYmO_GgBLuu`q`^oPaLaaDwEd}^B@Ii35Cuv(5!xCz(#zFzjBuvp}d=hXrC zG@YGx$p_a5Go)W*=Gm_DVeT_6)}hn~#yS>9$8{-=ShIOm$nPP|mHKCwo}9CU*U#Bo z4wFh>sXXY;x+$0~-z(9qH*nTqsTd82Qy;&@5#O}Gmf%KV^>g(c<;;pZqDp^PQmKYX zAxg8d*ZANj#f{}b-`H7ItJu5u*tl-S0=xf4Y*q)<3bsgu zPL1d+bY?;v3!OQjGe2}@fQ}zJZ_Yds%k;UD&Ca*Lx1(ccU;KGTd^Cay z&P=fL&Gzl+*qIA_f9Xma5(KM!tv*u@P1Z!{@{hHr6hf$kh^g%3r8Ac2kwHU_S z!FclxWAJ3*F{r-?^H9_B|w)+Oyf@M!tviP2M(f@^*;G%lDR5+b1`ISzdfBuYKog z{`vGSu!o=5{4DQW+5NnHb6K^0a_M&%%<|%6dF}gF^UtT>F1sI`HT~H43_s3`p67{^ z+wKtGU{-CfT>4!Gv)uStZu@4{{IhQx{(jHqXFcQZ_sn;bRof?*eoMhDFFxd*sq^M{ z(k5D@9*`G^Sf<~eYNyxDko^wHZ6fA@9sN!b%k;Y>`}T#>nGx~4t!*L}{^FS2x)m`cb&i_ylug`KC-zdIVQ$k-R@?&SqZ@Dn` zCQqwQkT-+g#v3fHW->gr};$dOz!|z~)cHunGS)9+Gs${45 z8u@Y--6Cp3XMVdx zjCmmcCH|z-;lH^#ACSzf@i{08Mc8;_4vClxwt@)TFD`#kGIrkG-<2~G$IhY#?0q6| zYCt|EoY@@~5!ow`%)NK2}nE|!DE?O$04}8gCb-f`OJ9WJ&&Y~{xw?tsng=}@b zEt$GFW2@^O$>4rnXQhKvm+b?$y3R?aE^5V>99GwP$=IpuU2zt5fxjmLqb_8t>w;wJ z;{NQ^Uv&41zb^uZSj^Ju-Y)qA5kAXAc6J{+oVqO!-0J>FGIi4nzSKaSAB(f76Q7GB zFzQ4;?|z4$NT$yHB664yoE-cHKXrEU;!ixj_Rhl1_cO`twNpeK``Fv^x#YRycCW**_4ZrE)--xjBU27Hp w)?u6%`+VoH3F21o_mW#g?1dd}_5L6kyVd)nWUx!3wVHpEIM_cr<&~oU0N&<>;Q#;t literal 5688 zcmZ{nOKg-?6vsc9&Xk7&2B<8w6mg+}@Wzn%YN5~$7Fw7F6F1~@=4(4LooQyKD7p~Q zl_18oaiK9TbYave#us4Yn@6GIMvag7im#O~P@@0e{qE^}HhS&lp7TG?d+xpG8&lJl zHV479V0JJg=$Rh4aak~3ND#~lW(K*wUAwz_d%Joz?;a}EO1lR}%lUe-QVvVS`o7hH z>@rTbt0&j9qE;`gShs!^PUZwD=LC}%K6SS}8S^{9Y+TUf6a?}~jyl7ZE7?cJLGigg#d0|+Y>R3`*>bHOmh*AgOwjD)_^4OIa&4ee9nO{uk>Z(5>1&_$s9Fq5 zUL;w@*-_%#m5+(g$Xyn@*92Wmy`e|7lm8{?L@`YmG;Edr)Au4I5 zp2xLL>MA07V2nn*bTB49sfX{M4heLhN(;ah@|p=fhgPmKzESl{@|U%y2nzyGzs}zIb-D zllz`6`AAqO6w8CEL{o4|ysMqBIXt6L^QK^2yy;NyGvaf_@*X)a=5?Fd9~dJ~p?CJ{ zHOBh}r`8@{lfK*HQ|IIE>>OBNm(5I5|{RC$;&L9(96hBp$nDnk)xomlbc7qLXm_Ft(8p*8@x53LYuD?ynvIUQ) zUH`KOpY4qILm%u*`0mzyu^vawyA{oNYC3NUwp2W$OLhgVoJYIkQ?B=M&iK?5abuC= z8-1~1pK^T>IlkzTOPoc6zsmFEM9*ZHy}91mgga1 z49nAai_@k1KtHrRp_6&SH}Y(n?1NTI>x;=+8rF!>6daSEWG#=2w;Z7vmZR|v`;_aU zmgAUolR3gSa*TT={>+}b(JQBUj5--+wX}PHUdroTk!fpKrP=~T@ zxK^tzG_|EJ_=dOIqDx;v#@?VA=F2dvv)x&AcIS;x-g(2U7Wla!f5|&fk7UpIw0>#% z8{e=`x&CSALN86`2yZzOi=Nsl%#D_~$EI3>prgNkXLjQ%w=a4uI$DB2I`9ph)lP@s zlIU>8=)gC0);JyayHnz2PN&)RVRUl4c4xQe`a8C7+Dtoky7Xi2s~atu_;+fo+t-`R z_Gf#y2lEw;cuQ0r>I1z{d!lx2nv4ZPIm;GlT&lHA^K$9T(F)JKS)_mGY6XKwzECTE zjAw7?6K9!FWbET_4Pveo-KMFuog99ZCIfwJ*E)`O-|S-X!3RrDVy_oQ&cwzRUmG;> zjl5GUa&lR&Ovr7kX3`Ha*wYS8;v}c}yiGVUTIDIP75ytk7qr5IM_S?Aq&c9K8iQT$ z`9Y5%ANDkUTK%_)I@!ecLGgUE@O?-tJhl&M#Wxtf;SYPv>i3xVAlQF1wtOor-(#ZT z!H;W&$LE_`@d<`c_%V;Q>I6=Rrgkg+${E=?+X{v}xrdYDW81iA!V~YbR^rhsi3d*~ z1Z!2dqOaiV|E9%Y#ot-2*kXr2_z92M8Gb09yMX>VFTYr#I*?KtA8o$i)Z@G|c9HR7oU_UAN_J?G;;FB&<$=QqXt$jimL9FV`D2~G~s9kS(| zUlh&V!k)TOrrg4UO;lT3^-VUYc*t`ZbU5mk#{v z;=2_aoHHF3_J(MBAp1qmN^ZQnqvDZ2EPMDd(O~4q`EjS;5=|``hP^EeUB-Q0?;Y{z zA~U^rMPsXF5_?Y!wqR!az8G|one7Lnu_d%&Cxl@OX0|8Aql?V+PKm~r_hQ&-Vc3G1 z?YMY!k#RSv!5Pu)g`Dt>4tLDXgw^g?yJ8TBJAfVMh3M^V$47N;ypd1EgPYxFqOsF5Y4^Dp@TA=r;=!MiZ~S~I8eib% z>nqXtA`Q#oYhmC?U*CuaH(%e1#vgc}ZeyqHzY`5^(_(xtj2N6nuQH*J{U8jS$zZV@ z@b#krbod=XOt7EC69XB(+0)OW!5O@-yFJbOLbg{EjPrqhM0VWseWJ-}NGs=KI;@;G zI?KJBGeaMHbgdt;n(i{MORvTbKlUc?6+I@Lw@438zRCTPA-B8^hz7%7hjOK--!Go; zEZE0q5x#jb?bqDg L*hQV#2F-r}lUISD diff --git a/resources/shaders/compiled/UniShadowMapVertex.spv b/resources/shaders/compiled/UniShadowMapVertex.spv index deb38758f82c3971c051b2baaca561b96fe0ddda..c188a0f197450b861f1a3836c29b623f45728cdc 100644 GIT binary patch literal 3856 zcmb7`Yi}D>5QaCgorD4@P ziCz;m^bh>8VO7;`KKX=m6=3Ue@fW?3ZNZ0LI=26G(r%dE=!ZV%`k zoL;g#Pm6ZG-%|#|-5j$b?RW>nnPY!g{m-5mW_gw7O7UFJ%#irZu#=QkxqXmy`_EJn zx;dv~x7>UmCsmOh`3aBvW~PIr+hwm?>VTTu>=dP?iL>1=nRy*mHr&{}`FfQ4z&KB{ z^qH38S8KNAs`t5^eZBPLJT3dlId_UAFZcSzp}*^y=q=g4h}OM^Y1-3Onv`{0vyAAHj8gHPIh@RN2Q-OF|#eYpD%)d78hEs2on37Lb;OctC}%k*&R zn7k+%JM8H_)FY!O4|;kH^~mVy6+JxEBcrEh^zcxRjGn$XlpW5wT(c22+dwa)Lze~Ir>i1H+j#BlXq1_-uizz z;oO@e%<^Jmd5Oyj^BNZBHO%s!lTVnJ-vZ7!PSgE9fLUH_EU$fc$M!AvEw=sOuIcZ* zIC*T}`5oYl{hIE#0nGAXL!NV*F<2~GQY@a|6GhSQ_s>dxUr(`!oam815OGXq|Hyq_ z`itVkptcM8%QprL8U05NuXmUDv1Ev|pf`d&BF9M-OE;#b`$o_Qeha#J-T`vpZ@G?h z>O&uUx~LhjoA@sHokNaQ-zAT;hv?YBx~GQQt6FZj{bA4WVeZ6Yhwx!9%!i$*<%YX^ zWPGlO6^Y};JUy0w974x_%A|7%qeocgL zTUF8fbrJb_KhVL=_J*F(|D-(Z-%SzmIEH<#XE16o?3TyKyQMtb+czTou}9DQN)5~6 zw?)i^+~l+xxPxy+=>Jp=#QDx+#A^%Ve(s341Kw$?o!eh>Z?AW`55- zN6{ZsO}9h$Jw`9Fo>xU+ysK7kThH7nu~t1N9`&w?&|AF^JVxF3G|agnw&*`z CXlnBS literal 3556 zcmZ{mTW=dh6vroVZ1;k=2uRD#a%l)vi=qMr0i~@?(j^h2 z#JLmhxa)N{w^lYbR@QE84M*u{YkNN#Wbrr&MsarVs*_#K>#nTz)|S#NT)OneMZ7%f zD&84>9+Pj@oM<Lvv$W}G}2zx&!YB2-IVxp487@HRd?=)9=2}_TZ?yw+2I{^k6|0e z+uQqTbbUM;PvG&3K6z&cdr^+%`m(Qt>%5ui@k9g)AQU< zj?=F=Nuo(R*%|4Entr&mCJN(8$Gq%>&Le7ZE667CJ!`4tdEO@_-wVPpPIiRMxy#~x?TVViv!*qlb63Qh z4)wk&z85EVpo8EJq*(BIL*3~u`=+v=Q&VwU%%3KLJrj2<2QprRLH9OHe143 z)a8zLU#GnGs!H8s$UlsuySnTHYd+t{?gRQ%lA2XLj?J_OH8*~UE_d=SHhZ09N!efn z#_X`KwzHgL%#v0-wOKP*CoS6;uXjL-KEOzXTH=pP; zAHea&`HYBV{EIp3{Vfz{dWt{e>Dl8)u<0Fh?j^~Hu_fZpMePj(a<&ejhwtMgMjo2}K^@IyXzUR_6s_ z@Acd3*KaV6ye{(yUBBjQ`Tsh(Zg->C>325P-IIC=vr;&ttjLS=yiVlY6rECB)CeB= z)8cv0O%V$@y+=;p8~V-6LkD_6R?IfAhR)OizA3$Dv~wTW<$`B+fpO1s+MA*o(S?HN zU9hmHR_JoiY4OyZSn@b3ey)KL1G9^_LJW)A;qmdZc6@*l1N^xHLw>$E42Jxk_8Ad%Kn~B_21EXF zaVAFO@Vsl2f2MOqL@$xU^OnJg8N1&_>~HFe=3aWvLgybLeCJn$62nI#?uW=Dv_$WIu|y3!Szwa`;Kq^87URp9|db{6jo%iI|a5L(B6|osnCf izvxU)(M49y^H=f6EuPHxh0`&U`MCHfC~XI10? diff --git a/resources/shaders/compiled/WireframePixel.spv b/resources/shaders/compiled/WireframePixel.spv index 171feaad8eb0f29ab2c4df751a22f7d3af78d9b3..56ecea5576c8df67a8980548f2b281263d7ae1dc 100644 GIT binary patch literal 676 zcmZvYTT8=05QW#YX{?uC6faMuwU0s`MG(az5?>0UMIR+#gg|S`8gKu@AM1W@IJN4lZ|J|waw;<&C}#XG}9cORPD`F1I47kBJ>5R*I7_Vlqk2c2(K+wvpT Z(Bfa<@}^VuquZ5{KT`!Q@Q+lEWxuTWGylLphpHmUya9(oBnXLAu< zx!?DlbI*70*@sH0yCt$AyRt1k$)hSIFd{or7RR2tre&FUGhM8f*E(SK$wCiG+*T2Fu0rrz-%l*VHuWWBW-*|kR zx`%zN@I9?bXIJ#eLC0_2Yo*S<7EkF5kxmUUj}A}G>&nR9I7{XA7e;RvCF{x??C=kM z#K7;-DeSZ#cCjBl;CCzuvFH=*eT2~)*ry014%p`iqc*TF5k?JQUn7if4(wZm@y&sK zk1)PBupbe|4#0j&*0dFJ(g*dEiv!Pzv3M52F3bWwo*{9;h&!#BQ*Tp(&8`5rPEJ{0Y6#s;OLih(;sosr*u;jxuz89vhD>T)4F+MGozav#Jwk-ob&~T zP7Y=qbaL<}4}8c$o;$K6E*ytEzhphD`@U?cYfggyGuhJfl?u}}z^+ypaf02o3d46x zlc1;T68y1;XJ;#lOHVf>)Xk2`O@I8YgMSc%|IG>`PVj5$P5-gqf^_iUx2QK5{tq-y MdI$Th&hJY80M+}ULjV8( literal 1848 zcmZ9MOHUI~6vriddc$)Uj2SZHX4Jef8C^BQLW~(RCDW+4 z+LcY38Jvm3zCxuMt;TAwzA$>U+5>@g{8-fM7dJA9 zi1#`{$o-MHEcWy%==>wYf-GE{g8ZhWdmF_5PTbk^>v6R2$4TJ#m9>=Wq&7!ZzY%r) z-bN>hgJbYw?oSP8Hsz=n#pLqLO^ieZ^?pz1YIqpLQMl)aiIa&qrBsjYw#tY*t-wE$ z$p=531$Z%!L9WcE8Xh_()IyG7@qQfab>fq}lB`a2Oswy3M`3rMwSLScq4$9*?GHcZ zm*uQS{eagYW--lIl&%-N-%ZNVL6{71UL^E8ak&@l>niI)YCo#`P7d1`C1L%KC-0); zYS{IU&ti`WKj{07RF%fa<~W|=X@9jtKaPX0FDRY)JQqY`(6pET%EaQW7_% ziDLG@A)7|4U9UB&&1!AaT+_6e*R0;n)5(28H+r5CPpTGrMMi&JGWE}hA@mn@qGz5{ z`kvGYhCHorcFkfll5a>R5BRfOW~ac2e@o|#ct|{-%eQrh@V}!ITVkRoH?uS5^yRev zLD>OxHYc^f^g->|!`v+s_r7G};!j=3%pDBz>% diff --git a/resources/shaders/source/Normals.psh b/resources/shaders/source/Normals.psh index 1e7f2dd3a..c7f86a3e2 100644 --- a/resources/shaders/source/Normals.psh +++ b/resources/shaders/source/Normals.psh @@ -6,8 +6,8 @@ struct PSInput float4 Pos : SV_POSITION; float3 Normal : NORMAL; float2 UV : TEX_COORD; - uint MaterialIndex; - float4 WorldPos; + uint MaterialIndex : MAT_INDEX; + float4 WorldPos : WORLD_POS; }; struct PSOutput @@ -20,16 +20,14 @@ SamplerState Textures_sampler; // By convention, texture samplers must use the StructuredBuffer Materials : register(t1); -const float Epsilon = 1e-10; - -float3 RGBtoHSV(in float3 RGB) +float3 RGBtoHSV(in float3 RGB, float epsilon) { float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0/3.0) : float4(RGB.gb, 0.0, -1.0/3.0); float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); float C = Q.x - min(Q.w, Q.y); - float H = abs((Q.w - Q.y) / (6.0 * C + Epsilon) + Q.z); + float H = abs((Q.w - Q.y) / (6.0 * C + epsilon) + Q.z); float3 HCV = float3(H, C, Q.x); - float S = HCV.y / (HCV.z + Epsilon); + float S = HCV.y / (HCV.z + epsilon); return float3(HCV.x, S, HCV.z); } @@ -45,14 +43,16 @@ float3 HSVtoRGB(in float3 HSV) void main(in PSInput PSIn, out PSOutput PSOut) { + const float Epsilon = 1e-10; + float4 Color; - float3 viewDir = normalize(cameraPosition - PSIn.WorldPos); + float3 viewDir = normalize(cameraPosition - PSIn.WorldPos.xyz); if (Materials[PSIn.MaterialIndex].useTextureNormals) { uint normalIndex = Materials[PSIn.MaterialIndex].normalTexIndex; - float3 textureNormals = normalize(Textures[normalIndex].Sample(Textures_sampler, PSIn.UV)); - Color = float4(normalize(textureNormals.xyz * float3(2.0) - float3(1.0)), 1.0f); + float3 textureNormals = normalize(Textures[normalIndex].Sample(Textures_sampler, PSIn.UV)).xyz; + Color = float4(normalize(textureNormals.xyz * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0)), 1.0f); } else { @@ -60,7 +60,7 @@ void main(in PSInput PSIn, out PSOutput PSOut) Color = float4(vertexNormals, 1.0f); } - float3 colHsv = RGBtoHSV(float3(Color.r, Color.g, Color.b)); + float3 colHsv = RGBtoHSV(float3(Color.r, Color.g, Color.b), Epsilon); colHsv.y *= Materials[PSIn.MaterialIndex].normalIntensity; Color.rgb = HSVtoRGB(colHsv.rgb); diff --git a/resources/shaders/source/PPFxaa.psh b/resources/shaders/source/PPFxaa.psh index 12ea72936..c01608866 100644 --- a/resources/shaders/source/PPFxaa.psh +++ b/resources/shaders/source/PPFxaa.psh @@ -39,9 +39,9 @@ void main(in PSInput PSIn, out PSOutput PSOut) colorTex.GetDimensions(screenWidth, screenHeight); float2 texelSize = float2(1.0 / screenWidth, 1.0 / screenHeight); - /*********************** - / Get edge luminance - /***********************/ + // + // Get edge luminance + // // Get luminance for four texels in a cross shape surrounding the current texel float curLuma = RgbToLuma(colorTex.Sample(smplr, PSIn.UV).rgb); float downLuma = RgbToLuma(colorTex.Sample(smplr, PSIn.UV + (float2( 0, -1) * texelSize)).rgb); @@ -75,9 +75,9 @@ void main(in PSInput PSIn, out PSOutput PSOut) float rightCornerLuma = LRLuma + URLuma; float upCornerLuma = URLuma + ULLuma; - /********************** - / Get edge orientation - /**********************/ + // + // Get edge orientation + // // Get an estimated gradient along the horizontal and vertical axes. float edgeHoriz = abs(-2.0 * leftLuma + leftCornerLuma) + abs(-2.0 * curLuma + downUpLuma) * 2.0 + abs(-2.0 * rightLuma + rightCornerLuma); float edgeVert = abs(-2.0 * upLuma + upCornerLuma) + abs(-2.0 * curLuma + leftRightLuma) * 2.0 + abs(-2.0 * downLuma + downCornerLuma); @@ -95,9 +95,9 @@ void main(in PSInput PSIn, out PSOutput PSOut) bool isGradient1Steepest = abs(gradient1) >= abs(gradient2); float scaledGradient = 0.25 * max(abs(gradient1), abs(gradient2)); - /****************************** - / Average luma values at edge - /******************************/ + // + // Average luma values at edge + // float stepLength = isHorizontalEdge ? texelSize.y : texelSize.x; float localAvgLuma = 0.0; @@ -123,9 +123,9 @@ void main(in PSInput PSIn, out PSOutput PSOut) currentUV.x += stepLength * 0.5; } - /************************ - / Explore bounds of edge - /************************/ + // + // Explore bounds of edge + // float2 offset = isHorizontalEdge ? float2(texelSize.x, 0.0) : float2(0.0, texelSize.y); float2 newUV1 = currentUV - offset; float2 newUV2 = currentUV + offset; @@ -187,9 +187,9 @@ void main(in PSInput PSIn, out PSOutput PSOut) } } - /***************** - / Estimate offset - /*****************/ + // + // Estimate offset + // float distance1 = isHorizontalEdge ? (PSIn.UV.x - newUV1.x) : (PSIn.UV.y - newUV1.y); float distance2 = isHorizontalEdge ? (newUV2.x - PSIn.UV.x) : (newUV2.y - PSIn.UV.y); @@ -206,9 +206,9 @@ void main(in PSInput PSIn, out PSOutput PSOut) bool correctVariation = ((isDirection1 ? endLuma1 : endLuma2) < 0.0) != isCurLumaSmaller; float finalOffset = correctVariation ? pixelOffset : 0.0; - /*********************** - / Subpixel antialiasing - /***********************/ + // + // Subpixel antialiasing + // // Get full weighted luminance average over 3x3 neighborhood float iterationsF = float(Iterations); float averageLuma = (1.0 / iterationsF) * (2.0 * (downUpLuma + leftRightLuma) + leftCornerLuma + rightCornerLuma); diff --git a/resources/shaders/source/PPNoise.psh b/resources/shaders/source/PPNoise.psh index 7a999f3c5..466de9dd6 100644 --- a/resources/shaders/source/PPNoise.psh +++ b/resources/shaders/source/PPNoise.psh @@ -37,15 +37,15 @@ void main(in PSInput PSIn, out PSOutput PSOut) SamplerState smplr = ColorSinks_sampler; Texture2D sceneColorTex = PostProcessSinks[0]; Texture2D noiseTex = Textures[noiseTexIndex]; - float3 sceneColor = sceneColorTex.Sample(smplr, PSIn.UV); - float3 noiseColor = noiseTex.Sample(smplr, PSIn.UV * noiseTexTiling); + float3 sceneColor = sceneColorTex.Sample(smplr, PSIn.UV).xyz; + float3 noiseColor = noiseTex.Sample(smplr, PSIn.UV * noiseTexTiling).xyz; // Gradient for mask float3 gradient = lerp(gradientStart, gradientEnd, PSIn.UV.y); float4 gradientApplied = float4(lerp(sceneColor, sceneColor + gradient, gradientAmount), 1.0f); // Noise - float3 luma = RgbToLuma(gradientApplied); + float3 luma = RgbToLuma(gradientApplied.xyz); float3 noiseApplied = lerp(sceneColor, sceneColor + noiseColor, (1-luma.r) * noiseTexAmount); PSOut.Color = float4(noiseApplied, 1.0f); diff --git a/resources/shaders/source/PPOutline.psh b/resources/shaders/source/PPOutline.psh index 37826a712..cc7a797b9 100644 --- a/resources/shaders/source/PPOutline.psh +++ b/resources/shaders/source/PPOutline.psh @@ -32,7 +32,7 @@ float SampleNormalizeDepth(Texture2D tex, SamplerState smplr, float2 uv) { float rawDepth = tex.Sample(smplr, uv).r; float3 ndc = float3(uv * 2.0 - 1.0, rawDepth); - float4 view = cameraInvProjection * float4(ndc, 1.0); + float4 view = mul(float4(ndc, 1.0), cameraInvProjection); view.xyz /= view.w; float linearDepth = -view.z; return (linearDepth - nearClip) / (farClip - nearClip); @@ -64,10 +64,10 @@ float OutlineDepth(Texture2D depthTex, float viewDirDepthOffset, SamplerState sm float OutlineNormals(Texture2D normalsTex, float intensity, SamplerState smplr, float2 LLUV, float2 URUV, float2 LRUV, float2 ULUV) { // Sample normals texture at four corners - float3 normalsLL = normalsTex.Sample(smplr, LLUV); - float3 normalsUR = normalsTex.Sample(smplr, URUV); - float3 normalsLR = normalsTex.Sample(smplr, LRUV); - float3 normalsUL = normalsTex.Sample(smplr, ULUV); + float3 normalsLL = normalsTex.Sample(smplr, LLUV).xyz; + float3 normalsUR = normalsTex.Sample(smplr, URUV).xyz; + float3 normalsLR = normalsTex.Sample(smplr, LRUV).xyz; + float3 normalsUL = normalsTex.Sample(smplr, ULUV).xyz; // Get the difference between the diagonals float3 normalsDiagDif0 = (normalsUR - normalsLL) * intensity; diff --git a/resources/shaders/source/Particle.psh b/resources/shaders/source/Particle.psh index e533eddd9..ead87ab3b 100644 --- a/resources/shaders/source/Particle.psh +++ b/resources/shaders/source/Particle.psh @@ -1,9 +1,9 @@ struct PSInput { - float4 Pos : SV_POSITION; - float2 UV : TEX_COORD; - float4 Color; - uint TextureIndex; + float4 Pos : SV_POSITION; + float2 UV : TEX_COORD; + float4 Color : COLOR; + uint TextureIndex : TEX_INDEX; }; struct PSOutput diff --git a/resources/shaders/source/Particle.vsh b/resources/shaders/source/Particle.vsh index 8c5b1e977..bafde72fe 100644 --- a/resources/shaders/source/Particle.vsh +++ b/resources/shaders/source/Particle.vsh @@ -2,16 +2,16 @@ struct VSInput { - float3 Pos : ATTRIB0; - float2 UV : ATTRIB1; + float3 Pos : POSITION; + float2 UV : TEXCOORD0; }; struct PSOutput { float4 Pos : SV_POSITION; float2 UV : TEX_COORD; - float4 Color; - uint TextureIndex; + float4 Color : COLOR; + uint TextureIndex : TEX_INDEX; }; StructuredBuffer Particles; diff --git a/resources/shaders/source/PointShadowMap.psh b/resources/shaders/source/PointShadowMap.psh index b7c346336..26d42f3d9 100644 --- a/resources/shaders/source/PointShadowMap.psh +++ b/resources/shaders/source/PointShadowMap.psh @@ -4,8 +4,8 @@ struct PSInput { - float4 Pos : SV_POSITION; - float4 WorldPos; + float4 Pos : SV_POSITION; + float4 WorldPos : WORLD_POS; }; struct PSOutput diff --git a/resources/shaders/source/PointShadowMap.vsh b/resources/shaders/source/PointShadowMap.vsh index aa2025bf6..e1e4d3565 100644 --- a/resources/shaders/source/PointShadowMap.vsh +++ b/resources/shaders/source/PointShadowMap.vsh @@ -4,13 +4,13 @@ struct VSInput { - float3 Pos : ATTRIB0; + float3 Pos : ATTRIB0; }; struct PSInput { - float4 Pos : SV_POSITION; - float4 WorldPos; + float4 Pos : SV_POSITION; + float4 WorldPos : WORLD_POS; }; StructuredBuffer Transforms; diff --git a/resources/shaders/source/PointShadowMapSkinned.vsh b/resources/shaders/source/PointShadowMapSkinned.vsh index 3863c6950..4f93475c7 100644 --- a/resources/shaders/source/PointShadowMapSkinned.vsh +++ b/resources/shaders/source/PointShadowMapSkinned.vsh @@ -11,8 +11,8 @@ struct VSInput struct PSInput { - float4 Pos : SV_POSITION; - float4 WorldPos; + float4 Pos : SV_POSITION; + float4 WorldPos : WORLD_POS; }; StructuredBuffer Transforms; diff --git a/resources/shaders/source/Skybox.psh b/resources/shaders/source/Skybox.psh index 05f5922c4..5fbe18e13 100644 --- a/resources/shaders/source/Skybox.psh +++ b/resources/shaders/source/Skybox.psh @@ -5,8 +5,8 @@ SamplerState Textures_sampler; // By convention, texture samplers must use the struct PSInput { - float4 Pos : SV_POSITION; - float3 UVW; + float4 Pos : SV_POSITION; + float3 UVW : U_V_W; }; struct PSOutput diff --git a/resources/shaders/source/Skybox.vsh b/resources/shaders/source/Skybox.vsh index 3186e8d56..0de3164a6 100644 --- a/resources/shaders/source/Skybox.vsh +++ b/resources/shaders/source/Skybox.vsh @@ -7,8 +7,8 @@ struct VSInput struct PSInput { - float4 Pos : SV_POSITION; - float3 UVW; + float4 Pos : SV_POSITION; + float3 UVW : U_V_W; }; static float4x4 localModelMatrix = float4x4( diff --git a/resources/shaders/source/Toon.psh b/resources/shaders/source/Toon.psh index 2cce2865c..b00d922bf 100644 --- a/resources/shaders/source/Toon.psh +++ b/resources/shaders/source/Toon.psh @@ -6,10 +6,10 @@ struct PSInput float4 Pos : SV_POSITION; float3 Normal : NORMAL; float2 UV : TEX_COORD; - uint MaterialIndex; - float4 WorldPos; - float3 LocalPos; - float3 ViewDir; + uint MaterialIndex : MAT_INDEX; + float4 WorldPos : WORLD_POS; + float3 LocalPos : LOCAL_POS; + float3 ViewDir : VIEW_DIR; }; struct PSOutput @@ -22,8 +22,6 @@ SamplerState Textures_sampler; // By convention, texture samplers must use the StructuredBuffer Materials : register(t1); -const float Epsilon = 1e-10; - float Band(float lightAmount) { if (lightAmount * 100 < 0.05f) @@ -39,8 +37,8 @@ void main(in PSInput PSIn, out PSOutput PSOut) MaterialData material = Materials[PSIn.MaterialIndex]; // Get texture colors - uint TexIndex = material.diffuseTexIndex; - uint NormalIndex = material.normalTexIndex; + uint TexIndex = NonUniformResourceIndex(material.diffuseTexIndex); + uint NormalIndex = NonUniformResourceIndex(material.normalTexIndex); float4 Diffuse = Textures[TexIndex].Sample(Textures_sampler, PSIn.UV); float4 Normals = Textures[NormalIndex].Sample(Textures_sampler, PSIn.UV); @@ -83,7 +81,7 @@ void main(in PSInput PSIn, out PSOutput PSOut) float3 normals = PSIn.Normal; if (material.useTextureNormals) { - normals = normalize(Normals.xyz * float3(2.0) - float3(1.0)); + normals = normalize(Normals.xyz * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0)); } float3 result = 0.0f; @@ -112,19 +110,21 @@ void main(in PSInput PSIn, out PSOutput PSOut) // Calculate shadow factor float shadowFactor = 1.0f; + TextureCube pointDepthTex; + Texture2D uniDepthTex; if (Lights[i].castsShadows) { if (Lights[i].type == 1) { - TextureCube depthTex = PointShadowMapSinks[pointShadowMapIndex]; - float rawShadow = PointShadowCalculation(PSIn.WorldPos, Lights[i].position, depthTex, PSIn.Normal); + pointDepthTex = PointShadowMapSinks[pointShadowMapIndex]; + float rawShadow = PointShadowCalculation(PSIn.WorldPos, Lights[i].position, pointDepthTex, PSIn.Normal); shadowFactor += (rawShadow); pointShadowMapIndex++; } else { - Texture2D depthTex = UniShadowMapSinks[uniShadowMapIndex]; - float rawShadow = UniShadowCalculation(Lights[i].type == 0, mul(mul(PSIn.WorldPos, LightMatrices[Lights[i].lightMatrixIndex].viewProjection), biasMat), depthTex); + uniDepthTex = UniShadowMapSinks[uniShadowMapIndex]; + float rawShadow = UniShadowCalculation(Lights[i].type == 0, mul(mul(PSIn.WorldPos, LightMatrices[Lights[i].lightMatrixIndex].viewProjection), biasMat), uniDepthTex); shadowFactor += (rawShadow); uniShadowMapIndex++; } @@ -132,7 +132,7 @@ void main(in PSInput PSIn, out PSOutput PSOut) shadowFactor = min((1-shadowFactor) + 1.0f, 1.0f); diffuseAmt = max(diffuseAmt * shadowFactor, 0.0f); - specularAmt = max(diffuseAmt * shadowFactor, 0.0f); + specularAmt = max(specularAmt * shadowFactor, 0.0f); // Apply lighting influences and shadows result += ((diffuseAmt * influence.diffuseColor * color.rgb) + (specularAmt * influence.specularColor * color.rgb )); @@ -142,7 +142,7 @@ void main(in PSInput PSIn, out PSOutput PSOut) if (material.useHatchTexture) { // Get hatching texture and tiling property - uint hatchTexIndex = material.hatchTexIndex; + uint hatchTexIndex = NonUniformResourceIndex(material.hatchTexIndex); float hatchTiling = material.hatchTiling; float hatchLight = Textures[hatchTexIndex].Sample(Textures_sampler, PSIn.UV * hatchTiling).r; float hatchMedium = Textures[hatchTexIndex].Sample(Textures_sampler, PSIn.UV * hatchTiling).g; diff --git a/resources/shaders/source/Toon.vsh b/resources/shaders/source/Toon.vsh index 2994efdec..a3c476f04 100644 --- a/resources/shaders/source/Toon.vsh +++ b/resources/shaders/source/Toon.vsh @@ -13,9 +13,9 @@ struct PSInput float4 Pos : SV_POSITION; float3 Normal : NORMAL; float2 UV : TEX_COORD; - uint MaterialIndex; - float4 WorldPos; - float3 LocalPos; + uint MaterialIndex : MAT_INDEX; + float4 WorldPos : WORLD_POS; + float3 LocalPos : LOCAL_POS; }; StructuredBuffer Transforms; @@ -28,7 +28,7 @@ void main(in VSInput VSIn, uint InstanceID : SV_InstanceID, out PSInput PSIn) float4 TransformedPos = mul(float4(VSIn.Pos, 1.0), Transforms[transformIndex].model); PSIn.Pos = mul(TransformedPos, cameraViewProjection); PSIn.UV = VSIn.UV; - PSIn.Normal = normalize( mul(float4(VSIn.Normal, 0.0), Transforms[transformIndex].model)); + PSIn.Normal = normalize( mul(float4(VSIn.Normal, 0.0), Transforms[transformIndex].model)).xyz; PSIn.WorldPos = TransformedPos; PSIn.LocalPos = VSIn.Pos.xyz; PSIn.MaterialIndex = materialIndex; diff --git a/resources/shaders/source/ToonSkinned.vsh b/resources/shaders/source/ToonSkinned.vsh index 4d59b3cfe..5dd9ad57e 100644 --- a/resources/shaders/source/ToonSkinned.vsh +++ b/resources/shaders/source/ToonSkinned.vsh @@ -14,9 +14,9 @@ struct PSInput float4 Pos : SV_POSITION; float3 Normal : NORMAL; float2 UV : TEX_COORD; - uint MaterialIndex; - float4 WorldPos; - float3 LocalPos; + uint MaterialIndex : MAT_INDEX; + float4 WorldPos : WORLD_POS; + float3 LocalPos : LOCAL_POS; }; StructuredBuffer Transforms; @@ -61,7 +61,7 @@ void main(in VSInput VSIn, uint InstanceID : SV_InstanceID, out PSInput PSIn) float4 worldPos = mul(pos, Transforms[transformIndex].model); PSIn.Pos = mul(worldPos, cameraViewProjection); PSIn.UV = VSIn.UV; - PSIn.Normal = normalize(mul(normal, Transforms[transformIndex].model)); + PSIn.Normal = normalize(mul(normal, Transforms[transformIndex].model)).xyz; PSIn.LocalPos = VSIn.Pos.xyz; PSIn.WorldPos = worldPos; PSIn.MaterialIndex = instance.materialIndex; diff --git a/resources/shaders/source/UniShadowMapSkinned.vsh b/resources/shaders/source/UniShadowMapSkinned.vsh index 8d390ad83..6980e1b90 100644 --- a/resources/shaders/source/UniShadowMapSkinned.vsh +++ b/resources/shaders/source/UniShadowMapSkinned.vsh @@ -14,9 +14,9 @@ struct PSInput float4 Pos : SV_POSITION; float3 Normal : NORMAL; float2 UV : TEX_COORD; - uint MaterialIndex; - float3 WorldPos; - float3 LocalPos; + uint MaterialIndex : MAT_INDEX; + float3 WorldPos : WORLD_POS; + float3 LocalPos : LOCAL_POS; }; StructuredBuffer Transforms; diff --git a/resources/shaders/source/core/Animation.fxh b/resources/shaders/source/core/Animation.fxh index bc34390c3..acd0c0623 100644 --- a/resources/shaders/source/core/Animation.fxh +++ b/resources/shaders/source/core/Animation.fxh @@ -6,15 +6,19 @@ bool IsValidBoneIndex(uint boneIndex) bool IsValidAnimationTransform(float4x4 mat) { // Check for zero matrix, ignoring homogenous coord - return all(mat[0] != 0.0) || - all(mat[1] != 0.0) || - all(mat[2] != 0.0) || - mat[3].xyz != float3(0.0, 0.0, 0.0); + return + any(mat[0]) || + any(mat[1]) || + any(mat[2]) || + any(mat[3].xyz); } float4x4 CombineBoneMatrices(uint base, uint4 boneOffsets, float4 boneWeights) { - float4x4 boneTransform = float4x4(0.0); + float4x4 boneTransform = float4x4(0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0); for (int i = 0; i < 4; i++) { if (boneWeights[i] > 0.0f) diff --git a/script/shaders.ps1 b/script/shaders.ps1 index a2024689a..c6fd3df95 100644 --- a/script/shaders.ps1 +++ b/script/shaders.ps1 @@ -13,15 +13,11 @@ param [bool]$DebugMode = $false ) -$Compiler = $Env:VULKAN_SDK + "\Bin\glslangValidator.exe" +$Compiler = $Env:VULKAN_SDK + "\Bin\dxc.exe" $Optimizer = $Env:VULKAN_SDK + "\Bin\spirv-opt.exe" -$Preamble = "#pragma pack_matrix(row_major)" if ($DebugMode) { - $CompilerOutputDir = Join-Path $OutputDir "debug" - if (-not (Test-Path -Path $OutputDir)) { - New-Item -Path $OutputDir -ItemType Directory | Out-Null - } + $CompilerOutputDir = $OutputDir } else { $CompilerOutputDir = Join-Path $OutputDir "temp" @@ -37,10 +33,10 @@ Write-Host "--Compiling Shaders--" Get-ChildItem -Path $InputDir | Where-Object { $_.Extension -eq '.psh' -or $_.Extension -eq '.vsh' } | ForEach-Object { if ($_.Extension -eq '.psh') { - $Stage = 'frag' + $Profile = 'ps_6_6' $FileName = "$($_.BaseName)Pixel.spv" } elseif ($_.Extension -eq '.vsh') { - $Stage = 'vert' + $Profile = 'vs_6_6' $FileName = "$($_.BaseName)Vertex.spv" } else { return @@ -50,18 +46,20 @@ ForEach-Object { $InputFile = Join-Path $InputDir $_.Name $OutputFile = Join-Path $CompilerOutputDir $FileName $Args = @( - '-V', # create SPIRV binary w/ Vulkan semantics - '-D', # input is HLSL - "-P$Preamble", # prepended our definitions to each source file - '-e', 'main', # entry point - '-fhlsl_functionality1', # enable functionality1 extension - "-S", $Stage, # explicitly specify shader stage - "-o", $OutputFile, + '-spirv', # generate SPIR-V for Vulkan + '-fspv-target-env=vulkan1.2', # target Vulkan 1.2 + '-fspv-extension=SPV_GOOGLE_hlsl_functionality1', # SPIR-V HLSL semantics + '-fspv-extension=SPV_KHR_non_semantic_info', # SPIR-V HLSL semantics + '-fspv-extension=SPV_EXT_descriptor_indexing', # Allow for descriptor indexing + '-Zpr', # pack matrices in row-major order + '-E', 'main', # entry point + '-T', $Profile, # shader profile (vs_6_0, ps_6_0) + '-Fo', $OutputFile, # output file $InputFile ) if ($DebugMode) { - $Args = @('-g') + $Args + $Args = @('-Zi', '-fspv-debug=line') + $Args } & $Compiler @Args diff --git a/source/ncengine/graphics2/diligent/DiligentEngine.cpp b/source/ncengine/graphics2/diligent/DiligentEngine.cpp index 08cce5d03..5137dc181 100644 --- a/source/ncengine/graphics2/diligent/DiligentEngine.cpp +++ b/source/ncengine/graphics2/diligent/DiligentEngine.cpp @@ -70,6 +70,7 @@ DiligentEngine::DiligentEngine(const Diligent::EngineCreateInfo& engineCreateInf } auto engineCI = EngineVkCreateInfo{engineCreateInfo}; + engineCI.Features.ShaderResourceRuntimeArrays = DEVICE_FEATURE_STATE_ENABLED; pFactoryVk->CreateDeviceAndContextsVk(engineCI, &m_pDevice, &m_pImmediateContext); if (!m_pDevice || !m_pImmediateContext) {