From b79473a8818fc57162c925e0ad9922b6da277e16 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Thu, 30 Apr 2026 15:43:28 -0500 Subject: [PATCH] minecraft: texture sampling --- Makefile | 2 +- data/minecraft/terrain2.dds | Bin 0 -> 22020 bytes data/minecraft/terrain2.png | Bin 0 -> 12659 bytes filenames.txt | 2 + include/minecraft/vulkan.h | 21 ++++- shader/minecraft.hlsl | 19 ++++- src/main.cpp | 4 +- src/minecraft/vulkan.cpp | 148 ++++++++++++++++++++++++++++++++++-- 8 files changed, 185 insertions(+), 11 deletions(-) create mode 100644 data/minecraft/terrain2.dds create mode 100644 data/minecraft/terrain2.png diff --git a/Makefile b/Makefile index a801336..e3cc623 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ CFLAGS += -I./data CFLAGS += -I../SDL3-dist/include CFLAGS += -fpic -FLAGS += -fstack-protector -fstack-protector-all -fno-omit-frame-pointer -fsanitize=address +#FLAGS += -fstack-protector -fstack-protector-all -fno-omit-frame-pointer -fsanitize=address LDFLAGS += -lm ifeq ($(UNAME),Linux) diff --git a/data/minecraft/terrain2.dds b/data/minecraft/terrain2.dds new file mode 100644 index 0000000000000000000000000000000000000000..796b72700cbc4834e6761d370f668ad657cc1e1d GIT binary patch literal 22020 zcmeHvcT^MG+V@OCiL`(sO@xSusDN}LAQ_5)ic)MSC}6>Mq^LA06N+G?*!5UIP>*6k zY@i4kKm`%078L115R`--NHY5!yw~-^<3&{oB9a^UP+R zad22gi-I6XQeFyT68nh{gg_8X>?jj||3aY=ZN-R>gQt<<|Lru2Jn}Dxw-86j|2#U; z=fp?iQo(s{UzG>Xcb+X9)h*NdT{UsfVwUS#_jyY*t1i+VFP7&T2)k;gN5gVoUifHl z`rh@VK)RP^8cVe{kI0bx#QU5#@;ZIt`Q1>!V7cUu=7HqKfQ{8#db4FDc8_-S=VuJF z!{}h61^e}PG5m%!@&Lc!S^-eswGv#FppifXJ?VP;1CB1eD&{bh?Eqod)64VT0kC0> zG~aCv0Q3qW9uUdOOZgtUjnpbTh%p{8u71G5jb+)(#2i*$9kKb;_{ib`+df7i?d+`T z_m&0J-rPMUT1O7sHqPCx3|Zo!D|Ay4`#|jTj%&bY3c`3;cyuogAit4#lhdz-&8zyg ztL~{BX3A{it?HPPC$-|r)`}n(CpXjk=aQnov)((FMme1DF7dOjT3!b~+kl;(WtvaH zQC9xjxG!m=*FQxG^Q?pq77266zj4aNod-sW8i$Hn9$x-%XvTq0&(?-N1K;?3&f^@= zlP?+bid>$}9tP(Fz*+VH;oKjkabC(eIRAD z7euz;dA)2fK4z;dpugn<%R-P|KZ-8m`*$T;uFJ1Fl~nQ8@o{_$UV6!QAYnn$LA6M! zR{@8g*~teVMbLbmu2@?mFU>k{Pf;yA77HJQ8>#dAzdDuhW~E zyZvQw0Os9rfvO5n$}^blpfJk~xilK7sQ^#}@_`kKiiPpUy?3UX`YZ2 zZ4;6n+*|3eaVO0+Qrosf%*HA^I+wk=W1lWlPx;yk9_DSgra=Zri_iXXF|bMIW4P(E z^Go7p+p6eFlN!vE!=yCLrZ)`ARNtorRlTq|ax1_o$>GH|Q+o$(N~?0ZL&AX7QDAie zEQ;jcTHqAtyo&PR`!_}bj-O?JMY}*L>s;dlG_Q~!Se=WSsbYLM(JFu+xe0`=0(aJHuIV-r}4J3OFD}z6K+%_CcS)Z{@54??^riZ)LUa|-uZ3? zS1q1{3~GTveWg^|Z6!A^`eDZ6gG{raH(VBq(GtyW!`f=xW? z?EIpSY{4hNo3J~}$6kxKv?7ZwsHf|3a4F(Ips$2D^9TQ{01&u~^`panj#yWEdCtcP zzH_;mIG9LQxMX%OXx!#KxlRow4#ocRn&81g%d# zxeG@jzrjR@Gue$LWm!9(?{z7))#H13l^WfYczI^OScpr!z3KIt9h*r&C;i&I29sGH z11iHF-)$??8y2LXQUZpD_>90D5Il6O zn5EoMQ^;Xlk_KhDy{rYB??z%H=|T$tfN-;TKRUA69~)1{&l2a)?!PskTaYoUe5fCN z%EEI7+4!Q}J+q2120v%y0sx^F&IU9R$v2x-#7FP)8J9VrF zv>t4|*-B~^eM{Qhb+zw3K8?aQ;_j9S^i_#-onF7UGuH5h>>@0+jBZ_?m8DjH;@C9X z`Os6W!QyC(JV3*;bFLaWt#QS)^j3sy#DTaTch2zS<)5G1^r?J!2N%`+`l@~H zjHjmqnwrx_wobW`PZ|2QcOUw|(DlN$D*vM}85;STO!c5%52*9i9LV*m7({t>0S_q1&r1mo-4+LHKsHuOkLNo6HrvE>+7v3( zI>Y8sRrCV&H5U)*wsH1Q0vR?>lS2%TI&WU5ea-&@s=3f6Vl0H?XzQ0ngPqSZZ;-Kz z2`{>7INBUgPQC7u)qFsfZ6tMYPSP}0M9`mw<;GN4sFrogi$9bJ^1I{I;fgf+t>F@S z(Vf_pdFJR87QG=CwT$NHl;wc%qrGjYO5OK9u(260>+AuIQ>1J>1x>?!J{#G1ZSZ%J zPQvE)TLIus0MJ{>&rOevO-J+b-l!o~vn&7WfqfdX^3%$}*oe@_hr=J-7u}>fXBOjK&JC7%ueVobj}<_qkjhAiEN>A#qNx;Gl8P1$8KC*D{wQvYGVL##z6NNTeG)nYSlWof2= z?n}|V**$BR!5b=wzS8`ZQ+s^)qFm1t^U3}fG0cq2SHe*_?lHdQ(8e*(nevC?+n9!m zQW7N++A6x{Vzx2~h)ld8MQ_e6XN?4s*v=R6o`q!kqjpVu?$pm(L1}`8`-DY`cwnPM zN(-Gtk)mn_Tjp=o34 zX|RCY9T|Z4Tblr84J3us6hjhGT-&kp5h^sMe1=H|3*?ZTUqRTlw+k2M+X3{> zb&w8U^=7J4EvQ7jYad8|a_Jg`z}cIWd7hwbeh<|R#vtZ~v9Wb(V^b_1cN-h!8Q4m! zi@}<);F6=58V<}Abc_*x7uck4^sz_2_B!|ZJ+JP7ZiZc7>h@bcUSDihk?x84gHoxL z^cq?EbC5xsxOAPk-1q3n z=}bQriH4{d$AahyQXH>mh4D$-HE6RiH70@ox48Hnh8SdsU{h$4TOkzggIWQX!=*v1 z{4~lTL1Q6xL_}%^}@xJQPV6Ks+w^JXe6e7L-63goCf=d_WhYH%36-%hcEE zAA@;3P`O*k3Q~OqF`Wg#2MNwRTCRi>JlNHKY;4&;evG_i0^5zgUn+q_k6{6XoXMmq z;(#i1eV2b`nH|Z<$j3lo-M7}2D|(_+yD_ZvqoK}zfNqrdO5G>%NXA)9?htu1(@;es zF|Nm}Q@>n8KG6YoN91M1?B9$Z+(;7BYmS$GPwIVR1Qi9#g>8nW%&1he@Mv*T&5-7$ zgRTctm2(wc3x~rXmGGeF$lZelxWec04J}|m%$t7S+A|DJVKl@IaF!Gh&iuS2O@}E+ zn<5~qP&}h#AsK6$Hl#i=9|TlVkB|%z_)q)6_fpk}nEpy@Ffm_(i297~j4QAqh9S%u zTuEm#3Ii@6@WyC?FTreaLQk;FI78w9Q(0VXN2@J)S`-%!SAifJ8)Kx23COMUc>I1y zAef9NVFyQFJ8>h;S-q~ktqqn!`FTe&b*F0Ep4DD@Ld?Tgs!_Q_krINL;n+!@Udbt5YQkhBAZX}`^9vHH-pucG;QXL ziTQAYqGAIKq zOd|)q(Bulq^mo!OgdAW9M(0Y(ND}%`B`p;GtKQ$}jV@t`8}cs5r!wMHBjEfxfUfIc zz)|?sSMXFz^1t8@5qJ{#pM({oE1_xzZ3m>pl@yS9DjG4?GE~M7yovhywvSCht^hE9 zm!NuLn4}`%-&7$Jvab4-P6jgjHsO1;;zmX%`0ZviUOnqB24T*_LJQpxP}b8&=>2mD z)9M#m@*2SNpfM^GO5pDX0F`dFOk?SmeeNz(kG+Jg3tJ4zv==*e=q)W)fqaD@{xH{& zJniywmGv@rZHRe2ylSpo>4=kpalm(+2(PTk=e{&)$7UaDFOf(|Ks}qYP%ssYxX+FSocM0$CSSGDS=Q| zt@SRoZioE5Kvs?dk{@-tAFJZhO5x}fj%9lYKMv@}cI zmAk8q>86jfaeyA-j<&oLj&igZg%?;&S&Y6MaY%(p<{^l}J&EU}AMt`T{~pAYCn;IC z#=_K}@h7x_CQXAU;!nRH@h7~icws&)m`&UKo1vizN)-RuUMKR9mTdC#H05#S{(%t%{pWaYVM#*e2 za(KxcM{$M35S0{uMpI;r`RaP_v{=tXKhGPh=+iNNL)3hQ6LYR`4OL{8wJn*oKVQQ| z<5gSiQd1Qwf2EU>boa)h87(BkjJGq|u|clY=KYa;%fjK^PXpSx&0wQgQ% z>qASqmot{Wdwpn|#|;lLu^v;UWRgQ(RNBaS!){)t!*pYtY5kt zhPx?8Otsv5GRrO14>{&XBM+^6d>3?IbjwJQ-0J76CX=`&pv&L#%xOe!iQ$oLDrXwW zbWEe+tagTjlixgVwPTL9=q^Tu#6`g>Sz(ipaDdFlG@%;OJqI58 zX#(zEAxjY_rF6)?Eox5coqdw;+6eXq$q7`L>A#BibI6eZ0n~|>!J{17;if|BISL!AFak3;&fGsEPH)B-{ zWeEJSqFMs~pkSniSeeHNTccQ7K=ur3^OH5?8qz-6rI#!ake!2zZHf33`m6C4_4oJs zThaK7#{ch(_eAqgH2*~N@4s)jM0^nOLBt0UAAXL2NDoAMAku@MY#`RR|K{~cQU4-7 ziufqv48WOM0)U(4I=+6(gTqmi1a|D2R}zZqz58B5b42BHi+T_ksgTj;NR&1 zk&g4D{CIw!Snv8-{#W)f$1DYk7|Bd6Sz>~9lwY;~xxO~h?a%%uuJ?ayTeeK;$h72q z_2R_+$p1r>1^yPz02MP~gUoMO5vHsjwy+t17!qKEfhw$f=yz`5@dFl4g<-=J`F|pQ z{6zb|$N%S%pLqN~?O(-va{E7tKlXt?fj0;>!P$b$X3X;Jl#UCQgY8~}SDIKa(lf9R zjsK{p{bN4J>1^`)ni9yle3U$-8TC5i|9ku=$LC-V_i>o5kP2ef?z|3|;I6YW_)+JA_qOyvKG@c)zg{b%RPpTr-r zsMdJM0Km@ZZl4+yI1N$$96F%~SkVu}GhfofJD=tEThAZS9-4(+5tB1ZiX6*3I{xGj z8uJ^GFNp1SmFqi=qjxym-t*K7VYc_j+(2QMyH51Ltrt$$dQXgcbIkO5@1Fl;x7T^m z!JSCN_+kSm0D=QPuZ}lW4wgOm$u%-f4YL7KKRLgawZk6B}MM`h**{RNWxkUr^ZD`zZ726?4z5Df@?TV_tDC`-xuOO<9Af&w6aI zCPjhHR~)2Yyf;!XJ5B6F*4zLSm%I=A7yBMBRey9TacE<2us(bHg*x6k-F~S;od+w~ zh8i7R$121J0&`ZEue@KBxA5*C^P^KULN`XaCm@Se(vyh<-^X_zx44{il0XEHqpXW? zpaLhIUhB}yNjy+kH!weY>-J#zTJTuYZT@Kw+iF;US+4qqjwIag;R%)B@eQ5e1v6-P9sZO6{MR}#jYG73jELr@Go7We^_~U{W zP*4pHu=teD;dz&^#G7mDc9>Uv5r3L?Mf{qy8Lp$ZyK}~t%%_`>Hh%winvK=(`QZ`w z_U*W;walFzX0YtZQ6&p6rNMbqmFv@Z(TSvMOXRmKq0BO)d^}wJcFJ*ygtq@sgCXKNSrL+iBj=Oqj?oOUPL8z_BLHGjVa$$PrK7x_oE2 zl@$wobcY^{$8;h_Crq{H5IJHR%!L_)v6LC*7IEseP|TaxOexQ^u@2Lj0+>C6q%@~p zYJ366-HxyExYH3``V9Z10jvOCK5k%kpXs+x9e5ZY>2Pq)q#yD#CBMLM^!)EDt~wvy zXDYd0`%GsIEo0q=se|+?c+O!X{pA$tfpeT9={d6w4az$XD9-Bfyk+D&wPxnav(fKo z+l<<#EDjGq?`~c;_u6jPomEM*7Y6!1QJMU_^<;b3(B-@k7Avp%^`YP!SL^1+jc`Ur zsr)epe`>H@ErXRti<40y^02VCL`Ej^Xq-v$420HCqwi$O=@a=}UVqwuMbWP(|5114 zn3}w!rGh73cS394%3Afq!79bdh3y8@`cl8R$nCRsb2sc_pRj!FTvV6qAQNnT$j`cb zw;k`sff47KsJqMAOLy{kRnm9F&K8Ai{o|p39^+=|W!2La?7qprcd{MB@Zz%~0qY`| z75%j*HVI+<$TvU>ZrVdMsi9Deef!SsgLwJS-ZWbHKmj#N}H=6f-?0clfxq8L%nzRiPnwD~V zIRNP)z6zuMFa_xf)W3cOM~63^dmzag#(VPivO2)$S8)fQnpy>954ZENJgh|hDU%wg$#dCEc9;_TcgdKRMkzN46HS-nM)fAUi zPjIA!MDE0kB;R$2rnnYp9=P#7&UnqP<_I$9CB z#QR9b83UR_R6p$vKGJJ5y+ZX3^2%d5+z1)@4$}ovjuz1$_N0w8>1f)>V{x(?75c&P6Bj5NHsex$@P)8EvrU7A! z$6<(q0F*f$f=&^)>#fA~Fi+v^kPJOZhcVQcR0F_&emwrqc%(r9vIze?PKJ^hBuHc8 zdG=-o`s#B0z51@9uzVe2PY7&YSLm5t78m-;2UU5 zQAJSzpdk_I-2?`FPi7{grU(G|(12eG0{~vZMM1{^fIABSaB2(y@MQu3xK6npssi8# z2u?D(t^fcN<$nRf>zA+xxDd`wR#6h}6bcs};%n)4AT9Wl09gr94X?F}T<@O-n(dE) zmX+<5Rh=C^a-Np?v}|JVp>$3V_>z!_u#%$fQC2%p$nY4fWTq1RRZ%YF+RzwDtngH9 z;*j`36Rv!Mo|^8H`@HT`FCZSnv`fHgN4qV=(^8XGU2VWwZtdxZ(3^k3$GIWnMmrEA z6@tjlaq#R0k}QS-5H1D*nCIXP*kg4&6blpc$9kZkRm__HJKCVZ9S3K8^h&E@$JCg` z6F*p9h^q-LN`-wk#1a#g5|^!vX@wVR9b&|=bIXx#luw+)?ZQK&lmjCoey0QQ;eYyB zm&0R^)BMWy#|yHbhTJ%1+PbY<)7X_vMiNa#B^REH(1#+NOrC5k^Mt_=?#UI%nAq6F zs9SZ#ak4E%je1f~5MhzmaLym-SZ1{tHJ~ zfC(t5DiHQ?}mBkM^H(GVrh9R zoZ|-%iiHoFBznfYBv%F_?e`QaKz5$H+nM16F=uH0773*PI)dkw1lEs^Cwr6A_dDk| z$iHH6H(J~(!hW#sOSZGiE$Ee}QQ_+>_Y{~%Mj~BTWXO|dCl?#)N{@HSLc{n+hB^sQ zUAONgepoIy9Mi&2Sa*rSFuH0%6h7oi446>R8y?{bqQ43cZ`K4WGOPVRu$B1l{EDM_ z-uNi6IP$#sBG+qYNE6v@r?8BCg%eEl0^g!&gdGECBq`E{j@+HcUYE2`V)5jRu&Z z!~I}i2eX4?RshjTYesU(NWIyel!x8csH~;I-*3~xdNk6%34TVAQ#$P(DZx;&t@1R| z1w(Bpk?IK{6^E?X?)>RQlf+L{Km5Z!O`9g0I$nPBX3(}t)4dDbZ_K$WhHl99`>xX( zwY=hnFPhqg==`F*nLLOp>Np~3nbFM6R)L5+L8mlFrXumTYkA4h7jp@}0O4J$I0gC$ zq6$eaHM$U_K_ihQ#N!xQsx?W&3l=v<=|92)Q8y)YI5AN)Ufo7}(O4~R7{2bD#mVA0 z=Y_{)R+%x;S`)L&oAJ|E(wdr;P!LN!O{s@Vu#o)#pQx$#CwgA*wty4Qin%rehD?GEayc*PI6isCe9!v3CiL<%frXQKan z?-Oiw9`?pf*N@M`8g^E0L5->`tiW<{%r zXcZ1L2`EDk<5OOnN`GU-drQhu-e3xt5Re{CT+2Tv%TWS#S?9ef6cJUpe(0eD2ds+9 z+aQE!1EK~1pLeDI;sQ){Ov={-#^Q%Zbi0c3)}~a>9B~7XeIPGNk{ngFmpRfT&kF;sQtrs(jF7F?7-A}|qA0i9(&eg*ePOx;o5@2$AG`-dor5o-;`~bM zi{yQ=+*>X3mjV_z)t@40H?LztB$ES5pj>`pmQT`S z?)CL_=WCoG!iS~=2Q7ed(r8aHVt)ED>@H+9>%ZM;#NGD&IH}V!I z8+o|b{CMg|i*FXX4X0Q&2;NeOvuYHfNu^aeqt2SzM}D1QL5D^t7!jvShuJjtTo*ED z97)K7%j7b_%C<|%nB!=x1VCWod!pzKD^XyblF1$Wr_{6Ti!{Sv{Pp4BV2BVmZqClQi(*!eXmeCvQ+z4 z*%8HbJVZ({lJTYuqdzpa%S`^-@p*J7n7Yoe%vI9(!*Nr5ox08WXZbotZI)RUY;p>n zLtA9)ZTCo!A9&l~g2ZD0N2C-t2(!-`Pme0}j;kbi@iREg7a~uADV9NIh1kP92U!+_ z#T`m>QRi-MJJa($`u@SK@xZeVQ}Iyd2j}U#L*)jEnqIIBLwqH6rjQBG)y28RT!oa6 zIJ$*W!31c^VZkoqaf|1S`-(>AyRx<=KNn2M!;V;c(FZ7+iI@ge!?+QVn& ziBFX)QX*UlbWt>b*Y0mz9uU%9vcC~&=hJ0zvo}xOg^s+dI#MxRV`p!?;B2T&N*Eb@ zE{`?IjYMvDgNN9z(1ru*e5B%E87u^MhvD7dqFC6kC=OI4C(!eS9S+dZAf=8+dyAFh z-((>p+KE)_qrWIu&W*sm$I8_CT6RmScY5)Q?K}M^HTrQ4Vv1bY_|3qQH1Aaxvq_U| zMWqsbo(L8vnqAw5((Ase4HWWmhYZCQYRKruegb8(($3vty|pFjU0Dm7;=}A>frN&g zgy~lzk7$rYeld;Oe$}3_a;{Bco=vL)6_zCTm(x%Z1#xQhOYxiI%;H#(3T}}E#+U+n z1&I0W?JCbfh8H=#M^YWitYYFU>)d)MQayf5g(Q=)}4UViXvY@ah=ti#uaVGvNJYSHe`Utd~EVRR?~BHn|BD8Mp^&n z#ZFYaO{Ll2>QPZqjQFOysU3R4FJkDD;l}RRl7sTBsU;mP!Sn^BijbWL^_B9TsAW(t ztf{9WI|WZ5(HmoNLGVlgZ2K~!46CU*26W{)M>&kok@WTD|Ee+ktY5!wFYvHLpB>pe zvrS5p0$|J#ZQ(z@TIp|FJ;FHIil_z3O8MgP?<;hmcFEIhAw^ZRb2OTo?QI~f+-JhlZM++bh4LnaPwWV@wuTUWJ+A4J}=+ zI|8_;i^HLBSCn-?h}3L)Zr{#<=PCh?b$cT2VieY$UrF~W92YB8=!)sTYdp|p&*(ye zvoq?~W2t;h;|PSqow_o_RLk+?XV^U01pV_4Qf1v{B_^=Zv29Gt}L}iZf%j+eh62Gdr>5e?3;LvJ8iugV+M;P#S(9e zaC7{H7#z8%6Hmv&*i8tIDcY@ZFrR*7W_O-Cv9d|m2t;k%>|epRyvx|$<}HQ!qV*Yx zG>~`;NuwG0a)w#Ob2ia5W@AkiqwzxcwbGk~OnnppnF(V)8@qmF1~f}_I<+oOl96gZ zOgOq;F-MbF^G*3X=PiX=MZV)&bcjroXlwe^<3QnEakF-OmS_?MyIMUFH!E~$*gzo8 z-C&X;NA2Y0PnRM~mt0Ji&4Z+(2|Ng8)X(Cx#eq>QM~gL8H-28hx3WPI=S~Vz;0qtz z7fmNi|5u1W6JxP=!(+w2GBw&@rox%$#}>?hpaGYo+xyr~E+q21H8298tY47lDWS(-nC!74!F$>j(X+&L zEa5{PqA#EpsN#gB9_Gs$RxQd6)G}7^%D0mWt;1!!C+eY)^nAJZw&l6Xy{qTNJ_rf& z6%nMx_yAPckmO7TuWKTUs7|_Uc^{?9(T*LtQmOHpR*Dw3WZP~1-T%Yhz$rtQUnYn{ z-dYuGbxo03E4YCyv?-1*^idF_@dh zUQyXhG+04=-}OaAfPj2uCPZsuxAvBN-2kBBO^ub~y5l&?>M&s?F%)kIQLZS#tYdoV zL<-pH%l9XpgZ#DiNlq$)C3()p4+c^w`k*vMycEI$bf%yw!I(y4ZczRf3Qb&2h&2JU zBPZ*82`pRvs;;8h@yhNOu*TBjevek+LisI8 zrW}nr*sB&0BEz$w*diQ3gLGd;F`A8>xGmq-iPR6#521GMxE-v~kAN9HL@;)MiI*Kwy7C)&p@=N`AGI^j zW~NVaNcJG`zPOUUaZ*&35hMPdt&&&4mq(6V-`vZLv)H_`mw$Ky;i1$u4?aXhGc8pt zCu}4M{?+e%WqC60riKd9`#qTK#ymwN4^@$+K^Ac+F4~ae>#2&m8FerBLWK5XgU5)J z#S)36eSMlv8)j==wmDyXZwn$Zrew-&BVUZwi&%^uwXn9#UdqNf;+2_OGhEK3cygSk z2?}?}>)UvQa(xjf3Ge)h)TMj&9$h(7C~|M+w20-?v#CIgcRFa z==^@U^#R9%9|30p#ae43zI1^YAO6rjQaxyLQR3Anlke>BZQS?IM?$P-NOjA+(a{F= z>u1Q)R8_#RQf|n%<*|Pw1;)eotI$vnE5uAOHo?V4R2kFcl*W)0Y%g}%20}wk(*nw7 zuEaJ*z^gM4HM--{MuIzwgwnAq^7IK68OxJ|!?6R6z11%PoqbzV@Jw|QmdZc9Q?sqk zPLFb#3lepIq8V~Yh|?^SieIlqN3dhvGu)`4c37!I(W-8+4eIN&+(F_~%JZa1;UFs* zO1RKPl}T`=i@5Mdjj&ny1RJm=?5T{>&e1W2zjpA&g+zbN`MZaI+4kcr9$(dWuULEi z$NCH7TrW#F{+4t4kyxAHWo}}st<~V7!>F*5KcvUTi}TEs1}_r=^G8(_Xcg31cuvzB z4g=`&7iT`nCWCq`$f-Rl%#~%P>UMY$!Q;Ta9MIJlo`4i;28H?C4;Tc|q|qO*4gB3v zjqy%zDA2MZDfa)3b#ubT^S4o;q4i#sk^X z5@;yo12*f0V%V}620prMSO-gNBhOK5K4#pDz+-U_0ka$>WLL3Sw@ zGA1#`E1G^FfP<*W&1(a`q?;_n7(iT%TLg_$L3CK*Z09GMxy%!lD70O~53*wuuI2snJj}8-xV!vG>VOxxDiZi_Xgh^9GR$mFcvz7}e-R1(KBzb{Vs zYW257*VLb!CLt%NDA@2O2p%zsF|*<~R)>|EBzC9gmDxsS^3wAOA3Wcf&S|eb044;2 zKwl4y@2Q$I(Oej`-1~}o6!0RCwE+3O;~K*j#yFDvD># z(oEsmEu0c>OWKdUDcfQJIcA=s+QQS`C-Hc>DbIo@kq*4QoK9Xxf>lFn+3MvY`^8-?Tu)w+t%#X1FAQw)MWq`_KiBvjQzvLvo9duqV9R)t z>|!Cv5Hlm93v)6XqoPK?)pd{6Zu&ZP+Sw^24q|VP#S}1--um9r_<66Y0Z2YTrnwYW zBC~+auyIG-QIKE$mgrb78T$zIaoex`?-T=7t<5*9(%3w?LC8+~gm4wsGhD&G)xcmK zThhMz{Bpuyz`KRk2`PrOt+@mPYcmV5lK;=q#=()uSamhG40aJ|(8$}nGd5XH?shdP z4}$02zv6Yem9Rly5y0NUQutiYN9)|Xq4_L9TNJ4`*vnpb-f}~KrujsVpI2|UjlTps ztyodNH)S#hej2#IV!>*;;(~Sz9J&K|Iaj&<>riliew`jThd3)9+-GcU$s93QR-us{ zuVFllgF*g8g5QC<6~P(Z`5kJi%)er9Oay&LHiL2xc@ymWE`oBci@j6wxKC;bvZPVS zpU7+7?mwO_iKca@QOLd~r!2cLhD)}}v|sli*2a0u6>k@hI;hCsV+i z!kDaOil#lHH&a^glcxbbIt8{8CltSX29 zA?lcmB4AVt__lc#t`-8P9h#ue7ly>WL8O=tf)v{K?|wtyX%!||j$F^{*mgx)q-I@g_@-j{1b3~kQjolDg_4H>su zy30F<{J6Kz_T#!<^J4!&G6jAzY!nI%tv=Re&M)Y0%#$k=xvyIqO~54__6B}sp@JhP z!K9VE&vK})Z3C0TF;$7r1+C!h-6IoQe5Bio;CyENebndS&4}JzSLh>usK40|j5|=~ zKhvivg+C9>-glXq8_uWJ$ExTpb3N#<90Lll!RYCp)K}$9i|FtvQ@|TbbJBzSrUL1Yu0Id|Hb+tL&g zI=wzk0mFUsA$NKMT2s=D@E;mMX4KUAh>zB^LtVY`Bd!2MNH71w=6dTYH zBfV;b6-4Kwq|I_~z)TRZK$P!)Yi%3YQI~eaP_|}wT5m@QoCr<0vxv{+|IvU1k z`aCSUY3}t>J5(y3E;M?Nn#*z;zJQa2``LRY^J@<}RP+mG?dOgC-#LVt8mPpG-x*J9 z+j>t-+JSF50(a;1d~5604#ZQwIi4xwrCz>+QeS4*tiDoj&M*r1akzaMlu$cBjTXrm zN6pKTIWx}a+bSqo$jr&kUcr(}Po3^#tGDXrG+@Hj+$Z{xtSxtKtg2(Ab$It5xhe1q z%kU7D9Yq(759A%X%*PYr6WX?P{ar5Gqy)R_Nn1z6L!HtAGbTbN7NaVqqgcC*%94`L zd(*TkGkmHBO%?p0?NzVo@Laz^!>ES`vM4D1-LeNmx9fwU?|WU5!T>i!-vSBHP+h=K z+=+T7r!Akh!3QN``_ zB02?1LWyFH9yPw74->YXpJlN8Si{QqJLDw+)d4qrudY~G(eYG1LZW!;uEMgo)?DnFK;rDOS!emk>r;Dst8A{)kqo`yNsIlE2_kks-?nNb*lAG1fOh!Tfgb}h zCc*WGi@3*8&3Enl%CN=*&(;FZTfI3=QWJj@LetAEYO_BJofhBW!uJJY6WS2nx=pgV z4L~y9oNUiG!ZB%=n(X$Y9<))5A~A08G7nG=WC*1I_daBXlaM`fWED1-cOlX$BLnsW z7zx$CEXWe764G#ke}q!ZaS&c@y&SJdV7EUvVyni((A_XqlR+mRhxPd8Y{nfs<-!3m zb?+btl1_VGD9!xgT_vLc%8@Gv-Kk$s48P1K5sd-{)vj7pN3OSG-l~CT7balS5~GYH zak1#&eyPPGU6tSN{f8x)jIfxBR`~;K9hO5Ayv1eY{dx6VS-H|1xZL}51!Pp^!ojTr zr|LrLy6KoM{BQc|Ge$*@t`D3df}0to8-q$Su(OgE_>M_Q^2$Hh`})*K2JLlxr;WZ2 zSZrb>1r%Cf9jHT1PiM*7g+Ayo;qxY2eMU+UMKqUjyV+_Xg#ai79+%5y%Q3><%)ayl z)??er4fMM8PIHqs!^@#N7&iRm?`h9$N@oP#NG>6g&E|!XD7`k;OlItyC_2F7%N^Z$gle4HpkI*?%kV8mJJjV`?8Ucco62%Ny|)8*JotHSF8!!v>0{ecaw4rwoknNyyRw>&UkQ0r-g;k} z;M#XWfC8ZBUw#iMk=MQ^ax?S~-0#M`5d40YH|+u+*Rl6R6GbxhRwutU9!etHJWj+O zyWYK4f$Q%QUQx(?6Yj`A_d+>Eucbx*19a{v_x$*TWkDc@;-c>3EzT72^1#^0^x?8{ z^=|QtSv~K@!t)tEuMI~EUA@Vm{sEG1!0WH&utDz7%Z;9hf=v3)uM=NKlxmZO)1f2P zX7O$S0JQG^&H^~Xx`W|9n1CCm#);?ArBaJ>u{pD5u8ADvs@xN0*o*f3&#^bo{#l@Y zwQmxGAQ%Y<6>=`v8Q(KKd^W z>1AyIh^07Mh4!z%Ti9soM{hG%=;h0*x&$98^5&kT)@>6fCXc~I>&BXC`m3+(ONK%3 zIYi!0Vu<)797+2l9F;nLK+jIRc#eej$VB<2e*b1hU>5H7MwE1P!!6%8)n4xp)4O~2 zsUMqb&0YC?BL~N*v3&*bEf5G?#6g_16x%GzW=cY#iDy^8@W0DFZ-pAGqa^QfkCOs@ zk(i4)-U0(YwZpC$yGA!)Du%GQ6k#MGEYq4r!=RFQpK;MhNqCc-^2iA}gX~(r<-YxL z9W$TH%!J}o?Zc|KXfO#erpTm;a3G7KFdL5B$+oQ}UznfF&iHP&%gsccC8w$h{D_<; z_Pn3HkMQw+9O4AplK62e47W!DQT^i$`d$ld6kFmeY$bI2K6XIA%sqRfZF3iA2x2zD zQpRauVO$1u;O)BjQxVu}Q{UmqL)67#7OO)4fjRw%*&}EW00Qe3o+&|%QG|@;97&0Q zmkXqdno3|BFZ=V`dd|x%yJb#m!AIP6Hzo9Mt7;t2JlGZx*@z!9Tr;#-I z9RoJwQSJP%JoIj}us)>omFQ?y7Am^smFW2N_s(0%9Z7?Jh$~9J(a*YkWYkGsM`PTX zTbPzjs3N0lz(Bppexj9d=Tu(*KKilsvNMe2yOJ;s!k>H!m^ul1n=xMfW@OH?y&Cj} z^6JxK=%Uv-PH8t1;}3CK;$%eT)~{r_6Y2}@1XY{o7hf9e&q&IY2&XH`^w!??s8YU` z#o3!U`bM$Vxc{p3GJkt94oDf7@zx-dRc;NcS(ED16+zOEzFDim{PQ~`ZrO-RGii2! z#a}}((E*v=zAa6st~=@+FT%1~wybd9b6f-ftK{yO7-40XHsgc1pjb_ty6n6x{};pG z%H-cz;PXIamVf&I>DBV{5>V^HR@bSCvr1b>e&9Rk*1op;QRi~I!g(1Pw@J7_cn`ws zHN3TYQOXR8u?D&8bIZdBFTjH%C+467Z>21cl2rHYcS>jWWFgWi`~w#JDwpbo3$x% zJgj+Qjs#!M;3UMKV#(L)?*mrbeS_P6*-e+ivH9cQ@lxK;n0rF1rmf4IFRkyp-XMFX zbq7ulzfGHtUF8F737N`1;o){%X^BG_FLelHi1d1Nn&kofSka zb>s#4JuewC50UQ510NA~nsHA=`}HaJnsH@dfVUG*ZIb6$vkxXB1)5W57k_3a6RwsH4ijG{) z1o~>>0!N=yah*OE#~C1=-DqPS-zoQd1K_k31cPs$x~BFBKS$jPYWzrcWRjFDe^=g; zk&}_7j2|_u+8wxfudQ`t@>)|7=WU*E&JV918Pp$9?LRT`AV z9Y{o}Oz{~ZEQ_j<zO|i2#OgjJ0Mj`z`Su|2*vrB(50z;%G=Eomum>(teGwnA zP|xK1K_pa=VZAS1e?7nsPkqM&x8e1~Y|NesY54I~Dv@NWZ5P?i?J;SpG>Ym@ zqKV$2wIugmhDwg1Dm~Tb-z59w;wc6@MypJ_&lrt~(||JACaZILLmQIn3PDvk#BV1v zfOXF=`I3lVvNV_WF94k=1@O_jNF9)*rv&lp3-O+C%etCMrPrV92Xg}QDT@)A?!6S{tJ?7{=MpFQ8=*-rjM zj{^t5ji~r!2*qc{q{j=)7vFiMKbi~52vm1ta zr274PEE(dTg*Ruui`*B-5tsY>8@sK|DSgKt=2$-*6)$#DszQOu zeWVC8nm{H6*pT59sKTlmlHNYQArO*mnyy#iTtVE1+MrMP9Ei~z!z&>`42pDwV260B?ULKwae+EW|nehyvUV^B5UqQ{Elu(7pJO}ad?p}f< zr)M@Nv6k?#P(PXrWJ+g{^X!;L?oTjz-nJ8luIj{88RnK>&va^-ShbmX4`hti-r+N% zAF=f!_|amw=nO+`=M$vCW|H>SB_YRN=v#rQlQUOCd5T!-(KW1#YcQ@`lgfL8i>o&> zsBF|Xsm;6}dslPgeI4<={x}_JrP%^zU)e}vBpX`*vpU2{h6$kGaB(rKElx<2?%kdLig-2$zBz?GX9*LSG9J>ZJAmA8!);UG4;EtbpSwfGpI4DsnZ_F+$v6B`f5HnjD~$xgU&mr8OA&D zN{g}2R6!reWxSk?O(ggm?3cMb_|RNx20Ne%fAmkD>otYYk|?v(jPs#7l~#Cs#R_Kc z@xlJQ3mfP$epw^yXN;P3& z1#doRRmo4_HzF}#SnA^Z2=o!Xh5Rxzs@mc&D^ zi^O%emyI<8@xlhGO84Mc)UzUWyvLVeGw)-=dtJRC0S91QiZZuCpT;R7=P5#y_%&xm zoiAJgosj{RF%RbKXl6@@U?ldBJJO0e+l;gd>&Yzi&q5$#!~hzv9X9%s1WkvV%WU5B zc4E^ts`mBUh*mv4;^)=*x0j31pr=rfdc4&O~>Tw4&Z%@UEfxh}j+!pH(DPSigEv^G%RhZhG?mhmSw3k0S>5 z?FUc{JvWJdNgCe!8E5T}Yi8}IoxKOuzD%E_HxMqmY17jMN)}|Z0Dcs=RE4tROB7XY z?a=v?((dk5F(XQ}ilP!`B}YeLLBZ|{bxkeiRjQv$PnDG}ABsmQGF28-B*jbLN2V`z z`o500{Le_>ys=TBI=hH0M?f(ZTA8997er;Qm^TtG9rJ!=)#*6Dr@Ptd*Tc^GPWuIG zQN9HxAB@M_M~78Kc(pA}qAr3cD{=j;l?KtrMFxufjnJmRk&%2j70n0nBM2WLjZ&r$ ze&Pn(X%y^Ea&PT!rZ@ZV+DFwN!lm9GEe~YT7>a|ZNmO2M7f-5K;i@HiVEwa`UL($y z7*Tf^?7M9NCVnyNi@+m$ou6}HG8HP1Q~jG$z%D7edJ(DbdmJePklw#ako zQ^~hytf)RjdgzKmv7rAClLV~W&lhx-Ny?6oKdBMKvmeY|Ywi+H+iph%5O}j|(0xmJ zZ&CLnc(Zf&%tPOxpX2uRw*?02fhigZlfn)dO64{G?|5h>3d!dUO3NfVv}d6kKZ6d2<=x?x?my>HLRNZbiPI3k6gbA z0=;PRzK!s&iHq;0;av9uP(OblQ|jgDbX$n?w%pd$?K$&~->CI|e_7VfVl&|Y_7Z35(4YZEJ|>jlX9sdf&()L!ifO*@BM%@o zft<07f^Yw8Qc2nHo3iic4v&bZb}7-P@HS+E8}X;?evhz_{^i+c#Z#bx0Zae8uwu|O zr+;x>V5yXfexO?v>h&BFp|BKE*Y_I;5c4yjPud2ea1ZL;@c{y`cjKnJ5l^tF6VTK7 zO^hbb>}<;4e2zCeViD5GI1n| Scene; +// set 1: constant +[[vk::binding(0, 1)]] SamplerState LinearSampler; +[[vk::binding(1, 1)]] Texture2DArray ShadowTexture; +[[vk::binding(2, 1)]] Texture2D TerrainTexture; + +float2 yf(float2 v, float scale) +{ + return float2(v.x, 1.0 - v.y) * scale; +} + [shader("vertex")] VSOutput VSMain(VSInput input) { VSOutput output = (VSOutput)0; float4 Position = float4(input.Position.xyz + input.BlockPosition, 1.0); output.Position = mul(Scene.Projection, mul(Scene.View, Position)); + + float2 textureOffset = float2(input.TextureID % 8, input.TextureID / 8) * 16; + output.Texture = float4(yf(input.Texture.xy, 16), textureOffset); return output; } [shader("pixel")] float4 PSMain(VSOutput input) : SV_TARGET { - return float4(1, 0, 0, 1); + float2 texture = input.Texture.xy + input.Texture.zw; + float4 color = TerrainTexture.Load(int3(texture, 0)).xyzw; + + return float4(color.xyz, 1); } diff --git a/src/main.cpp b/src/main.cpp index a93791f..a9ea530 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -609,7 +609,9 @@ int main() physicalDeviceProperties, physicalDeviceMemoryProperties, surfaceFormat.format, - depthFormat); + depthFormat, + textureSamplers[0], + shadowDepthImageViewDepth); minecraft_state.init(); ////////////////////////////////////////////////////////////////////// diff --git a/src/minecraft/vulkan.cpp b/src/minecraft/vulkan.cpp index 90d5b43..cc97b0b 100644 --- a/src/minecraft/vulkan.cpp +++ b/src/minecraft/vulkan.cpp @@ -29,7 +29,9 @@ namespace minecraft::vulkan { VkPhysicalDeviceProperties physicalDeviceProperties, VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties, VkFormat colorFormat, - VkFormat depthFormat) + VkFormat depthFormat, + VkSampler linearSampler, + VkImageView shadowDepthImageView) { this->instance = instance; this->device = device; @@ -41,12 +43,16 @@ namespace minecraft::vulkan { this->colorFormat = colorFormat; this->depthFormat = depthFormat; + + this->linearSampler = linearSampler; + this->shadowDepthImageView = shadowDepthImageView; } void vulkan::init() { load_vertex_index_buffer("data/minecraft/per_vertex.vtx", "data/minecraft/configuration.idx"); load_shader(); + load_image("data/minecraft/terrain2.dds", terrainImage); create_uniform_buffers(); create_descriptor_sets(); write_descriptor_sets(); @@ -142,7 +148,7 @@ namespace minecraft::vulkan { { VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .setLayoutCount = 1, + .setLayoutCount = 2, .pSetLayouts = descriptorSetLayouts, //.pushConstantRangeCount = 0, //.pPushConstantRanges = nullptr @@ -388,6 +394,49 @@ namespace minecraft::vulkan { assert(offsetsIndex == uniformBufferDescriptorCount); } + ////////////////////////////////////////////////////////////////////// + // images + ////////////////////////////////////////////////////////////////////// + + void vulkan::load_image(char const * filename, + Image & image) + { + VkCommandBuffer commandBuffer{}; + VkCommandBufferAllocateInfo commandBufferAllocateInfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = commandPool, + .commandBufferCount = 1 + }; + VK_CHECK(vkAllocateCommandBuffers(device, &commandBufferAllocateInfo, &commandBuffer)); + + VkFenceCreateInfo fenceCreateInfo{ + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO + }; + VkFence fence{}; + VK_CHECK(vkCreateFence(device, &fenceCreateInfo, nullptr, &fence)); + + // load + + createImageFromFilenameDDS(device, + queue, + commandBuffer, + fence, + physicalDeviceProperties.limits.nonCoherentAtomSize, + physicalDeviceMemoryProperties, + filename, + &image.image, + &image.memory, + &image.imageView); + + // cleanup + + vkDestroyFence(device, fence, nullptr); + vkFreeCommandBuffers(device, + commandPool, + 1, + &commandBuffer); + } + ////////////////////////////////////////////////////////////////////// // descriptor sets ////////////////////////////////////////////////////////////////////// @@ -397,16 +446,24 @@ namespace minecraft::vulkan { // // pool // - constexpr int descriptorPoolSizesCount = 1; + constexpr int descriptorPoolSizesCount = 3; VkDescriptorPoolSize descriptorPoolSizes[descriptorPoolSizesCount]{ { .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = (maxFrames * 1), }, + { // linear sampler + .type = VK_DESCRIPTOR_TYPE_SAMPLER, + .descriptorCount = 1, + }, + { + .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .descriptorCount = 1 + 1, // +1 for shadow sampler + } }; VkDescriptorPoolCreateInfo descriptorPoolCreateInfo{ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .maxSets = maxFrames, + .maxSets = maxFrames + 1, .poolSizeCount = descriptorPoolSizesCount, .pPoolSizes = descriptorPoolSizes }; @@ -446,6 +503,48 @@ namespace minecraft::vulkan { }; VK_CHECK(vkAllocateDescriptorSets(device, &descriptorSetAllocateInfo, descriptorSets0)); } + + // + // uniform buffer descriptor set layout/allocation (set 1, constant) + // + { + constexpr int bindingCount = 3; + VkDescriptorSetLayoutBinding descriptorSetLayoutBindings[bindingCount]{ + { + .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT + }, + { // shadow sampled image + .binding = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT + }, + { // terrain sampled image + .binding = 2, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT + } + }; + + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .bindingCount = bindingCount, + .pBindings = descriptorSetLayoutBindings + }; + VK_CHECK(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCreateInfo, nullptr, &descriptorSetLayouts[1])); + + VkDescriptorSetAllocateInfo descriptorSetAllocateInfo{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .descriptorPool = descriptorPool, + .descriptorSetCount = 1, + .pSetLayouts = &descriptorSetLayouts[1] + }; + VK_CHECK(vkAllocateDescriptorSets(device, &descriptorSetAllocateInfo, &descriptorSet1)); + } } ////////////////////////////////////////////////////////////////////// @@ -459,6 +558,7 @@ namespace minecraft::vulkan { VkDescriptorBufferInfo sceneDescriptorBufferInfos[maxFrames]; + // set0 bindings for (uint32_t i = 0; i < maxFrames; i++) { sceneDescriptorBufferInfos[i] = { .buffer = shaderDataDevice.frame[i].sceneBuffer, @@ -475,6 +575,43 @@ namespace minecraft::vulkan { }; } + // set1 bindings + VkDescriptorImageInfo samplerDescriptorImageInfo = { + .sampler = linearSampler, + }; + writeDescriptorSets[writeIndex++] = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = descriptorSet1, + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .pImageInfo = &samplerDescriptorImageInfo + }; + VkDescriptorImageInfo shadowDepthDescriptorImageInfo = { + .imageView = shadowDepthImageView, + .imageLayout = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL + }; + writeDescriptorSets[writeIndex++] = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = descriptorSet1, + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .pImageInfo = &shadowDepthDescriptorImageInfo + }; + VkDescriptorImageInfo terrainDescriptorImageInfo = { + .imageView = terrainImage.imageView, + .imageLayout = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL + }; + writeDescriptorSets[writeIndex++] = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = descriptorSet1, + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .pImageInfo = &terrainDescriptorImageInfo + }; + assert(writeIndex == bindingCount); vkUpdateDescriptorSets(device, writeIndex, writeDescriptorSets, 0, nullptr); } @@ -529,11 +666,12 @@ namespace minecraft::vulkan { { VkDescriptorSet descriptorSets[2] = { descriptorSets0[frameIndex], + descriptorSet1, }; vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, - 0, 1, descriptorSets, + 0, 2, descriptorSets, 0, nullptr); vkCmdBindIndexBuffer(commandBuffer, vertexIndex.buffer, vertexIndex.indexOffset, VK_INDEX_TYPE_UINT16);