From 25178e07bcd6684d1818f2f52a224f4bc048f74b Mon Sep 17 00:00:00 2001 From: Peter Li Date: Sun, 20 Apr 2025 17:32:44 -0700 Subject: [PATCH] updating fragment shaders so some fields are always used --- engine/rend/shaders/lit_mesh.frag.hlsl | 4 +-- engine/rend/shaders/lit_mesh.frag.json | 26 ++++++++++++++++++ engine/rend/shaders/meshes.vert.hlsl | 1 - .../content/_shaders/dxil/lit_mesh.frag.dxil | Bin 3848 -> 4420 bytes .../content/_shaders/dxil/meshes.vert.dxil | Bin 5380 -> 5368 bytes .../content/_shaders/msl/lit_mesh.frag.msl | 15 +++++++--- projects/content/_shaders/msl/meshes.vert.msl | 7 ++--- .../content/_shaders/spv/lit_mesh.frag.spv | Bin 896 -> 1592 bytes projects/content/_shaders/spv/meshes.vert.spv | Bin 1676 -> 1616 bytes 9 files changed, 42 insertions(+), 11 deletions(-) diff --git a/engine/rend/shaders/lit_mesh.frag.hlsl b/engine/rend/shaders/lit_mesh.frag.hlsl index fd63573..7407a59 100644 --- a/engine/rend/shaders/lit_mesh.frag.hlsl +++ b/engine/rend/shaders/lit_mesh.frag.hlsl @@ -10,8 +10,8 @@ float4 main(float2 UV : TEXCOORD0, float3 WorldPos: TEXCOORD1) : SV_Target0 { float4 col = pow(Texture.Sample(Sampler, UV), 0.4545); - float SPEEEEEEEEEEEEEED = 0; - float strength = 0.0; + float SPEEEEEEEEEEEEEED = 0.0001 * time; + float strength = 0.00001; col.r = col.r + strength * sin(time * SPEEEEEEEEEEEEEED) * WorldPos.x + strength * cos(time * SPEEEEEEEEEEEEEED) * WorldPos.y; diff --git a/engine/rend/shaders/lit_mesh.frag.json b/engine/rend/shaders/lit_mesh.frag.json index 46ff298..dc0a6a1 100644 --- a/engine/rend/shaders/lit_mesh.frag.json +++ b/engine/rend/shaders/lit_mesh.frag.json @@ -5,11 +5,28 @@ "mode" : "frag" } ], + "types" : { + "_10" : { + "name" : "type.Uniforms", + "members" : [ + { + "name" : "time", + "type" : "float", + "offset" : 0 + } + ] + } + }, "inputs" : [ { "type" : "vec2", "name" : "in.var.TEXCOORD0", "location" : 0 + }, + { + "type" : "vec3", + "name" : "in.var.TEXCOORD1", + "location" : 1 } ], "outputs" : [ @@ -34,5 +51,14 @@ "set" : 2, "binding" : 0 } + ], + "ubos" : [ + { + "type" : "_10", + "name" : "type.Uniforms", + "block_size" : 4, + "set" : 3, + "binding" : 0 + } ] } \ No newline at end of file diff --git a/engine/rend/shaders/meshes.vert.hlsl b/engine/rend/shaders/meshes.vert.hlsl index 3d1f56a..59046e0 100644 --- a/engine/rend/shaders/meshes.vert.hlsl +++ b/engine/rend/shaders/meshes.vert.hlsl @@ -37,7 +37,6 @@ Output main(Input input) output.TexCoord = input.UV; float4 pos = float4(input.Position, 1.0); - pos.y = pos.y - 50; // pos.x += 0.2 * sin(time * 0.5 ) * pos.y * 0.5; // pos.y += 0.2 * cos(time * 0.5 ) * pos.z * 0.5; diff --git a/projects/content/_shaders/dxil/lit_mesh.frag.dxil b/projects/content/_shaders/dxil/lit_mesh.frag.dxil index 7c2a3129ce32d6d114a97482a239825aaca64728..c742c374de50e9a24e6cbdab799a573ce22f4215 100644 GIT binary patch literal 4420 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 D&eT*H delta 2163 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 delta 1235 zcmeyN*`g)o65-^0-ui>^GNoUui?8S1aX4EziIIVUfkkwqls7Ar$*IlhtOr>vFTMH6 z{#HDTXWfxBG0$_#d@d25K1aA17!nv588$L8Fo5_#CW8P_>l&cAlkf%` zIkVM^0i}dl9Cbj_+(2y7%OGIL91ycKfFm`$h&9N8HB6&5B!e|LfHhpAH8`Tx{jdZh zN0Wgh9|MCj8z)0kg2TpxpO-pHg+O^*8K10dl!}1x8crN^Vapa^yVl{z)Sw_CQR1+b zQM%)xY0?A+1r9bh*^v6Y3vBXc5N?}nMBW3olnK2ODhwP=jfL#jrS~{WWI#+xc)-ZU zUf{qso0GHVRYSA1p#y^eOY>^Jdk&m?F19eNaJ((Z%);Pku;YUR-z)_lH({m)JbCUs z0t_q%AKYrTYG5*w@a1Um+9M0mc$)u10@t|&lX^vlF2iQ1pti`j16)@UOcWVjNy5as zMgAyo-vWtwX~D!^i#RoMKLClXvVw_ui+Videg+cb@@|Eiw_4QCk%!3|Wbv&V2~fv0 zv4(0iEAWFHXk&h(9_s3}g`yV}9yEh|V$c9H^R!q(B5#vDNWT)ZW zLc$H>=EQ!UHd{l9ZwC@?d~UPNyK%YAHs{9XHruQlliO@FBAPuM?UdO#fN?Hx*ID0T zkwA}x0x+f=Tln`eOms?MWRYzSfU9`xY~ipBrs4?yBZh?#6%lY1f1NEI>Q}*(un0Y4 z*a%UQ09VrMV&$+7rou(&6~jT0in)T#%)qFw@Kcg4a8v*8S(XOPqYO1*;q9Y;2?Lc`nCfd(y_ufgfb(*%jKjsu5O=IBd6Ql5s6pVLF8)0ZG-)&s+`*VQW|4em)X zEx}$#s1<>cYh0Mw8Vhq3=0i<7w@B5%l*0|2t`(fPr!P3C05exNj!CIG;fMmrdXa4v zoSO}}=Ur$QYzF0ufE$lg&m7VzP?C4!5dwyfLt^)I3+~MiI5TP_3_XCM!rZDG_ekdq xllrSfxCxy=6XtF}GNJB}PQ@ZggnD(L`bh{2fYK$4kc?A5lcdhX0xVNN007fhZ)^Yn diff --git a/projects/content/_shaders/msl/lit_mesh.frag.msl b/projects/content/_shaders/msl/lit_mesh.frag.msl index ff5140b..a49c3e9 100644 --- a/projects/content/_shaders/msl/lit_mesh.frag.msl +++ b/projects/content/_shaders/msl/lit_mesh.frag.msl @@ -3,6 +3,11 @@ using namespace metal; +struct type_Uniforms +{ + float time; +}; + struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; @@ -11,14 +16,16 @@ struct main0_out struct main0_in { float2 in_var_TEXCOORD0 [[user(locn0)]]; + float3 in_var_TEXCOORD1 [[user(locn1)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], texture2d Texture [[texture(0)]], sampler Sampler [[sampler(0)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], texture2d Texture [[texture(0)]], sampler Sampler [[sampler(0)]]) { main0_out out = {}; - float4 _27 = powr(Texture.sample(Sampler, in.in_var_TEXCOORD0), float4(0.4544999897480010986328125)); - _27.x = _27.x; - out.out_var_SV_Target0 = _27; + float4 _40 = powr(Texture.sample(Sampler, in.in_var_TEXCOORD0), float4(0.4544999897480010986328125)); + float _45 = Uniforms.time * (9.9999997473787516355514526367188e-05 * Uniforms.time); + _40.x = (_40.x + ((9.9999997473787516355514526367188e-06 * sin(_45)) * in.in_var_TEXCOORD1.x)) + ((9.9999997473787516355514526367188e-06 * cos(_45)) * in.in_var_TEXCOORD1.y); + out.out_var_SV_Target0 = _40; return out; } diff --git a/projects/content/_shaders/msl/meshes.vert.msl b/projects/content/_shaders/msl/meshes.vert.msl index 1853618..068f8c4 100644 --- a/projects/content/_shaders/msl/meshes.vert.msl +++ b/projects/content/_shaders/msl/meshes.vert.msl @@ -35,11 +35,10 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float4 _42 = float4(in.in_var_TEXCOORD0, 1.0); - _42.y = in.in_var_TEXCOORD0.y - 50.0; + float4 _41 = float4(in.in_var_TEXCOORD0, 1.0); out.out_var_TEXCOORD0 = in.in_var_TEXCOORD3; - out.out_var_TEXCOORD1 = _42.xyz; - out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _42); + out.out_var_TEXCOORD1 = _41.xyz; + out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _41); return out; } diff --git a/projects/content/_shaders/spv/lit_mesh.frag.spv b/projects/content/_shaders/spv/lit_mesh.frag.spv index 82899a96be5fcfae1dbabcab002a42befa2a8bb4..a67a8284c55353d4d9aa910573079333e6b61444 100644 GIT binary patch literal 1592 zcmZ9M%T7~K6oxmH0t#{w0RhDVDk^wXO{k=a1yYL9p#$H>p@~o6 z1Nas`f)f+J@APbQ;!YNO{r|eJvrD0UrYnTD5JF#A=dWilw5Lo@=uGde?Y-^fta+F$ zEHBH}nEGAd-peTSU5tLOk8AHv8uc@9C!X@2X02`sm}2PR z&bh&KrG3|qlMj_fQhsr;xwEtTJe^mY^ZaLf)XLRGYzQak%`|Xt|82R_II1>@be8;H z%+rf+I&*85e}iw~>)s|!$`M;r?AH-nCvSI8(}*>+i>DBe*!|?~;=J7*Xt%EZ;%I+K zwYaw#c+VD|a@HF`zrC(wN_&ZB>c z+gj#a2Rnn`+#|Mkzp+PbzkX9=#P(-Bdl1`?-zQ@G@r}iPr!t%Mma*8Axjgpx8#K-R zlq}9XgBUBe=bMQAiQVTd#Qyflv6lVbL*&2UBc4NiWAd*uZXVsdp6GWUT_62>>B-mxv9`MQ==%WOcc|T7+?W3_ z+-bfS|53=txCL}$tAa zK6XbF>U61Pl~LCKWl%y55B3*R<7z2~kw8+yLF%nR=gcU|1j zy#M7I;xZ$+5g6StX7@umn)JanIR<9ua337>3sT<@uF8+aB~Qw)Kfmfl;goV}%skPa z;7vK4u$S}#ZVQ)xm0bb@V^yi7|5D2>i^ZL(XO?v^bF+$Qp+i5Xhz@n|mLhjypS)Ok z#hNPH78_Gh&Q00rMttUS7Yxii?tp>OM~@j`^m#M2OR1nAyonj#LOY7LVzE;}4j0VK zqMUhP-n1)cUQb>2D#_tce-e{-l;zaX!cxn7SCq3CeVqG0N{9RG$?0S5rOv+caJ{b0 McnkF(DP75b0RYE4XaE2J diff --git a/projects/content/_shaders/spv/meshes.vert.spv b/projects/content/_shaders/spv/meshes.vert.spv index 023dd4c97fb333c49c9552ce2f7bc7f6a4854d0d..019eed87f6ac151d32df35ac0cb5fe76eaef12a4 100644 GIT binary patch literal 1616 zcmZXUTTc^F6h;s20A4{v0WUxc-qDINF(yU@FM$_R6g9k(GEK(V)|6J`n?J#y>x+qN z&CG!YPqJs9Z|`qkd(vuUbuxsp5W-Y=#Md(uDy5~GW4+Vi?9simpLGQlL`H&)BNGV8 zuvK%s2Vp#%4yUjUett_EyMz9)H5m5OgIB|LJMA}iTWL3ilfVk0K;|*3IPZD~=~u3D z&Y%zT2=PSTQJ(ixH*5F$okRQ+bWn5}!sjggvD5E;Nn3-gN5|&X=RAX~lcKPUhjZwW z6j&zn*|Kiq`+mRi@$KI0X7j_F^@2Z{&wRr7IQrZ}Z#eib(46k)q|co@n?1$7Zh_sY zy{;i*_ZsICyZa@?BldR?tHt&)>bJJoI{Mw^3gU^lUcel?6aA4dj{a@3$KPkQj2X4r z>jh++I+5o*);W*1mkq=i--hQnPjX~iz`n&qa-2(k+`%#b*fv@>@~j)hJHv6o-*S^jPm2$goRx-0Wd#Yc~f|UzPCC7N@?ex)oxSxywWeJQxQkB#s zN+w$+$9p1F?WCQME&K5`j&`$j($6Moe6TSY4B|A}?Z=~7oIoryhsZ;eJMYE^@fTg; zoRU7wBfz!1qdf1&Q8E~(!$bLN>cDks_9=QtWaX(AO>X^Lvm?ukyv6L)TJ0m@l zLY8_yTQZ8i?WfU)w|j4Ty`9Zf$FJuzAM-u&KK3x4Wd8+{ll>g`J(7*t=*jPOOPHO~ zYexcRuYN8tyKhK1V7>zw4W^G-KefTs!Ot#R5{}1B2Xo9$@OwVk`@72SzfZe}nYGdD zIZ0P_Jdb&(b5@#O)+EI6HaOEf!I5o6_AN~Whq>VU9ZdOC+iYFWqppu*7UI?<t4bKKn^*P`xWj?FF#U(lTxdRfu$k~B7O zL%G=zwrjexA24?228UuUOVca1hA_PoP>0xa9YxC-)1j_nTdCZ4a^L@Gmq(+ zdr5+y9+}5udSr(l(EZFh9XMjdavTiD3Gt&Z5)Jqhvf@$_oj10liQwOt zU?+~;>*BVgA4u3CZQ?DvbZP@==HXCu(8$w#S8?ygj{0 hcEukcJcL6}%=bzg