From 0e5ffc847dae36b94318302c04775be1816588d3 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Sat, 10 May 2025 18:00:58 -0700 Subject: [PATCH] SSAO blur --- engine/rend/shaders/postProc.frag.hlsl | 33 +++++++++++- .../content/_shaders/dxil/postProc.frag.dxil | Bin 4696 -> 4892 bytes .../content/_shaders/msl/postProc.frag.msl | 50 ++++++++++++------ .../content/_shaders/spv/postProc.frag.spv | Bin 3156 -> 3976 bytes 4 files changed, 64 insertions(+), 19 deletions(-) diff --git a/engine/rend/shaders/postProc.frag.hlsl b/engine/rend/shaders/postProc.frag.hlsl index 5eda966..4344326 100644 --- a/engine/rend/shaders/postProc.frag.hlsl +++ b/engine/rend/shaders/postProc.frag.hlsl @@ -16,6 +16,34 @@ float3 reinhard2(float3 x) { return x2 / x3; } +float3 blurSSAO(float2 uv) +{ + const float offset[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; + const float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162}; + + float3 c = float3(0,0,0); // SsaoTexture.Sample(Sampler2, uv).xyz * weight[0] / 25; + + for(int j = 0; j < 5; j++ ) + { + for(int i = 0; i < 5; i++ ) + { + { + float2 uv2 = uv + float2(j - 2.5, i) / 1024; + float3 s = SsaoTexture.Sample(Sampler2, uv2).xyz / 50; + c += s; + } + + { + float2 uv2 = uv - float2(j - 2.5, i) / 1024; + float3 s = SsaoTexture.Sample(Sampler2, uv2).xyz / 50; + c += s; + } + } + } + + return c; +} + float3 blur(float2 uv) { const float offset[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; @@ -102,9 +130,10 @@ float4 main(float2 UV : TEXCOORD0) : SV_Target0 // c = float3(uv.x, uv.y, 0.0); // c = SsaoTexture.Sample(Sampler2, uv).x; + // float ssao = SsaoTexture.Sample(Sampler2, uv).x; - float ssao = SsaoTexture.Sample(Sampler2, uv).x; - c = ssao * c; + float ssao = blurSSAO(uv); + c = c * ssao; c.x *= 1.0 + 0.000001 * EmissiveTexture.Sample(Sampler1, uv).x; c.x *= 1.0 + 0.000001 * ColorTexture.Sample(Sampler0, uv).x; diff --git a/projects/content/_shaders/dxil/postProc.frag.dxil b/projects/content/_shaders/dxil/postProc.frag.dxil index 750c0a380eaf1e4fad84bc21e8c65471e13edbff..5111afbb5378934de21b6c382cb5b0735eb91025 100644 GIT binary patch delta 1488 zcmY*Y4NMbf82;{hcNDzZV<29sLJ{o5F>=)@D$uon9SEH#Wmmfrho3=Y5*$Q2pf+2etyAV}=$LZajjx&yitPZN3D3J|w2*JDHjMYz_WI_P^>ElSHamZno!+=ITKeU0=oqbM~sD^yDy zH{0nf3fXc)Ds_@tD5b5c?r?Vq>pOQXm zlXa&#pA_tpC$&#cY+NntY<+xV)Zrcb{EjyG_?E)z#7eWVu&A&?TUJ<9s)H}$l5?Nz z8S~|z_36iaZPv>f&L?T@LAxTxC#E&aHGvsPtA$Kp;gOP}s;olYA>*MUon6tL?tGFv zp?SMK=;ap^nxv%F9ww1*GL;=Zc&MnNQU~tY>>Wqn zX~?b60K2U5NGvcRYd=2!O;Uggt4xSYXkWFd*_AFd7Fa1=wBLh0Twn(bB|P)ZGqS?%g`};}hJscg z6JobllpYwy_7-g;&WAEVKuwt^fF-#xhHgu$X0jz(p?yJqrqX>{VCdM?$Tah+bp(ka zwIm{qn;oU@3}D-oJqW8pA+c&LE?6dj@3R!Gkg1~P$P1Rrmf?B0W(w<5-7+ARbEG_| zPlY}fvnz!Sc#jq5D*LIhpHxb@+h(cF8RSebw)jOmp{2drk10bwHiDMAgsFyO{N$H0l%kWcA6bqRR3>`v9+M(vgjp=GkS0DfPHgo3o5Cd zG;=1~%E1A0sH$$rryaawkK5XUUgI6C zn$hQpDe|E37=#x~md1LXMHwg`Q7<5e*2%US9=tm^kP9szH{~Y|4mk6zEu!lnT3P`q zH(G7ArPb){D1rICil^vIN5TwT+l(KBl*RZ9g~{C_5!7jL93U2!+tGBCoWm@)JGf>M z8k=g!QaWgM)U(v@wXGaqUtkFAA#u*rerg_W&zW3=Ejd&DhB`v*_olW6&FZ6unA#zd zGu;N!>#>;*3iB&$I6q-3FhR7vJ|pG2Ai29gWk~R$g+nrj`ps!T-^;J&qBzqrjt8=6 zZlV2z{tTkL&!qIGE617bGxb^HbKSDH{9bo7XDXuy2jEO)M4aDiZM`?Y?PdF+uwr9` mGPIeD1427=C4w?W6dS{a-zca487PPUSKkq~%Elk#!1XVJ)CCCu delta 1291 zcmY+DeN2-_9LMi@`aBPXKD7lbJ}uflh05rxrNyp_FSUiPL&8|6CTkYwTFaPbjIrT1 zmo;mjqKHz$OJy=~3B*9;A4lmT;GF5pq)i9oWiDw*L)g+VWVlqu6ce)SVU%QEa=Gv4 z`@6eb?t6DVFDen}O~oY-t2%R(eTRn2Dw-I)+xJKa0AR{!69~`;OaKy|q9JJK90q`y z_J`@B-gKlK&?A@TFzpwY_-4g80N;3da1#t|arYp?9F#Er23^qhN(|s~w>FJR;NT%2 z%vjUm54VHQ2mspLk6ACd1!y|NbIZ_Ukjm{qjpXh3N)(u6CNLdqH1aI$Lx+x}zsgNJ z?KJAM;ZsgysXKw@BTCwGZ^sJlQwrByh$;l72yLZlC|8ZY7#y<^Q4a?axJ z@#dPEGIPpX^rX?*#n?h5KHrD*ct2qGL+%)pTO|20GLtu5@%;h)i&(*5zbMudFsE)L zVuGJfq?GnI6M4G`A5t4H(iws%3@N&|3` z`OY8#F`Z1N&ULBG*xbp`L4eMJHy4M8g;OPB#2r^KP5QbF4fr#xDX)zZi?{-X>ZWJ9(Azu z-%*K~NxO|vUUZqV#C&X7l}Zc@ndi+a3%9y8ZVgIA+4;}LG7tu@9*X%DMkV1B;_I+R zgU-iLqy=RZZIk|NCWFVw7~6myG$0z}Q}Tpz%vtD|UtHczBO z_k#Kg<_}uDl-e5A;)YDvtkN+JnV4TA(aeh<^OffS7pWiRE%@+JEprmEkL!4G!2aLF z21JwPqinL_IqQ8`#G2P?vMLjv8&nJW2`OT!SECIq1yRE^KzJ1&6Wa$AlPH1jMS20| z#r0fQ-d#v>4Wu|z?WCxQVQg(-_mHCOe}G2qfNj-GbT#S-hZ+vh{v}(r6kY8UcEUDS z5iOLHAs3~o!dLi8#rh$C-%)EJHe`zMqfPmO@T_G(mqlNuEF8k#w6{()QV<=_!M_u% zU{XE-TQ=oW?w0xvoje>G)ozPhEd#7&rPa~GXV}Jwxjm;6fMjChhp#Z?51cYzu{<8o zECu()1E-6DNgEC!#hP4;r#Sm RIcMs*at~+GLH`E2{R^FCx?KPO diff --git a/projects/content/_shaders/msl/postProc.frag.msl b/projects/content/_shaders/msl/postProc.frag.msl index 49e57cd..fc014c3 100644 --- a/projects/content/_shaders/msl/postProc.frag.msl +++ b/projects/content/_shaders/msl/postProc.frag.msl @@ -16,28 +16,44 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], texture2d ColorTexture [[texture(0)]], texture2d EmissiveTexture [[texture(1)]], texture2d SsaoTexture [[texture(2)]], sampler Sampler0 [[sampler(0)]], sampler Sampler1 [[sampler(1)]], sampler Sampler2 [[sampler(2)]]) { main0_out out = {}; - float2 _45 = in.in_var_TEXCOORD0; - _45.y = (_45.y * (-1.0)) + 1.0; - float4 _53 = ColorTexture.sample(Sampler0, _45); - float3 _54 = _53.xyz; - float3 _68; - int _71; - _68 = EmissiveTexture.sample(Sampler1, _45).xyz * 0.2270270287990570068359375; - _71 = 0; - float3 _69; - for (; _71 < 5; _68 = _69, _71++) + float2 _51 = in.in_var_TEXCOORD0; + _51.y = (_51.y * (-1.0)) + 1.0; + float4 _59 = ColorTexture.sample(Sampler0, _51); + float3 _60 = _59.xyz; + float3 _74; + int _77; + _74 = EmissiveTexture.sample(Sampler1, _51).xyz * 0.2270270287990570068359375; + _77 = 0; + float3 _75; + for (; _77 < 5; _74 = _75, _77++) { - _69 = _68; - for (int _79 = 0; _79 < 5; ) + _75 = _74; + for (int _85 = 0; _85 < 5; ) { - float2 _87 = float2(float(_71) - 2.5, float(_79)) * float2(0.001953125); - _69 = (_69 + (EmissiveTexture.sample(Sampler1, (_45 + _87)).xyz * float3(0.039999999105930328369140625))) + (EmissiveTexture.sample(Sampler1, (_45 - _87)).xyz * float3(0.039999999105930328369140625)); - _79++; + float2 _93 = float2(float(_77) - 2.5, float(_85)) * float2(0.001953125); + _75 = (_75 + (EmissiveTexture.sample(Sampler1, (_51 + _93)).xyz * float3(0.039999999105930328369140625))) + (EmissiveTexture.sample(Sampler1, (_51 - _93)).xyz * float3(0.039999999105930328369140625)); + _85++; continue; } } - float3 _107 = ((powr((_54 * (float3(1.0) + (_54 * float3(0.00999999977648258209228515625)))) / (float3(1.0) + _54), float3(0.4545454680919647216796875)) + (_68 * 0.0500000007450580596923828125)) * 1.0) * SsaoTexture.sample(Sampler2, _45).x; - out.out_var_SV_Target0 = float4(((_107.x * (1.0 + (9.9999999747524270787835121154785e-07 * EmissiveTexture.sample(Sampler1, _45).x))) * (1.0 + (9.9999999747524270787835121154785e-07 * ColorTexture.sample(Sampler0, _45).x))) * (1.0 + (9.9999999747524270787835121154785e-07 * SsaoTexture.sample(Sampler2, _45).x)), _107.yz, 1.0); + float3 _109; + int _112; + _109 = float3(0.0); + _112 = 0; + float3 _110; + for (; _112 < 5; _109 = _110, _112++) + { + _110 = _109; + for (int _120 = 0; _120 < 5; ) + { + float2 _128 = float2(float(_112) - 2.5, float(_120)) * float2(0.0009765625); + _110 = (_110 + (SsaoTexture.sample(Sampler2, (_51 + _128)).xyz * float3(0.0199999995529651641845703125))) + (SsaoTexture.sample(Sampler2, (_51 - _128)).xyz * float3(0.0199999995529651641845703125)); + _120++; + continue; + } + } + float3 _143 = ((powr((_60 * (float3(1.0) + (_60 * float3(0.00999999977648258209228515625)))) / (float3(1.0) + _60), float3(0.4545454680919647216796875)) + (_74 * 0.0500000007450580596923828125)) * 1.0) * _109.x; + out.out_var_SV_Target0 = float4(((_143.x * (1.0 + (9.9999999747524270787835121154785e-07 * EmissiveTexture.sample(Sampler1, _51).x))) * (1.0 + (9.9999999747524270787835121154785e-07 * ColorTexture.sample(Sampler0, _51).x))) * (1.0 + (9.9999999747524270787835121154785e-07 * SsaoTexture.sample(Sampler2, _51).x)), _143.yz, 1.0); return out; } diff --git a/projects/content/_shaders/spv/postProc.frag.spv b/projects/content/_shaders/spv/postProc.frag.spv index 76a405bdd4143cafa276cee5531c54ac06a086d7..a8a72609a08f8439dad7058388b4ed3af3e3612b 100644 GIT binary patch literal 3976 zcmZ9O*K<`>6vht;Axbci(2JTFJ8%)ChlFTAEYXl+zzSEnhDe$zNUT8wv0?9BY_GmL z6B^wHb_EzJ4h+ky$}Pf@=K!qAq>A|2pL zPfU%L3Y(4;28N3LC4BjL%v{= z{YK!>w-$L_Kd)PtysoeA>$~3i-j$`k^o5cD48oU@fuQ3qg`h z|FRT+5mp131Jw2Fa=!8PfcV|9esSt2$#UYCU>jo%*HIb$rNEd#tXl@R;io@ZBW^jq zTp;3B!2SMPM@#rC@qgZSW{bZ0tpbkNXEnAt24dYBxL>D^w#K^4@$LW6XWqD>&3jx4 z?>(&PN;=s%ed{6@L*LQBnugSx*>e?9ek<~g86UoHGY5EvXEiaqw|!>()y&pUelh!8 z!`ujSEwlD&Z2Q-omY`q9+|0TLW_!`0@45D#BXoPs5xTwQ2;E+Cgl_LR^v&D6%w69+ z%~>vLcs=&~3r)M?EpEV<3q;(Fa7i+~a~-#^4r_s&h?sTQ^DmsgxYv4oxj@7f;26!Z z*9IIp5i$G>m{&{Wf0|nfN$7`>YMKb#>gKa(jI9B^6u&AWQE_| zE}$kHp5y(@RlNlm;~SZ)Tr2SVQH!|U*v6?vTpPA=@@KQPw_qFF1{RRL``rpW*Kbta zZ#?eWj%`22UH4$yk8#(%*v81mU2nsdFTd+PI5pvjyPnH(yB*G$HQ*nra0j#R>-=Yy z>z&xf`Q~?l4xr|5%-z5{sNDn9eq?XIy-uL+@5x`h+kR$s$G`aMT|nM5wauYB^PM9H z&ovKYdO$CT9PY(72em$+7C9WiR*xJGW;#=vgSzqZ=Ab=7Zuaqg!2C~fAN~6?&fmj` zc>vq}_Y-6PJ_wAHw@>6A0`h);_KDoXz_(J1cRhq%{;r4NIj_M7h$Yod4Ur|9niZ2M*fh&nuu?f0h^amTRb>w)JDGJBqL z^xzQoQsDl>U<5=Dj$+$`YEJ;Q=)o~;_2|LzOlL}aP<;Z(d#1KIOlH1w!sB)zWiS1sp?v_wphN=*s4jVynCea_0sz0TDjKb3(0L53r#A`%{^|1 zn_jQf>y_Df#-l?)t+%DCMi_^G6= zH2~Uxx_)oYH~t_X{(L|BAuKs-7W*B>KJoo;lOt3{{Rof?L|h--FF(&tgx`<(KAQ=2jQX_iilnwN^*zP~-HyuUrg$#{g^M z?TtM~l;42-y#_GCAHa5n3~m zI|n@1??v73GVVHoZ4bp=C$a6Jxa;{;OA`6G>jiB2*1J9przRY6*Kf1jo`EyQJpQ5z zQ_Q}v^Y2-%7qN}=&8NY$K+WHy8Q^b&+H*kdJNEW_c^;_y8}JA3_5!oI<8OTR7lFKI zYMaAs<~v6Yo@*Y)yaZkbk;5FeIjCI%YLUZbZ1u=tKGT`f9Mp}MHwW!1x%DtF0Q3Kn z`{*xboWEfa^9r{6Un0i-T>{3*+b42YfV|(IeImCEe5}wgA{+GwwaK_~G z@cqn1ZI?XkBj3$B_JVv5_%8bPjql?eYwS1QC)Pyo+E3Bn?_k?EeIV+vg6;RG7I9^4 z`GX+7!*{W}GQX2~6?B964zFVyBOl*k1zX;lI^s9+J!~~cocTVs=c>h?YuK%|Ux$-# z-E#v@&EdP-qgBuk)V#0UCh%Trk`$>hTP@-~!}ff& qsL$uv*2nKExZR9vXTHSm-yri%;CkbCfqPH#-*6AJ+CS`Y7W@mXt>$I`