From 37b69b6bfae31df72059c69c72e3199aa40a7067 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Mon, 5 Jan 2026 08:07:24 +0000 Subject: [PATCH] feat: Add rainbow color effect to fragment shader and update vertex shader to pass world position --- shaders/cube.frag | 44 ++++++++++++++++++++++++++++++++++++++++-- shaders/cube.frag.spv | Bin 500 -> 3548 bytes shaders/cube.vert | 5 ++++- shaders/cube.vert.spv | Bin 1400 -> 1600 bytes 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/shaders/cube.frag b/shaders/cube.frag index 7122ce8..79b4681 100644 --- a/shaders/cube.frag +++ b/shaders/cube.frag @@ -1,8 +1,48 @@ #version 450 layout(location = 0) in vec3 fragColor; +layout(location = 1) in vec3 fragWorldPos; layout(location = 0) out vec4 outColor; -void main() { - outColor = vec4(fragColor, 1.0); +vec3 RainbowBand(float t) { + t = clamp(t, 0.0, 1.0); + float scaled = t * 5.0; + int index = int(floor(scaled)); + float blend = fract(scaled); + + vec3 red = vec3(0.91, 0.19, 0.21); + vec3 orange = vec3(0.99, 0.49, 0.09); + vec3 yellow = vec3(0.99, 0.86, 0.22); + vec3 green = vec3(0.16, 0.74, 0.39); + vec3 blue = vec3(0.24, 0.48, 0.88); + vec3 purple = vec3(0.56, 0.25, 0.75); + + vec3 a = red; + vec3 b = orange; + if (index == 1) { + a = orange; + b = yellow; + } else if (index == 2) { + a = yellow; + b = green; + } else if (index == 3) { + a = green; + b = blue; + } else if (index == 4) { + a = blue; + b = purple; + } else if (index >= 5) { + a = purple; + b = purple; + } + + return mix(a, b, blend); +} + +void main() { + float bandPos = (fragWorldPos.y + 1.0) * 0.5; + float diagonal = (fragWorldPos.x + fragWorldPos.z) * 0.15; + vec3 rainbow = RainbowBand(bandPos + diagonal); + vec3 shaded = mix(rainbow, fragColor, 0.08); + outColor = vec4(shaded, 1.0); } diff --git a/shaders/cube.frag.spv b/shaders/cube.frag.spv index 828f1e56b1fa987e9bc5cdb272d43039ab4f4c08..c004b900601b50dcafdf0cf7414583e474f174dc 100644 GIT binary patch literal 3548 zcmZ9N%X3s!5Qi`1AqFHMFYy@+Y7j(0AYjacAO;aNfQn*NCd?3`!%UnI5fuq4iceI0 z;mRsmxxlS!T=*xjcJCG+RB8ErcW#fja;v)f_v`M{-KWpF_cqP$ye3IzC3BNG$@!%I zEKFu&NwBr1dT7_)U27+g7T0drc%KpTlcqG#n0D4Rqm?6t@rsUDkdKjb$O2;ZQ3TXP z<|Mhq!WOLgH7(Sdi*FA(MytmL3zcHmp>;jPH6?A>k0P#Fh@L!HD3^+Lz6?HIDVAQ# z{5PRT%cTnLbnR{E8o{nz39i-(m9bKN?JD^3Qn_3`R_FJ?$7-dLn=pPodbB)6be(sj zC#Gr><#c^h@*upB`kInH^k|Bkld6~v3|A+~)0)oXP^~bwuUado#x$-ac^zFGFN{?y zg)%U$`7XLvpFzscz$Xf|!ja7XA$sy~p;+I4OFCzBZ>yH8wKS$BoqKiaXqb{A_Trh` zig;#n&qwYf_pE|1;*>n673qm3DP9V0#nzEZb9$bhskUXTpOay4#tQhgXl=%(--U3g4-^4HtO9AzcA6;$m2`6_~NgPJnP`DF-~9PxgUJ?(o`eQ zhLm4v@QrZ#>5qMEg1g2zeUWD~c-2UIqy83nl1w-9JdpB%MxGwHYmC!p9?xwnG7DME zjT+3^cY?id5w{2IJqo@b+??a1;15S@47bck?%wY;$uGfB%jz2_nQ*j_u21BaP^rS*YEd4`&P0#iz&qUIip@` z*z2o^_EW^j`CO(p-`~@j?RaK)c71eeU)mz?n_%-g%gB2ItUY2*f{k&$5i>U_pTKdl--hq&LShatKcu#zH&EYy@t>L-okDOnEwe8O4{S{c7PuRW&Ycprq zzR7IfqhU_kd-g5jdgJxCBi8iZ>HCKan-TAyeY$razv(Vr_fuMa<_K=PD0hKiK^G zoUvS=`x!vo$B*2lLG(6c0NINCN&I%S&sE~}J%sE)yj$X^@h~`QSYIB#A+URj`trY7 zZ*KFLFZy`|obTsRxVD{${XB;Du^)ZAkYU6;;;8vJIBMFDJbX`poonM-N5c_!w?PEXsoJ)0Ae0-)O-OPHSI?pz8AsWNc1DOA9I`M06O|9fbHj}?EV}CYa2!E zr-b&gAALncn|Z`h^AI>{+K)VZV>zGqS8hL%N1gA_KJ)W)j`BEPwR}6;KGad`FxdLR o$HCT=x1wJ{e23%T@p5L~BUHvU*YjxR3HRdgatLN(oJ#4g!*TfV$| zu}8Ft9y&P&oHC|HeA1Ld|Lb#zJ;i2yU%VD8j*vXfcv>x=D>$V~-H8G|YkjJEfP)^V z$t}|Ph;tn_B#zO$i?#kk{!Oy4kzbd!9y0a&WcAkSTV$S)xO!`Mkd3I-c8G}W-Gn!| zk6wPx_=4o*8>q7n2>TaMd%Gng{jpxj^r&?Gk~x3Q_U?a3*stDu_qfH?_jvcsmRH0N D$)gy> diff --git a/shaders/cube.vert b/shaders/cube.vert index aca4e67..39930c3 100644 --- a/shaders/cube.vert +++ b/shaders/cube.vert @@ -4,6 +4,7 @@ layout(location = 0) in vec3 inPos; layout(location = 1) in vec3 inColor; layout(location = 0) out vec3 fragColor; +layout(location = 1) out vec3 fragWorldPos; layout(push_constant) uniform PushConstants { mat4 model; @@ -12,5 +13,7 @@ layout(push_constant) uniform PushConstants { void main() { fragColor = inColor; - gl_Position = pushConstants.viewProj * pushConstants.model * vec4(inPos, 1.0); + vec4 worldPos = pushConstants.model * vec4(inPos, 1.0); + fragWorldPos = worldPos.xyz; + gl_Position = pushConstants.viewProj * worldPos; } diff --git a/shaders/cube.vert.spv b/shaders/cube.vert.spv index 1711635376961371b9f8c89e9ff8f508398df22f..986dc4b04f5cd8937137050dac8c08fff3d84970 100644 GIT binary patch literal 1600 zcmZ9M+fEZv6o$7z3yOk>98`o>R74aoQDb5}1rxX+v4%u14UrMY3^SxHV!ZMdd?laC z8xy~8IvYqgSzYV@*Kx1eVQ^q^ID~UyG>n8tp?4<208D_ZmwI!1XM45N-CKS9WZj6d zFjxi}GafFK_7J}ZyJ;>skBlPMkS4N>4DvUC{zFnN4DojwUxP8{OM7>JqsWRjwlUU7 z^B!Z&IQY0|XM3%pg9%d)6X@1a=j%q1ce=ZIS4SO>yyu|UOEPr5igo7iX>#0Z7vJ<- zV-kJXSHu3!pXR-0#(5WK{Ma|c68wJlsg<-pB<*hU16cNx_vkA+X*Vr$_~9V$93`LT z-JSGjVqEmOCwv=OdiXZ=R-cm-pPScrlw~Kr8oPDJo=xUn*xO#_HqrXyJy)>3r+ba}e1I(<>p#S{ew=3&+ZcK4tfAKt Qzm@y4kJz|>bbp5Y2OtM$p8x;= literal 1400 zcmZ9K$!-%-5JeyHkU$_IgbYA1HfD|#u>gdGm}Depk%dvDY>`Ep(8%eI><%DS`~rLu zU&RKAbJ~6e`B~+vx^-Xmt?I7KwdX@P6Bffl*bd{f66QbxSiSV!z5TtNQE|BQ=ytbc`EY%SUOE<{9XG$yZ;Ar&+O|eoN%VntG^p2IgK4eC49??G&j!ACI{MhjGjA6o@;Vi9&vAa34Df0cQ_JTx`O+Kap9sqy zSMVn@J)GU0r5WSkyX5YtfqBf`jk!I$=yEsCvrAWFj~q|L;o z!TdE0pSy*rO+E6}a2*qm9KQiM?jUk*5R3n$&v@?fJ@NS5o5arX7LGIA!o)lgyG<e~`p9h%lRL#z9F7FRddW!u8XRBF5