From 6b6c754b5f82b97dc4ccd74712c4c070ba8f856a Mon Sep 17 00:00:00 2001 From: ternaryop8479 Date: Wed, 11 Feb 2026 23:37:25 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=B7=BB=E5=8A=A0=E9=99=8D?= =?UTF-8?q?=E5=99=AA=E6=A8=A1=E5=9D=97=EF=BC=88=E5=9D=87=E5=80=BC=E6=BB=A4?= =?UTF-8?q?=E6=B3=A2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/cornell_box | Bin 432944 -> 437712 bytes examples/cornell_box.cpp | 2 +- include/core/denoiser.h | 69 +++++++++++++++++++++++++ include/core/renderer.h | 2 + include/core/shader_manager.h | 5 ++ shaders/denoiser.comp | 28 ++++++++++ src/core/denoiser.cpp | 93 ++++++++++++++++++++++++++++++++++ src/core/renderer.cpp | 30 +++++++++-- src/core/shader_manager.cpp | 10 ++++ 9 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 include/core/denoiser.h create mode 100644 shaders/denoiser.comp create mode 100644 src/core/denoiser.cpp diff --git a/examples/cornell_box b/examples/cornell_box index 250e4b7ca70bc446b3546695ccc2d4606d6f6de3..9106b6a9a14dae7cd3f5f5a76efe9a6ffdc2d9a8 100644 GIT binary patch delta 118908 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%0Dn;Ss&WwX{KcD|?4Zq74$v+gwROa8 zyzbUXYoaK)zp}Ho5bIR-&e~cs<1(GwMf+80Mw@ljf=JIx`rxiw0#Ux8+q!FOl-+u# z9$H^TX{#UTsa;o;G4%Uh+C{7YkL<0@Bt>ybeIG56kl`n3^L|?KfXgScu}X$do|>a0 z_+lh5#yVho(n)WteC_>pM;BweQuTvai1`Vnz_Pzd=f4zCgV?%;q-@rn(i^8y~%{{ z0)p_keT?=Qr1dUGjDaLIxC&~v%bg8B*rwQy={4pMSoyUdJVYN3(pDF_3_G5bzACsC z7}+GZ;34|sU~NFTZ^$>kML@O2a>mk;q_XH1P`QXyf!il!j;7I_6by;#quRc^u#q<0jeb+GU zof5h3Amg7OyaHLXCOh7fl@Ep_HFyh)g{?39L52O=P5&7IMXkZhvUZ;+UT}ZiIwDTA(oNV7k ztz)#3Zl28$Y1>Zv(-^Hg`FR)h7^{^dp1Ww&Sfre~i#8pr1-hN}2Gi4D^&w-mB5pe- zX|tPprwr&h2s>VbdiNPJbil|yBlOuPwAsXxG!(nQhxC))LA{0!9yTgPZX2##nQtE+ z87ZSR>N#LgpWZ9bZ;|Yq5#_=B^g9+>-NA>E}XXMDfqXxAxwj($1IizR5 zJ|lv9>XE0ltxD-8Lq?-?|E48U84)yK$N&^v&pM+Ob}KUMbdIwM{%^tmxMMlar>7{n ztlhAzUY_eTEzNcISeEN-g*U5t|IZb8=9XONb=zsZ#*Lmqcu5;19|1AaxJ0d)fA7cbP&2^r8fCAjfb>b@xr`N&{&T;cT{f{LG=4nRY{RN)}evGsJ zAHtsnI-Mij{`>z5Y|iaf>XWc)pD-tW%J3iI^UA0Jv`2HZyZ*~n?V@J6>0vT`hYp$3 zI@{@kZ@|JkWIOAEb^(2hx6l(oy`j|YI%YekgSPLM?KBlOnQr&YcD4nr`~`3ktTKX* z1x@M&esr&neY2hYK?e=Uc52u!H-8{7=nc>yUy~_pP_}cvFLvBshhr6X)oX*ZorC;L zrd6Q5{V|0flI=VNIs-HbcNiQSmhC(Ys*TKcPAF+IrH;yW-Ucl(8sWIbpatj(d>{4s zm~3a2QYOG>F1!UK)ZoH z1pN}!0}GsML3@L40=*47+k%pZn@l@E!y;hjCS~KRHq;1oe`S+t5olPX$+RDI18Bfh z)VK=bfer)x74#zL($s8cswK)~`WX(7swPv#G>9Cu-Za#xn#nXB^g8Gk&@I(XruU%U z(I!*b=@2DoQ_%gOBS25pK*pdQYMM;{fc^?vzzY5tlc_3b7tl_ir$A493(3?nnVy4M z#DkWeXtRfNP%_Z)xoDD#&;`&O=t-A(XaeX&ztGywDzXgKIi(7K>6L6bn;QJ^lM0ic6GtAI`bjR&0p+5vPa=pfJy zpp!uNfX)ZaDQ3xWZh)gM7B75Ilck_-L32O{fp)<FM{z_1T?)Ds5;_IC z1#|-z)xx0Nb+M*59n>Qj1qa;_ih}qeeiSfhm#R6=i=Z<=UxIG1z~K$;52%*otPVN> zv=wOG=p5%^(50YHLHE?iar&co?5UmO%mMYNgLvp2r|Ka?(50W{I3I%6O~`S+#qk_T zEl^zJ(D1&f0OHpLT?=YSf@2RHT|m!)4g$RmdI~fi32o??kV&o%ZH%Bpfg6H zf}r6OQNcj;|D|x);jv*7M2~*kWpa-5D(J&hFrxnkq~$orf+m5k0G$AO40Hpi9rQY= zJNmcBH>fG==b(w8gFuIY?g3o^`fvs$h<@K?CUgyS!z@Uylm(7?XcKrm1hs?afaZXP z&qvA2A_8bI=mgLh(50YBpnE`jF#iQe5VQ+L%|ShuSc)bF zodB8$Is>$e1&*a~3I(#+U&b2D%iqF6ai( zR-g|-dxM6556OYn1)Tw!1iAur&vK*(I%s8%)AA6G>pwtwknlrL6L1cwM+h?dF~=DM zngbdSI$<>m3VMAFv>)^#=oZj`474R^&U#1;mUF^SInHp zp%b9~pbvjW|L+1v&NhgU(H$sR7^n`>0bl@KF`l-=A#uE+Gla@*cvA%c}uGSRr84 zh#LqPB1k~ch!GY64TusEHEQavf*2Gv_;w?rT`g*=sPUDkv<-@FTBAm#HdeH&MVl&W zw5U-M_W7Neb76DZ|1+Nt%-!#tIWu$S%*&m7cY}Bb;%vz8dK2S+6F~FZm~as9*^ibW z9{P8T0>lSCMvW&Rj=={IXMYMsi03No6A*VI-i3G%-rHzK+??DMk0H)>cf}7QE<>Dx zwPFwAp@{P>>?aVh!}+7S z;z3%CMt8-xB2Ldj28zdZ#j{U>B@hP@A3z+X&w;LZE*7c$le*&fAWjdWWm8~U#N~*0 z6u=^g%Vu`PI}ukQ_F?hbg?KdL>_X^6T!y$Tm&X5W)Pz703Y?0T&FPA7LR?jheIw#s zh}#i&B2J%%3Y>-Q8REH!a}ggvT!J`#ZdZIQ;_R~_k9Y@e`>Rfd1#r%=AMxCCpdYJW z*`ls^CE~S9AeV>nUv&XYd5Au_0aJCNVu<(Pz3m9% ze7wZpNT2b>etHll?|n30hPZ0n(fBUJW!XpL2N7rE<>;XWs1RO54jXo*fk{{Z$+G+7msHZp(2R$5tkt@LA)06O2k_cS0YY7H6CxG^wZ+;lsU+s zk7uTcv!}=7wTPP$zkv9_8S!`r;;LXg-oF_63*zxo#Oe6mxCX?#!noLvi#@aB@r<*O zP=taIXU~BmiqDS6TM)0EACJ4|LQzRPo`-ntf_S`)J|nI`ycO{##JdpJB5p>!3-OMH zIM*VMxD#>JIq`UK9?HRQyp$mhH{+rP7iIX7pIwO8B5p)ng?K;W9f;cy??K#&c<6a} zo9S%Gmm(kHUFXN+`w;J0f|eqldjVQHAL(VV9OBMUJiY<(&=v9cPQ+UgHxNhMJRjpf ze`P!#16YgrFyj1GFlh-YfOsh49f$*n415FWs4$rPz6orH_R@d=y~~RG5-ftk7Qa zrF(3+t@ubhg%UWB&<6YqrF6!V5?D2^%LLm2Rw`IM*doF9ft7%zBBnrPwBp~~l+JKB zcnGja2+|XQLc#ij1qGuYUdk6NA1qHWI#tR&#=@pHD**$5Jy8J)RKrTJY{BrhhRPBw z3N|`{k@a5y^MhekK{LJnQg4dxm1b~i;4$6{2?59)L_*CbJN1xzva4*4J^c{6jue!V zf;C?MO2|>y&2`}rW|O`CkbCT8vOr=w6}%Pc)&GOzOKPem#s147_lOhbU8U5JA?ZC* z=pd~GnMiTU<|FYza0K_6_R)6t2>e!&dtBP8q9bwYD0k*ed)e3S!KwAQjha0PpqG*Q z4WuT$0jVSl@b8$vyb)_-kIkN~*6r>)lJ9hpdg`s}JxAi6VUYQHrhVjV_nfq|=N*aP zkql5!XwUz~Jvhz(;gR^QkaRCEw6FZeJ!W`y$&omw59OX!2(=X(lQ+ARAD?U7gcq1V5{OM^?{l|z;F_apHi5W9asao?c0u~1fnM0ev%d;Yg5uKvK0 z_>WZSoipuqnbtsi%eU?+lcq!L4iZ~OO{wph*pv$5sBzwBN8<1KaedBA`>Su=tJ89k zsTVb6YN5TX9lC?K|E@qS-I;~<#&-9(bN;>XNW3peG*MHcNz@kVt(_hWv>R|LfooOh z^{quO`*67jyu<2@Pb7{&&B}nn{vO;UBF(*}(2lpe=S&JMJ`z8X+W9^!PB1+wC0kYD z885!%q}&aK_BG$Rr>+=%9vk*9$`nc3Xl-_HO}@jGjSTI`u*=&S|0Ay5*CD;Y>)Yr$ z)9ZIVlIr!%@utj6Lp=*nPaI?5pC2Zii)RY>nMD``@-w`?J6*HwZ@b(Xo0GW>D%2n)(e{|$)h@_{`gX>> zm`2>+kpB&`pZdj}>Y3w>C8Nk^zjqG^7pIZBPKa)Wx)*Tmeq$!o#gY@%Wq`M$37vQ= zA&P6*KIpnG)tfRSO%27z!$^w^?TnA3G{*uLn08a%{+K6fkdB*4PG77o;>YBxD$zmr zAd$@DUV_54f_czhoCZs#kb*@}5QEJ5xK<0u#FSz>x&iq|59^G-NP}VQO#7W5+!^*W z|8Y+oo8AMn6qGE&tq{s|=*{e zDZN90`4c+hF63~p2-;`-gy*K`y7e%!um8#2a|(4y-XcsJlr0oQ-5a}g9a*jwGW(}= z#=nOR+~q<0w(s3T?Du|hkDrnaJ9nbxI`=BdUEeJ?%^M|pD=e^(n_IHu)eVBA8w1S&-ZQZ`B|w1-TEN*%`l=WUB19e{c`A zT|c`sC(T7dEskREgOK|Y%6z;>Fe9k7NH1B~8UGJuoFBB$`q_QT!WRJlh)lVZX#{18 zS{pr^t*v_XF&xDc>?@5I{ zdWJpd7xzh-0pxrEr%ru1Qx@Vvu*UQ3i+*vB?M>%-xurNjz|eA!JHxhraTlCNhj@?S zq}fd!-vhT8-g-~sIP*ivK`03=>x^GYiuH6c#~W}h!HkQUwjfPW^Gl#-7i7}Nng2H3 zo^-^0%J^EqOsDz3MFYJx-I^aj#to=$$wl^EN8CBR+aW&`$5~yZ0vZ9SM>Bti|ZY$>`yw~!&51( z5ubPJ&m+TaxZbrYaXQ6nUFP-8#*|0XZAw2Zc}UO3wP`-mmw0_=ae5ZgoBu!QMMyvJ zf25->JrteRA6jK^?m|UtaD8}{{dAXmeD4&PrvJq#nAX%^V>{jM_S-#Lr)9Hoh2bZ#2}gIWqxv|uS7%SFHz zt+yYFy9bWkf$I*W@26T6dMlFGV1~phN*+Lm!h1H@AH-qw7_JMi!B5t?2YNbjU46~H znbvTRe<12sdGB;9C%g!kzH2+doctu0 z3l>EF@tm7j5m*^mFWfBZK(Gw36fm(h6<~|N$U!KO+$OMyV6|Yoz!D4I1y%><);ZxM zh#SFng3*1CTJH^9Xa76N>g|aEAHL2$nq-ajq@%AZtL#sbus066Ecf(mfVN+C#+R@j zKjLciWiA@J9oO!U^LX^S*1-u%($4p$kR#F)ulgJ8n_N&@gKKxhej3*&@42-dDA0_M4a1j!{gtMtf;>Ad*%~pj4De|zfjb}oh!JCM5RhL52E+QB?6Z@t zfu6azF1p!XlWdJ2UWMz=kOxZ!!|y zs{Cm1`Yp#jAqbWSwrh)huG^aKsls*jZT5DzmFd}m>&mV6D{gCvrxVv1HFlV4>j_UAG>Ab4QPXq0e65`-_;pkOdQ+&3(%cdg|yBFq%|WA zOPmh5_`g3I&;<4-T-N zjxhh>?t8|3uskrVr8v{+5-Heh}&Hzr`N@c>3wb(^0;AIBNJz zXZ+>k1w5FXpkOr8Tb}ET|4fc(3ivp&0)#1b#F=#XeH8P zNFRIxKH$FV4j1;NwvNYJUkHK7{MG zzrxZ~J_1=Plw>Cn33H7nam9;@MdgGF7$>lp=8X|JMLL&rQY&lZ-r}}x4gg` zQsl3l$a@%mOciwh1$n)pjkurH=Nc_2>@f5`N+s#7)#cudIbQ!PZ#Zj~H*lfXcfB`- z+@u47Rd_bClmwS}{g=Q^;I*n0-MkN+-gk0eZ7R0ag^F!X#+|@MHYQ>xcL)0+YH zxF;w!_mDNnw;7cxh7R|6RH=$%gOe&<9`<9`asb^&b8s>47OwQBoaOcFLYt8}h6gls zEaV=A%-9go9XQ=W(rBEO=30qpZd#f42q-Y!vd51u_(!L{t06`W$Ury002U-&pJD}p zt55^%x}KJQMhQ}VsHVOT+JjWsj&~l~wiQUjoGQG z*6iN&Tr>C6&iF4h+=D0C%Tld^+2kc5%mM2t^8iwgEj?=|o2!wq?ZM9YG`e2o^`8U9 zH06ho?+|z^uHB#8U!+w*8|#~)XC(bE1@Uy`SE$A1gw$z6YOnFT%nl;AT-w#)VrVFS?zqPlgS()B^uvmL%{5oPS_G@X@^hwoVF< zd>HWnO8F-Q+~-q<3UdQ)}Qb&5S&5~|LUM)KiD2z zyMMHEdRf!P9|H5CA_Iu+#kL9)JZUV)=aiA?tPa>6`vmt>_8q;frM)+RJ%oB(L-Ok; z*++U=gFTBdq+(rmrq^21yAuM@qn+_LXqHc&WDNQnuQhc_XcXS?Kvp_=bDuy(MO}%T zW$IFT`rDS?6~CI)yC>Ocy{!@BUjY0Pb<|^op6O8?VXPp8T97srj{=j(y3O{vy{&1z z>Ctc-7=7>0y)DOn07}AzfIE*_oRpZY0CZ^Q7z&Rm#j``~ZFKPA{{YxZFqEMK4M=*9 z909um*X{uH;M~@=+??0cA?+a2U{mGJKw7caw-C-+LPhLDVh0j)srf3$KFep#@@Bwt z9k7XR+MD)6K5L*iAFQ!YSNvJ3{xkM#J}YNJCD><>({8AcA>m4cbY8p+a2S|0|3Dji724wUH|&=tQC>$`IAfCG>*p@|Y3 zkhlqnBXI5BgfuoLttI=BR*SUZWXrYL_62>d1ygcioQE)A(K_Y!BLht%`X=9uk(J=3 zkjWi{C&`r2oo)Z4uXX<9M!-B|)Sd9s1Z3=ftVlLH2$_t*UGaHj^ip7q8YggEDLNNuBr1cN9U6)y%iP$ zUqu`NRaA9gdq&!q53t7O?8mhl)zxh?-v-u+Jg#KQ0T;l(POy$K_G<&I;_zJfV#A4M zN}zP|jS$#qJf|OtHYglBCub&U_rnUWs*sk4XZ2_WFXaod`prtC<%rVh<$)rk!~C4S z6zK(Nbj(0)+k^B{q?0U`vEF(oh_S2oBOx@--agP8IldFu)f2kn?~~A(-oQ0bF(Yj) z{x3{(U4;LE{g?m>v+XYiS~D`saXmDrEB*{s7=e7T3anw0J!6n{QRYEh*W>yB>pgU` zt|+~=u(rhh{U9qdGXv9Q6`teIHpzO$&IW5(V1GZznw+^3*A@8XnX5Rx2yrFYfphKY z8MtBChwI1{_N^JXyK2Yv;VbNyGOXfEdhy}#HC^#b67nqqE2*?I2P0n;*M-;F7Z0{h zO^f0Bg{rRjz#)nbe@5DG4Yp43&?^$vw*CEJYnrDV*IR4toJ?HPCcyuoy(ZI|J+d9w zqwx&>6)NRwoLQ}hp^DP|+9zMhxKE4Xq9ecXs%gADd$TJ6d zW~RA5))7q@SZ5%U`+NK1A=arqW4PYX*cHFlPCC)burExr((Si~SSO@qPk|5a?TXLr zrOaY9Xs9(Nt%~T|m|ox z>@<4OqYZBtTta^-M)M{409OQ6$9*7hQqJ{Y=ib^*gp=p zF8A!jwSStu<^*f(i7mKxpL{g_D2*d}Qc;B36{e{wd_07-TKqACuTyntIO09QT9UT* zWV8xDJe<@+(}DIpzcs-_FHSa}W#8bpE>EM^MJm@Ejo0<&e0@h)Gd%ZzHePEl!FAdJ zT$keI1iZ#&tox@C)|ip>a%J^{NAf(33Y}!;iuh4!lM?Qiv8l}cIGJZKU^QgPmqkV7J52x-TamP`%zZ$xkY#@B)$D;x5o(d z21yE-g+eI!@UH^Q4aUPtvrS+MYyb%%(1cT~_1Q~DTg9F>T<3phKRwzy)sqD`oBO@} z4PBSxy6iu8&KSrv;Cky}`;#%&APbkiAMEX8aPOXRI)>a2_6=ijra&*CgnqPtAzq2= z?4RuEV{sqfitD+*7@5PkZu!N2Wh`X!rekh8VjmrgX45+<(N4SgL@USBfa|SY_6;Xm zlY6$~dXXz0pK5FK+a>&7>DD$dR*t?9qr?CS3qu78r7khwrjjKK5Z>hn^N#nOp>DA#1MPocx!mi zdeD768`pt!`DT>=0O1|9Bk3LkE&mGtu{8dfmcDV*SA?!2U?- z2*k3$vIoTDag2lKt_q_CMb6y%fwxvuJNWTZ^tI1#p z#OPh5_JMdWg&D0gwP2lt?4{Y(?979>4vvf;JHDj!4zRM>_zExX|F*(-KBRw*UUlE! z*Gw5xCR$_0$B?rA6uke99PT^%V(Zefy)RH7Qnmx_XOVP<*|o)se2g=n2`!Q!P9MYDvXq zcw3rP-%B;5;riz^tG1VlrsML{bgQ+OisOX||2N6_UD|lkz*WF6Bw1Z<_4lND7hYm_ zTR*rd#XV$H`e95OFlgx~+$L)rHGW7hbkd(c}+}CP#kMmZTACxT@`GZSJqO zq*{mjsk$`l#{O7!te^X-x4pQwCr!0}Wj`_1nw;?&%KSRn+SfyuIm{GgJ)CSGo@y1% zZ0>`XN~}G7)ElnSu0CpSven*4-R8DF>7$J**G=sGoXRc=WM3l_VcZEBy-p zr(0k2!9Ab#gB_k`y%v5nX*5(9S$`X(_ECH4To&%hzH(VV4N`wgw*D~4SpF@`dS;ON z)`CQh$NI-0wW$X#-|S)884AZ)?+j9Jk)?N}THg**?~AB5ychc_9PPIDSyJKfqK`UHwBL)D1FQOw=!m*#Zp>W@| zP>tYoC+XPFag^f_$BmXr*FyNOjq@o^FX6bw#9_Q7!U{dzGpfr>f$hnL2U)I>NcC#`yv)SI=<;$01$O3!QpmlI4sgi%fwP9EUiLa9qRjoO-vh#6oy5Li+*}H*y?Z z?|S~EDT|ZCk@tA zwo+x^_G$wMJ7VSbm-DO>@Z&D2n8uRU?Y{MFYgv-(G7DJ-yi{ThPIg_XukFA&R>ak~ z(0=Y5E5{YN(f*9$;7xYlMb?@4(U~QStjApVU0T;-YuXHYO^Cu9h+WF78qPPL^&)}G zFPOWQbmx6Aw~+i?{Oy>_ zy*=VwYtZCFOHDGpgh1g(PR?3xK1Y~OfD2N#x)t`CbFr_8&}}yYy#zqvPEMb`(tO57 zT!+`0uV>CKr~J65CVf}0>Mmcz{0ZiNU_DPVUvser6BIoVrr^RlM~Xtc;$yFaS3rJ_V%oMJO;O8^HN$_pV?^um*hFg=uSEGRlTpLBN!z8I; zD##pl)8RAD*39ZmE~QTC$?}zk!2CLtfK#*HV|jXdLtz(lXL7P@OD+FNnW;wlh0Bc8 z7!#?}nE#!*<73y`50_el!nbhp=*x|~<4TV)pUZq5tNSzaJwpB)<_DS6fi8v7xN~!> z@8agu@&6}-qj6ysyu!c@oOYf`P%kidDpbk*0P}yc{BM~zt~bEhq0;*=WW5iV(^)Eo zq3CtuXJ1L5uz#bIQVNSX;i9X|=VBA7YUaC`I~BrTt|9}zi{vD1+v<2a!ABiF;%xhc zx}n(4Q~ATMHgb--)0xi}{Cwt@3w|9q3~S%A#OiZ*EX5tBN~nJs=W&J}eanq_Q1I=n z^gdSVI17FIjViZ?xnqMQuhG-OjdX5f(!fdHa}7T=cUm)(Gc*dT%;O9>+#Qa5g!#FG z|Cad;%<0UHf(JW5D)^g9^Z7*8!(5EA_m)|MPMW~!1FtohHoO!rVD7!ne5P$Gg{aOJ z-o?rF5lxT%_cZgE;Cq?-Z#*WdFa8EjQ$YJwW=K0z!#_12q%z74cXFko>(HF>szN9l zh=e3H5C??aGfcJnEVTwD1x-|JqVseVUTT!7mX}Sj`k^XHTF<WyuAiNPKh0dx8`KE;nJMDe3=b>yj!7uc$=EO=fviz;hiL@nK^@*@UM={) zm~Ue4Oo*M#D}{Uq^N8js-^q}S4dMTqeA539o(WD~rHaj*u!<{s3iAr)moUGGd5pO( z7v-xPIH8>roMYEVoC3}^1tjs@^B3m$oqMgChoAZf^BU&*C>9dQxOJn7I=id!T%kI1pIK24k1VWdc$Ws zukTcILOUmX$xgA0c`RZw@bs)cU>>^B@Gmk=0rZj)S+rz_;ddLXPVH}aJM*)#JE5>T z%n8BYm<*1yY+_!|{B)D7UUd{bY5?7KQaHpsT4w-GgmvgQfcyS+!}Hk^XD|=zZ6!qa za*J1RLd%~`26}^o!hPVhI6V7rBk0U9yO`H8$96-9KeHbHzl@$&nE#u3%htCM`zYme1 zm&312%g}{7WDYVF3UrwaIG5I8IylMuSw3R0TFg9p$mpqJewiaL_-5i^D2fV2J2*p( zP3q?s;1*XG+~{yFU_UrnE;`8U`95Y#;PzbeNT%U$GS9?2@z1lMkiJI!EYOQCeT9jBmaz4nsRPg7Fo)xNQxKT8n6@AAAw2UzP z4la3`pDLQ6f~$=OVg&230Q`S#mM#EK!f&tS7TDKaVvU`%8lM$@n`QJjtdKq;RQXA6 zunO_Xk%sv1X3dAFwsp>!HYpF-%ge1ntDZt~AJ{GLCX?(8fOo)0&;-KgH*-xcb;1ZE z-@Q~(rea5^#(w!f% z7p#T{ju>U?RVlKa0*>;P|1neWyQUfHa+Yrq>NbN@y8{DVTJjf`e}s8ShtV^b+wnWi z)!n0#`-Hz^o#oeduVU(GQ@1+7M=&qh(p`QYIMtzjhFh1u)u}Vfr)=&nzt!-ts^8c> z;W5sTB|808a4I0en~&*Sz}qYzyrH|EFPL`-<62{kp3qn~G=%YUIIL(e63DL`MTKTC zue+^#0n1rYY$hpEN_4+kGzABi8w)u%J^A3IUv0Hu{{%(zI794vQ`2j8DxPI2VEh|NJy`zXAjlat=nQTPW|9^ixRMlGY%$>U7!2)i3+R_B7#WEkSr!O!y5 z;8dA5VS@*mcL?`vFnR{68ZoQ(M7Npw_)J`p%DU^jw{JN~pkdLMO}FV?J*x2(%eUR! zUH%Q`S;DaoupZw{MvwVlsc((^Y!wvq?on1$Cq~W?+(lDGV`A(Fz;#pRUCt6g;Zb4c zDPnBhLpjmJmhr}wBV4zK9gX34IA@V4^LvMH>TZPOY@@Mcwb8hbrUQgA%v-#sh?|X1 zssiT0dkv>=bWm7kIG#jpFbPG5EBd(@GD4nM^?qU=5Jsc78%e%Z$Y(Ow-!q2p6xKf# z9A^a_?58WN)WJ7{VNa^cc+cacZnYn-!0Fe=If^?iZf3jCqzY z=GDwgs=6Eb7I5meiUMOrdX136lSV$Q{Gzdqtf*0}ChszD7eo7B%!8rB6rvNdp_MBoW8Wl^* zC~z}VU&9imiEV_&dzrV0&U=P=z3}HZ9gX3SSt5gP{G17`gL$d2@{n9p$2MVvty`4x zW3uy!$!;Rcw~Mu<030_+GmbsTo~KQNdv?xHB6{l?=034b{>d)58n+K$aB_p_w4PIq zyGJIQIfP!Vr!Whg+#NqiuRlBOE@NIU#^qI-`>_2oa|q8QihhL)eT;F&`=uMTI=s5U zit2=-7n!#R!?rMQ75qy_k1${yoV+)(ni`O1<}WIHp1t=PYtWp~G}G{kD~gt5u$1+!HI@ z67Y_@Y2R7gz9(5xidcm9It7Tq^&#^%VfPMjx`Q`wcwioZgXs{!9X1&-Dr$Nr^GdNy zhnTmB5pxANtqeY189c22C6-S~)Kh}Q_mDu-NhA9(effjJH=LnfbWM*_jJ(P*&brNr zt6{|HOkrvsuBa&?(Uh||XZ;x_X9nk7?&J*Lz!E{>U2n5Szp(ztEFU_@XgrNI((8*< zgK{wp`<`m*-opB^P1E5PaL9*MhPdsoGYRv#tl zXRdf>X;Sgv9W@@wd6l|*d~&LFGLW%jF|Mc;O^ICw;R{FtJ!aOz<4fT>CujI3&RHj_ z{UGz0u*+`d4PvK5KZQpnMcH1sf6-xlzTpvlgHOL;V8U78aK5l=S#0dGkDY1f>BcK# zj~nnVXZSlfHBrfR0-Opi;rDOoTQd~0a3n$U8KR=}n|dT4D z`|ncb@35jQu^t>`UMl#HTtFl5?XdOI;j}YMg(?&0QL4iNd)u$DfUM&57BOMn0IvJ+ z5o3^}+(3Fyns^JBgWZP?&ocKtY~*{gVgChA^NI6jm@{8Z3+j3eR83-`C_#eRLtaK# zD5`=VmeDVi&(9i=Xxz#k{ zLah$BS)8FkjPfw^mFy(W;JMogzp1L5`X~3sC z70>oqPm}0^cIJ)3`%-42{WOk3V)Yn|1UB+vM9aQrUN5$+sfDHi5z%Esz^MU&DaL!Y>0?3E zYO<3-%>2ciAu`Tnn9mhj&b)*NsI$Ia&pdj!5nRCXzXd0Ywh0TpYLB?l8Z~n zZK4rusKcDCU38E&%cx5ct~VCk4C@k>C>0G_=j0T=u$g&O_+XSY!eTyNvPN^wzF=M> zPNH&W>zd(kOPGE(5_Hw(Jzzvsjp)qhnYRcVHBnA-_guFwoW24{;eAJA_zPU=-44G$ z$pR|xOk<{2F^!)CP8utC;j)ZEwSwebLsf>j&!}KM^tI>m_b?#^SwI~YDAVIG; z{F1XXe}B!2Dn)%hq`W5P`unYReby~{i!(Gn}6tc??DM9Y2#*QVxK9%mgoq|ISI$8@Um zbapiJ#(=4)^Q`g=`_oOh@i-UBR9~N1P1Z0EihI->nP-Sa;C`(x{5dD5h>ge3;8bgs zVLFt)fleVCGZ=AsemxVMsudB-?8V@8ALYEM?d)|QGJ3))#2wzx=vR%b$e*}IAnkqT zF)=*9WS$}9kD3BhO_6CpZ}yLY*cnhov$Q-MCxr{1gam3?OP7)SCD|m*;|!%@u+mTD zl6>@jBmXKFa4*ZZh~fVn^HAb_1TB6|oX{>dqn|Qw6D{jv9uxbL{&TrP1;(Maa>KI0 zwZ{n0I15}aeo>KdA!jHNeMvv^ONxpTTYy3$%v(j*{2H7rRMBc`!UI4($vpND-iM*U zmQ$~>qH;0+wKA_3Hvr!=uNPgDg3}JFXos+9CU{>{7yh4~$;>;I#p}e7n#VjO+I0zY zpXh)vsn<`F?`4T1QQ;SuXNXm+8JuQI=bIX-T)pvUb3=p+1erIAyXuADuy|ON@OjJ# zRG5Gn|vyXXdkfEU`j<6n+UOVJg&_GEC9H{YpRcYKbz4GA>2 zWQqO46U+mmWq)Qx&Uc}l8}GbxjGiK4xpRn6zVdZ=yijAh`BjJDT`fg`M)uMYJ zB}HhWf1z2ja9pLs>�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 delta 113221 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 U>*<#N-5*RX-R|E1cmL4;4<8PDF#rGn diff --git a/examples/cornell_box.cpp b/examples/cornell_box.cpp index de2b731..4e2ec8f 100644 --- a/examples/cornell_box.cpp +++ b/examples/cornell_box.cpp @@ -445,7 +445,7 @@ int main() { config.samples_per_pixel_ = 1; config.max_ray_depth_ = 4; config.enable_accumulation_ = true; - config.enable_denoising_ = false; + config.enable_denoising_ = true; g_renderer = std::make_unique(config); if (!g_renderer->initialize()) { diff --git a/include/core/denoiser.h b/include/core/denoiser.h new file mode 100644 index 0000000..50ad16b --- /dev/null +++ b/include/core/denoiser.h @@ -0,0 +1,69 @@ +#ifndef ARE_INCLUDE_CORE_DENOISER_H +#define ARE_INCLUDE_CORE_DENOISER_H + +#include "basic/types.h" +#include "resource/shader.h" +#include + +namespace are { + +/** + * @brief Mean filter denoiser using compute shader + */ +class Denoiser { +public: + /** + * @brief Construct denoiser + * @param width Output width + * @param height Output height + */ + Denoiser(uint width, uint height); + + /** + * @brief Destroy denoiser + */ + ~Denoiser(); + + /** + * @brief Initialize GPU resources + * @param shader Denoise compute shader (managed by ShaderManager) + * @return True on success + */ + bool initialize(const std::shared_ptr& shader); + + /** + * @brief Release GPU resources + */ + void release(); + + /** + * @brief Resize internal targets + * @param width New width + * @param height New height + */ + void resize(uint width, uint height); + + /** + * @brief Apply mean filter + * @param input_texture RGBA32F input texture + * @param radius Filter radius (1 => 3x3) + * @return Output texture handle (internal) + */ + TextureHandle denoise(TextureHandle input_texture, int radius); + +private: + uint width_; + uint height_; + std::shared_ptr shader_; + TextureHandle output_texture_; + bool initialized_; + + /** + * @brief Create output texture + */ + void create_output_texture_(); +}; + +} // namespace are + +#endif // ARE_INCLUDE_CORE_DENOISER_H diff --git a/include/core/renderer.h b/include/core/renderer.h index b0b29b6..f051a01 100644 --- a/include/core/renderer.h +++ b/include/core/renderer.h @@ -6,6 +6,7 @@ #include "core/gbuffer.h" #include "core/raytracer.h" #include "core/screen_blit.h" +#include "core/denoiser.h" #include "core/shader_manager.h" #include @@ -66,6 +67,7 @@ private: std::unique_ptr raytracer_; std::unique_ptr shader_manager_; std::unique_ptr screen_blit_; + std::unique_ptr denoiser_; bool initialized_; uint frame_count_; diff --git a/include/core/shader_manager.h b/include/core/shader_manager.h index c48665a..2d8a19c 100644 --- a/include/core/shader_manager.h +++ b/include/core/shader_manager.h @@ -54,10 +54,15 @@ public: /// @return Ray tracing shader const std::shared_ptr& get_raytracing_shader() const { return raytracing_shader_; } + /// @brief Get mean denoise compute shader + /// @return Denoise shader (nullptr if not loaded) + const std::shared_ptr& get_denoise_shader() const { return denoise_shader_; } + private: std::unordered_map> shader_cache_; std::shared_ptr gbuffer_shader_; std::shared_ptr raytracing_shader_; + std::shared_ptr denoise_shader_; bool initialized_; diff --git a/shaders/denoiser.comp b/shaders/denoiser.comp new file mode 100644 index 0000000..5cf4d29 --- /dev/null +++ b/shaders/denoiser.comp @@ -0,0 +1,28 @@ +#version 430 core + +layout(local_size_x = 16, local_size_y = 16) in; + +layout(binding = 0, rgba32f) uniform readonly image2D u_input; +layout(binding = 1, rgba32f) uniform writeonly image2D u_output; + +uniform int u_radius; // 1 => 3x3, 2 => 5x5 + +void main() { + ivec2 p = ivec2(gl_GlobalInvocationID.xy); + ivec2 size = imageSize(u_output); + if (p.x >= size.x || p.y >= size.y) return; + + vec3 sum = vec3(0.0); + int count = 0; + + for (int dy = -u_radius; dy <= u_radius; ++dy) { + for (int dx = -u_radius; dx <= u_radius; ++dx) { + ivec2 q = clamp(p + ivec2(dx, dy), ivec2(0), size - ivec2(1)); + sum += imageLoad(u_input, q).rgb; + count += 1; + } + } + + vec3 out_color = sum / float(count); + imageStore(u_output, p, vec4(out_color, 1.0)); +} diff --git a/src/core/denoiser.cpp b/src/core/denoiser.cpp new file mode 100644 index 0000000..d96326d --- /dev/null +++ b/src/core/denoiser.cpp @@ -0,0 +1,93 @@ +#include "core/denoiser.h" +#include "basic/constants.h" +#include "utils/logger.h" +#include + +namespace are { + +Denoiser::Denoiser(uint width, uint height) + : width_(width) + , height_(height) + , output_texture_(INVALID_HANDLE) + , initialized_(false) { +} + +Denoiser::~Denoiser() { + release(); +} + +bool Denoiser::initialize(const std::shared_ptr& shader) { + if (initialized_) return true; + + if (!shader || !shader->is_valid()) { + Logger::error("Invalid denoise shader"); + return false; + } + + shader_ = shader; + create_output_texture_(); + + initialized_ = true; + Logger::info("Denoiser initialized"); + return true; +} + +void Denoiser::release() { + if (!initialized_) return; + + shader_.reset(); + + if (output_texture_ != INVALID_HANDLE) { + glDeleteTextures(1, &output_texture_); + output_texture_ = INVALID_HANDLE; + } + + initialized_ = false; +} + +void Denoiser::resize(uint width, uint height) { + if (width == width_ && height == height_) return; + width_ = width; + height_ = height; + + if (!initialized_) return; + + if (output_texture_ != INVALID_HANDLE) { + glDeleteTextures(1, &output_texture_); + output_texture_ = INVALID_HANDLE; + } + create_output_texture_(); +} + +TextureHandle Denoiser::denoise(TextureHandle input_texture, int radius) { + if (!initialized_) return input_texture; + + radius = (radius < 0) ? 0 : radius; + + shader_->use(); + + glBindImageTexture(0, input_texture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA32F); + glBindImageTexture(1, output_texture_, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F); + + shader_->set_int("u_radius", radius); + + uint groups_x = (width_ + COMPUTE_GROUP_SIZE_X - 1) / COMPUTE_GROUP_SIZE_X; + uint groups_y = (height_ + COMPUTE_GROUP_SIZE_Y - 1) / COMPUTE_GROUP_SIZE_Y; + glDispatchCompute(groups_x, groups_y, 1); + + glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); + + return output_texture_; +} + +void Denoiser::create_output_texture_() { + glGenTextures(1, &output_texture_); + glBindTexture(GL_TEXTURE_2D, output_texture_); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width_, height_, 0, GL_RGBA, GL_FLOAT, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +} + +} // namespace are diff --git a/src/core/renderer.cpp b/src/core/renderer.cpp index bb1d2ec..a5fa922 100644 --- a/src/core/renderer.cpp +++ b/src/core/renderer.cpp @@ -66,6 +66,13 @@ bool Renderer::initialize() { Logger::error("Failed to initialize screen blit"); return false; } + + denoiser_ = std::make_unique(config_.width_, config_.height_); + const auto& denoise_shader = shader_manager_->get_denoise_shader(); + if (!denoiser_->initialize(denoise_shader)) { + Logger::error("Failed to initialize denoiser"); + return false; + } initialized_ = true; Logger::info("Aurora Rendering Engine initialized successfully"); @@ -98,6 +105,11 @@ void Renderer::shutdown() { shader_manager_.reset(); } + if (denoiser_) { + denoiser_->release(); + denoiser_.reset(); + } + initialized_ = false; Logger::info("Aurora Rendering Engine shut down"); } @@ -148,11 +160,18 @@ RenderStats Renderer::render(const Scene& scene, TextureHandle output_texture) { auto raytrace_end = std::chrono::high_resolution_clock::now(); stats.raytrace_time_ms_ = std::chrono::duration(raytrace_end - raytrace_start).count(); - // Phase 3: Blit to screen if output is default framebuffer - if (created_temp_texture && output_texture == 0) { - screen_blit_->blit_fullscreen(rt_output); - glDeleteTextures(1, &rt_output); - } + // Phase 3: Denoise texture + TextureHandle final_output = rt_output; + + if (config_.enable_denoising_ && denoiser_) { + final_output = denoiser_->denoise(rt_output, 1); // radius=1 => 3x3 mean + } + + // Phase 4: Blit to screen if output is default framebuffer + if (created_temp_texture && output_texture == 0) { + screen_blit_->blit_fullscreen(final_output); + glDeleteTextures(1, &rt_output); + } // Calculate total frame time auto end_time = std::chrono::high_resolution_clock::now(); @@ -182,6 +201,7 @@ void Renderer::resize(uint width, uint height) { if (initialized_) { gbuffer_->resize(width, height); raytracer_->resize(width, height); + denoiser_->resize(width, height); Logger::info("Renderer resized to " + std::to_string(width) + "x" + std::to_string(height)); } diff --git a/src/core/shader_manager.cpp b/src/core/shader_manager.cpp index 6c9c48f..f18c0d9 100644 --- a/src/core/shader_manager.cpp +++ b/src/core/shader_manager.cpp @@ -39,6 +39,7 @@ void ShaderManager::release() { gbuffer_shader_.reset(); raytracing_shader_.reset(); + denoise_shader_.reset(); initialized_ = false; Logger::info("ShaderManager released"); @@ -108,6 +109,15 @@ bool ShaderManager::load_builtin_shaders_() { shader_cache_["raytracing"] = raytracing_shader_; Logger::info("Ray tracing shader loaded successfully"); + Logger::info("Loading denoise compute shader..."); + denoise_shader_ = std::make_shared(); + if (!denoise_shader_->load_compute("shaders/denoiser.comp")) { + Logger::error("Failed to load denoise shader"); + return false; + } + shader_cache_["denoise"] = denoise_shader_; + Logger::info("Denoise shader loaded successfully"); + return true; }