From cdf06bfa26ab2b716e5a8786b10124f795cd35d1 Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Sun, 15 Jun 2025 23:30:33 +1000 Subject: [PATCH] shaders: Implement GLSL shaders for lessons 2-9 --- data/shaders/lesson2.frg.spv | Bin 0 -> 332 bytes data/shaders/lesson2.vtx.spv | Bin 0 -> 1108 bytes data/shaders/lesson3.frg.spv | Bin 0 -> 372 bytes data/shaders/lesson3.vtx.spv | Bin 0 -> 1256 bytes data/shaders/lesson6.frg.spv | Bin 0 -> 560 bytes data/shaders/lesson6.vtx.spv | Bin 0 -> 1296 bytes data/shaders/lesson7.frg.spv | Bin 0 -> 664 bytes data/shaders/lesson7.vtx.spv | Bin 0 -> 3308 bytes data/shaders/lesson8.frg.spv | Bin 0 -> 664 bytes data/shaders/lesson8.vtx.spv | Bin 0 -> 1472 bytes data/shaders/lesson9.frg.spv | Bin 0 -> 664 bytes data/shaders/lesson9.vtx.spv | Bin 0 -> 2320 bytes scripts/compile_shaders.py | 2 +- src/shaders/lesson2.glsl | 31 ++++++++++++++++++ src/shaders/lesson3.glsl | 37 +++++++++++++++++++++ src/shaders/lesson6.glsl | 39 ++++++++++++++++++++++ src/shaders/lesson7.glsl | 62 +++++++++++++++++++++++++++++++++++ src/shaders/lesson8.glsl | 43 ++++++++++++++++++++++++ src/shaders/lesson9.glsl | 56 +++++++++++++++++++++++++++++++ 19 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 data/shaders/lesson2.frg.spv create mode 100644 data/shaders/lesson2.vtx.spv create mode 100644 data/shaders/lesson3.frg.spv create mode 100644 data/shaders/lesson3.vtx.spv create mode 100644 data/shaders/lesson6.frg.spv create mode 100644 data/shaders/lesson6.vtx.spv create mode 100644 data/shaders/lesson7.frg.spv create mode 100644 data/shaders/lesson7.vtx.spv create mode 100644 data/shaders/lesson8.frg.spv create mode 100644 data/shaders/lesson8.vtx.spv create mode 100644 data/shaders/lesson9.frg.spv create mode 100644 data/shaders/lesson9.vtx.spv create mode 100644 src/shaders/lesson2.glsl create mode 100644 src/shaders/lesson3.glsl create mode 100644 src/shaders/lesson6.glsl create mode 100644 src/shaders/lesson7.glsl create mode 100644 src/shaders/lesson8.glsl create mode 100644 src/shaders/lesson9.glsl diff --git a/data/shaders/lesson2.frg.spv b/data/shaders/lesson2.frg.spv new file mode 100644 index 0000000000000000000000000000000000000000..da5fbedabce9679979867b1ae75bd1ace1f12d00 GIT binary patch literal 332 zcmYk2Jqp555QNvn#Aw7H1nneZsRRoZLC`WyIu9VCji3h919&!1Wh3}aOpynZ-I+H# z`-tm|Yi1P-EwHBjPuCn2L-X^Rq`NeJJWug_F_WWZZf=yPji*W#u7~qY7j@9VBaLu6 zmqfES10HJGD=vSwKW3NgZb`w1XgWP6H9N{vEbsgDK3W6@__ae^xe?!hsuxOM7hF4} nP2lo2fZ1z1#U)<|q?NJcwc4#*9nF7GJn9CfOwE1yODpgLY4H(1 literal 0 HcmV?d00001 diff --git a/data/shaders/lesson2.vtx.spv b/data/shaders/lesson2.vtx.spv new file mode 100644 index 0000000000000000000000000000000000000000..dde73db62fe84e08d42b5c35f0e11cd3bfdaf5fb GIT binary patch literal 1108 zcmYk3T~8BH5QYyeTM!gP7@zrLJf&g0-BTy5-~(?8=@O?Ol_NXQR9_=!N26M z@`l9c*^k26%+Aa^@0oeeIn73QA%wZG92P@2lxrn-r!rPT zvmnY@4Qyx4W8W^~(D)9vgEjdY_`eVn7&kcyy_czd8T8Mx$;WJxXFo|nOWfGnXd3f4 z8iFnqd}kJT9OmcoS0=BnIg8qxK^(u0)BIxiDVx<)Z0&L|nAH;Wsnun?hW~KMMKC&-5i=@~ydijl0-QtZRYQqm%kOMRuL=c{{I(^7c1@%8y%R=IB_=A4y+SN3&|`6}kx zCif2PtFAV?ydN=p-@|(rF?*YPFJjj3SFwE0xP@1omUJ_VHvo#?dg(8SykNw30G$+8)jb6-A_I$p^0msyt0K zd#K45`|k(SlWlg{F}paO{(Fv-T0oxk&2%CAn8l;#DaKb`ie+X^fqx~Hx!{+&=ZZJ;; literal 0 HcmV?d00001 diff --git a/data/shaders/lesson3.vtx.spv b/data/shaders/lesson3.vtx.spv new file mode 100644 index 0000000000000000000000000000000000000000..5dddcf13616dc03148222cf50201813888fadad1 GIT binary patch literal 1256 zcmZ9K%We}v5Jelm5(wl$$O8z*j(IGQA{Ky<5Fj3sSwtczf~^&W5t_)@mhA+@ieKQD z_$oF?oYONsAbM0&b#GO7-L9E>t+x=uxv&%#!`)DzkJJ{R*dCO2WNTqWilO~6gAtDtR{~$$On@oG4#tj%e%zh zS*-3pJ-o9z->~1ulkvL;H=kD3+FV1dM`kQdpn{)9~#J>M>y_hNV zdcW>}co$sgZ^XN#`>oT>eqDO2#dwpbh3{ZnD6^kfjUC>Lcx&aKl-U17&inw?5V)yKTSMc_eYZE!+q`{nKpEbNa&8tJ~zaVFyb$kc&T>FTxV6JWO z2HtbMSDRhVSI)Dy@Wm{Ov&GI;&ivIfw%!@-;MJUFaD&*s@@f;Oe@HE9z9D>n{)lhu zx$1Cv#xEGZ`%_poUc{W?GqTQF{DKN~T*K7n-K)~L^ao5JktVn?$4eFrtVciT1%lMG$S%q_eOLlB5vSg>@tTK7W;s;5nNO>Vw&N z_r5!KW;UsvH6k{m70uX>)#*hICgAF29#8Hkqqkx{y0|=7(T=1Ps_8@{Hp#}zsjYXF2a_?1GomV)0Qd^96S~J>TVKS(eWu##P-3 zyhm)^utdN36l`zb^;qlsu=2xlx|QaDdmU~-9HMu2vGWf2Hpy-;e^X&+mpfvMZL)gS z{CC#)7-fqWb^7g8Dmnec?%=V1hpeA-s_&BZl2Jw_@?{IK8xog(r@tp^&lS@h%BP3=uNcFuZI22fh08eoz^BG)}Qny+4sYu7#&%Yl;`vR zux41H?sLDlmyJGUBgzS3SmFBSig7;4ivj3-Sue*D&j*wJ{6}V8%*lz|n|?lgn~x_4 zgTri=b3${+{r)VMFo!cK`Wx7fuitZ~S^DC~y^}oqHXIdSs+y~Uh%>p1yf=&#LzhiB zd&>gE*u5FcyGsvemghUp>nqkM5wliI8!^v_IY-3w#oWJl%fGt2G2@?rS#M6^afD0g zS*&9Mk+1W$%jh)TCa(B5%9-PQt8}wpo8EHKU&m`=Q*?v->}PB)C0@WYX@4HCsea^hb{}MJul?T&!8Q(j$h@I7Xu@;^?k9U|;?Ryz32lMhW_HBsS z=L$AOz1Kd*YpAkGypHu=d9^s@zQw$I6YKn9-firj<4&$kee0d^23F2-C-MD=d*0Z$ z7r9v5Mnm}d(tdaGJS(3ke0%%IOA-GA;=6bb>Ygv4?)U{+zlHHDD&%z?m8-K_FUKuZ z+*nR2DxVLWk;^ukqDsU%_$fMf2D>%Iz#sFgyqNgjvTK}8 zZ%(ld_ zg)O2^91weGt#Jvv3eFK<986&UpAma59Z%Aibe`4qSpDGyuZZP%G5c67=QH*RpLeX} zCTTjKMhtVGQ+StHAF=(4_30C?0-v$BH?f|@`8KS4KkI(2>9DWD^@uKdXA?V5kAIEq z3(4Q+*xBT)Z<9+zQ5V~z+%d1POV&^Pe--!yrv?Re`ZaTrocD>H(Pe-8Wc{2&eVeS8 zyn3-S%U$!P>YT-8&)+Z!`3}~ecL@6xduNOAKCzyMgno~lQr{ue$baTsm%TpL?zzSH Kk^7;G8{!ui*&>ht literal 0 HcmV?d00001 diff --git a/data/shaders/lesson7.vtx.spv b/data/shaders/lesson7.vtx.spv new file mode 100644 index 0000000000000000000000000000000000000000..d7d2fd4dd9e2d4f931e3651b6961c2b81a882184 GIT binary patch literal 3308 zcmZ9NT~i!Y5QZl#kcb$JF(GQiCHRfvR}#@kfCK>*g^0lz6IZf3kimt;Wr-=Tw7j>< zDu0pJdhK8F#wwp@b{a-bs&l&EeovqG^f^0Jdd7|?$+6_oe9qsr!jHy(wj0)CY78hX9$*~7u#OXcJ$9+qu4F%Hg*?lVio@NF#o~AK30_1^npA= zZnw3Ub+T4orw_i>Z(dtQNq@0ZlI+*ETaC22mZd*{9?x;L?ALbNt*x|PUjG=l!}{vV zYKJ?hVFYZa)!tr5pd58)wLrSqI9M~=yx&<%>$tFblh>G+#F*7)?AWiZZ{N$(oig6l z*2p$C_V-da!M7J^J~*-Gov;W)EtAaozH{kb=WVe{@&Q;QYv&qf&9hzF?&R@2aqOF2>=O%Z(neEPHd!6;2dU}xaWtrP=HV<;1+xO#GDBgrM z7CB@0^?4TKzJr)YojiU78zXkaIyIKp86RCI=DHbdf&F|>qnIP&3;6PkePg~Uhp}8^ z^{U->($(H~@MaEmb+Onp^v4=`)x1t`{!Xkd*L{39WgXsiS%>#*9DIM1hjAspv(Ody z8ojlzai?O|2+TENl@g{e=I{G7rJb~k+hVqsm^saTzGJqgdG|4H7T9Ha z?|FPz4tf88_)U=OJM?c-X!KtF&6MNuQf$vBOR;>v*TFYGTZ+xkABp{D%b!Js@A4Gp zTlT$9p~*M;1SW3m8#{~n9&fP5^Pej)rUUG$0<(X?d%D2v!3w*&?=zU|<(nVIext6r z^O$?fxk|U}jaX=X4*#guDwud^y?{T8g@)(x#TE@#Gp9M^xQ}P_zRi0^e`9Z9{to@^c_!=fr#Z)?-a7>* z?udH9zX)dUf`18LOmhVP7xq-&Wz3rL)a08Ji=MuRFBb9pMf`j59QkQFj{OeSR%;&ESj4x2|t}1`GZ*eES#ib$mIYYYtzI_#mBhZ|}yv zy&vyWjRH9aL(dllChj<@=O&mOzr*g~w?NE#en-E?Ze!+d6>;?T z8)7vX+s7Ja&m#XVzV+hl>-b{w;*9t3tz#~Ji*(nG4%(Q7MT5wZ^;I}>*bsG zTcY;6%;xN!-?(ke??&`)0Dq^z)o(9bn7^6$eedGS5x34A=I=4T?L(OR7|Z(?rIXly D+@9qD literal 0 HcmV?d00001 diff --git a/data/shaders/lesson8.frg.spv b/data/shaders/lesson8.frg.spv new file mode 100644 index 0000000000000000000000000000000000000000..711f8d655a3fb59a4e30214009194deafca4a355 GIT binary patch literal 664 zcmYk2!A=4}5JVer5k)~nL1SV-@5F-|6Qfry+&p+B1~{0gn;;N>z#sFgyqNgjvTK}8 zZ%(ld_ zg)O2^91weGt#Jvv3eFK<986&UpAma59Z%Aibe`4qSpDGyuZZP%G5c67=QH*RpLeX} zCTTjKMhtVGQ+StHAF=(4_30C?0-v$BH?f|@`8KS4KkI(2>9DWD^@uKdXA?V5kAIEq z3(4Q+*xBT)Z<9+zQ5V~z+%d1POV&^Pe--!yrv?Re`ZaTrocD>H(Pe-8Wc{2&eVeS8 zyn3-S%U$!P>YT-8&)+Z!`3}~ecL@6xduNOAKCzyMgno~lQr{ue$baTsm%TpL?zzSH Kk^7;G8{!ui*&>ht literal 0 HcmV?d00001 diff --git a/data/shaders/lesson8.vtx.spv b/data/shaders/lesson8.vtx.spv new file mode 100644 index 0000000000000000000000000000000000000000..1b7d49939e8538bc257c6ee9b37d640dd216bb34 GIT binary patch literal 1472 zcmZ9K$!=3Y5Jfw-pA!fqgpdIU#*Uc-77IW~h#4taL`qNuTPt!b^pNqhJb_s83;Ysa z#RiFUp510>t6Y6=-Kwsxe#Jt4K7_fj7#2b!Ox8*$zy!E*?sxZ(_8WuYN#nu8`zn?~ zF&C;?4yW^diT_W>X;*LxTf~;J3U(bU@+;tfkd%ZHzd!l}#+-3;*#6SWvi^yhB(IVF z!hoT z&Mf9VoRiCYJFm3ai${iCrsaI1M(ljW_92e5p5Vz`>|>9ZGjb)^9{&;Z@ZsElTpjF+ zI_t^3z&yvf)i77Y+w9}H&TMjSGMk^hx~yqjt(-n`=Eymp$hnvETk$OC5@)c=DdyD3 zQ0IP~T^V1+Hqd)Nv9T(60k2m6$rL+RIpcoG_7vmd*r)Z*f~{vi>X-25%3DwDJIHN< zovktT75<%jOE*JZ_%HE~EinkB%=A7zy&rxsu8h#Fwx1QLyl(U}N zn^*|noq>+-|kab-{uVFyF4T6`-xwoa2^|&GjvYsz27D#uip0&tFPi~ zn0oJ{-aBk#@?v|wf!Xg{a_sfil*7%q+f&XvMcth#=Y0<8++KDt^VJ*o-ruQf>@Mcn WYV6PN=^p0n?a%(j>V7f3$JlS7R$80@ literal 0 HcmV?d00001 diff --git a/data/shaders/lesson9.frg.spv b/data/shaders/lesson9.frg.spv new file mode 100644 index 0000000000000000000000000000000000000000..711f8d655a3fb59a4e30214009194deafca4a355 GIT binary patch literal 664 zcmYk2!A=4}5JVer5k)~nL1SV-@5F-|6Qfry+&p+B1~{0gn;;N>z#sFgyqNgjvTK}8 zZ%(ld_ zg)O2^91weGt#Jvv3eFK<986&UpAma59Z%Aibe`4qSpDGyuZZP%G5c67=QH*RpLeX} zCTTjKMhtVGQ+StHAF=(4_30C?0-v$BH?f|@`8KS4KkI(2>9DWD^@uKdXA?V5kAIEq z3(4Q+*xBT)Z<9+zQ5V~z+%d1POV&^Pe--!yrv?Re`ZaTrocD>H(Pe-8Wc{2&eVeS8 zyn3-S%U$!P>YT-8&)+Z!`3}~ecL@6xduNOAKCzyMgno~lQr{ue$baTsm%TpL?zzSH Kk^7;G8{!ui*&>ht literal 0 HcmV?d00001 diff --git a/data/shaders/lesson9.vtx.spv b/data/shaders/lesson9.vtx.spv new file mode 100644 index 0000000000000000000000000000000000000000..2a2955d83e3f23774ddc555259b531b46f6a845e GIT binary patch literal 2320 zcmZ9MYflqV5QY!5Tkr~qTvVuAP*7340iuYMO9CV$Vu*fins#H>lrCutA%5~N=uh%j z`NhQdIlEJehYV-to%@;D=K5y`oa=Mf+@RZW=^1hTLY%OIzjqIg4i?*;`r^{^3oLHB zoHxW~NLHM@=(rj;;cts(L=QysqUWMDQBHsTx_`?tkVmgiAmoa4`^|Qz+N?!ll|9Aa zkCS@T=)uTcOBzW_H@;L6_xOTc7xsTVFivkgu*>lZ>hZ#Nr`oCFQ_vqc$8xpB2f~MY zFtZQbfPagxjf$1A->gUH_){NmbXMs^=d~nh)l-Z&i!Wh$|AuFkv|DmLlZ|2?My)SV zOYRbVZQvYqNjvVuNmKZMx2Hdk$IZ@B{5^Z$RL4xD+it`sJ8|~>=EtPboi-X>U7$HK zQw}^!@pA%c6-UWSCTor2Rjm1PONmdrwy@r1=8)w z#$+w6fAd~!Rv5=Ha)FgayNY!~cR_UM<(!`-{gKD!I_c%0D_hK6^*JmZdSbzsL>!Zu zCkL5tfSp{(WOPLl2R(B}rbcAGlM6ZLXU1IU#parRX%`s2VBBVh4_Mk)>I)CX_eLMg zA&s5)yhLS5W1!>ozOP~S7UTjWFIZVb56rS8;+Q-m9y?^_Yi}^B3aFu^dZ-V6TpaTW zMH8~824w1<)c--t6c;=0a-;i$dgRN!qaE6UZ z9uXgk=wl(1Z;9vNKdKuYcK9PRe=zjpx`|J2SA|LXMD8=%ACVi4a5qf6CzNJ{+&56gB_~?=6GmL(phz~^^>O)=-;Xft$scz~4 zD~e-3i3NrZqRvI#>L<PZAY(_~Q1?R- zb4JHLAe-+a@#c#?IUb9^v7gUm?0M%U5pPd@*we?d2;6#D5pO-1%^P9hzZ3_bRS|yR z*f5*-BIZJ`%;ZCc>FQz|8AktRSI#izcBl^MVN--Z_GJ None: - build_spirv = False + build_spirv = True build_metal = True build_dxil = False build_dxbc = False diff --git a/src/shaders/lesson2.glsl b/src/shaders/lesson2.glsl new file mode 100644 index 0000000..25d626d --- /dev/null +++ b/src/shaders/lesson2.glsl @@ -0,0 +1,31 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#version 450 + +#ifdef VERTEX + +layout(location = 0) in vec3 i_position; + +layout(set = 1, binding = 0) uniform UBO +{ + mat4 u_viewproj; +}; + +void main() +{ + gl_Position = u_viewproj * vec4(i_position, 1.0); +} + +#else + +layout(location = 0) out vec4 o_color; + +void main() +{ + o_color = vec4(1.0); +} + +#endif diff --git a/src/shaders/lesson3.glsl b/src/shaders/lesson3.glsl new file mode 100644 index 0000000..7972a55 --- /dev/null +++ b/src/shaders/lesson3.glsl @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#version 450 + +#ifdef VERTEX + +layout(location = 0) in vec3 i_position; +layout(location = 1) in vec4 i_color; + +layout(location = 0) out vec4 v_color; + +layout(set = 1, binding = 0) uniform UBO +{ + mat4 u_viewproj; +}; + +void main() +{ + v_color = i_color; + gl_Position = u_viewproj * vec4(i_position, 1.0); +} + +#else + +layout(location = 0) in vec4 v_color; + +layout(location = 0) out vec4 o_color; + +void main() +{ + o_color = v_color; +} + +#endif diff --git a/src/shaders/lesson6.glsl b/src/shaders/lesson6.glsl new file mode 100644 index 0000000..70bd2eb --- /dev/null +++ b/src/shaders/lesson6.glsl @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#version 450 + +#ifdef VERTEX + +layout(location = 0) in vec3 i_position; +layout(location = 1) in vec2 i_texcoord; + +layout(location = 0) out vec2 v_texcoord; + +layout(set = 1, binding = 0) uniform UBO +{ + mat4 u_viewproj; +}; + +void main() +{ + v_texcoord = i_texcoord; + gl_Position = u_viewproj * vec4(i_position, 1.0); +} + +#else + +layout(location = 0) in vec2 v_texcoord; + +layout(location = 0) out vec4 o_color; + +layout(set = 2, binding = 0) uniform sampler2D u_texture; + +void main() +{ + o_color = texture(u_texture, v_texcoord); +} + +#endif diff --git a/src/shaders/lesson7.glsl b/src/shaders/lesson7.glsl new file mode 100644 index 0000000..e3b9a24 --- /dev/null +++ b/src/shaders/lesson7.glsl @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#version 450 + +#ifdef VERTEX + +layout(location = 0) in vec3 i_position; +layout(location = 1) in vec2 i_texcoord; +layout(location = 2) in vec3 i_normal; + +layout(location = 0) out vec2 v_texcoord; +layout(location = 1) out vec4 v_color; + +layout(set = 1, binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; +}; + +layout(set = 1, binding = 1) uniform Light +{ + vec4 u_ambient; + vec4 u_diffuse; + vec4 u_position; +}; + +void main() +{ + const vec4 position = u_modelView * vec4(i_position, 1.0); + const vec3 normal = normalize(u_modelView * vec4(i_normal, 0.0)).xyz; + + const vec3 lightVec = u_position.xyz - position.xyz; + const float lightDest2 = dot(lightVec, lightVec); + const vec3 dir = inversesqrt(lightDest2) * lightVec; + const float lambert = max(0.0, dot(normal, dir)); + + const vec3 ambient = 0.04 + 0.2 * u_ambient.rgb; + const vec3 diffuse = 0.8 * u_diffuse.rgb; + + v_texcoord = i_texcoord; + v_color = vec4(ambient + lambert * diffuse, 1.0); + gl_Position = u_projection * position; +} + +#else + +layout(location = 0) in vec2 v_texcoord; +layout(location = 1) in vec4 v_color; + +layout(location = 0) out vec4 o_color; + +layout(set = 2, binding = 0) uniform sampler2D u_texture; + +void main() +{ + o_color = v_color * texture(u_texture, v_texcoord); +} + +#endif diff --git a/src/shaders/lesson8.glsl b/src/shaders/lesson8.glsl new file mode 100644 index 0000000..e403bf5 --- /dev/null +++ b/src/shaders/lesson8.glsl @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#version 450 + +#ifdef VERTEX + +layout(location = 0) in vec3 i_position; +layout(location = 1) in vec2 i_texcoord; + +layout(location = 0) out vec2 v_texcoord; +layout(location = 1) out vec4 v_color; + +layout(set = 1, binding = 0) uniform UBO +{ + mat4 u_viewproj; + vec4 u_color; +}; + +void main() +{ + v_texcoord = i_texcoord; + v_color = u_color; + gl_Position = u_viewproj * vec4(i_position, 1.0); +} + +#else + +layout(location = 0) in vec2 v_texcoord; +layout(location = 1) in vec4 v_color; + +layout(location = 0) out vec4 o_color; + +layout(set = 2, binding = 0) uniform sampler2D u_texture; + +void main() +{ + o_color = v_color * texture(u_texture, v_texcoord); +} + +#endif diff --git a/src/shaders/lesson9.glsl b/src/shaders/lesson9.glsl new file mode 100644 index 0000000..bacd7dc --- /dev/null +++ b/src/shaders/lesson9.glsl @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#version 450 + +#ifdef VERTEX + +layout(location = 0) in vec3 i_position; +layout(location = 1) in vec2 i_texcoord; + +layout(location = 0) out vec2 v_texcoord; +layout(location = 1) out vec4 v_color; + +layout(set = 1, binding = 0) uniform UBO +{ + mat4 u_projection; + vec4 u_color; +}; + +struct Instance +{ + mat4 model; + vec4 color; +}; + +layout(std140, set = 0, binding = 0) readonly buffer InstanceData +{ + Instance instances[]; +} instanceData; + +void main() +{ + const Instance instance = instanceData.instances[gl_InstanceIndex]; + + v_texcoord = i_texcoord; + v_color = instance.color; + gl_Position = u_projection * instance.model * vec4(i_position, 1.0); +} + +#else + +layout(location = 0) in vec2 v_texcoord; +layout(location = 1) in vec4 v_color; + +layout(location = 0) out vec4 o_color; + +layout(set = 2, binding = 0) uniform sampler2D u_texture; + +void main() +{ + o_color = v_color * texture(u_texture, v_texcoord); +} + +#endif