From ed919edb0ac5c8eebd77d58176920a5e07d7bf24 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 22:00:03 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20enable=20back-face=20culling=20=E2=80=94?= =?UTF-8?q?=20removes=20self-shadowing=20artifacts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: CULL_MODE_NONE in both main and shadow pipelines caused back faces to render, creating self-shadowing acne on all objects: - Shadow map: back faces written at closer depth → false shadows on front - Main render: back faces visible through objects → wrong lighting Fix: - Main pipeline: CULL_MODE_BACK (was None) — only front faces render - Shadow pipeline: CULL_MODE_BACK (was None) — only front faces cast shadows - Removed normal flip hack (if dot(N,V) < 0 N = -N) — no longer needed with proper culling + correct CCW winding in cube.obj - This is the standard approach: correct geometry + back-face culling --- .../Shaders/triangle.frag | 3 --- .../Shaders/triangle.frag.spv | Bin 13640 -> 13472 bytes src/Engine.Graphics.Vulkan/VulkanPipeline.cs | 2 +- src/Engine.Graphics.Vulkan/VulkanShadowMap.cs | 2 +- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag index ed0214b..c80b732 100644 --- a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag +++ b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag @@ -138,9 +138,6 @@ void main() float dist = length(toLight); vec3 L = toLight / max(dist, 0.001); - // Flip normal to face camera — fixes cubes with bad winding without breaking spheres - if (dot(N, V) < 0.0) N = -N; - float attenuation = pow(clamp(1.0 - dist / max(lightRange, 0.001), 0.0, 1.0), 2.0); vec3 radiance = lightColor * lightIntensity * attenuation; diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag.spv b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag.spv index f615ce72c89730c1d0135a90293100ff4d0addb3..5751d5be87d3802dabf8eff71a86b949c4793a95 100644 GIT binary patch delta 3413 zcmZ9OS!`8R6o&Wh9a>6@l-pV;(v~zPCK_wviw(5ah;2;_Lhx0So3=uwQ#!zd4@aXW zCMG20))}>k^MKZ>6cEKIia21MkV!>FP!OEzfaCw2yBD6eIlJfo|F!m7d#|(Cxo78f z!yU!(yqbLHVs5%CaP!v|FN@6{$y}L=4P{4C>0n*VxxP$WN2a^A-RUps67E51{VOtU zJ*#tkgLrSIFVp4i4^QEbPT`MF;&JzscuP1p?nZ>0E+B5)jm2D}TfC?#OuBi}q=ef# zg>Re0<8Hfnvvb+z{0qwy?#(IIUE)pIk^HhC;ohHQOS%umy9c}4`!WMPec`f_Zm+bq z_U@jpj_y!RYE4I^_4l^74t8d63zvLc+R9})d;+{ESE32w#ce$USNM3R#5+5duNY|T z=w6Eif= ze!81qsc`L*%;IP>WN26uh&?k zukkj{9K0^@<#|%1R;wo&L79vb3*dlbw?Iz|uZ-}G!UVq2SKt|8e9((je5&%Sur7C* z26p0d&;tw>_<7-8&nfK-!h;%1e2^D~(QNQ+3BF01E_c2LuOs5%OA>x&uv?BT!d9Wp zF?WqaFyl+Ytcr;=85|pnd0DvM+xQ8B*C{==SA=Kiu7Ke@?8F$$UR_ZeP%GGLy1%Yr z+1?Pg2SVe*E!$3E%SIE!>-@8NOPEvos_w*OESa6mX(frH}vHPEdBp9$*< zD}bE}*rGlc-=~3(#r#4zn&Xf-kCrNjuedKoaKd0oz7p0ICcz#}^0hdL@S(3bW#0&+ zAJ$-}dv!;%MI04o_i+5b6_!tMx_`ctfM|nvDE)Ix8k4aT_=xUk7WjK%N{;Qg?r^jH zAdJSlmsmdvpVUClEkw`%Cy_x7dqMv!%nKUbp5rgVOvXl{6S|{WqF;rhCH_s^O3ZG5 z7sm(PD*T5q=PxWV4tA0!gfUw1KZQwX{4e2N4W2o>`db(ubbA~9Bg|Kx4XftA((%Vm zynq0FTToVeN5;f)M7N}Q!t112(zrN&==iY9gfNS@swKtoLpPt4Fz;;d6S#Z{IAWl* zr({I4#6`l<-4=`U;e~EKGlZFE8#qH8KXhX9NsDIwCBkS8E{KQUw+MBRUtg*D*fZn#JPwX1T^g|ui?5x aDfwiaCqe-Hv2$Qa$|vN!(edilrT+o-ABXw? delta 3527 zcmZ9OTWl3o6o&Wo^ppYxDW_U2+7>HVq7jTQHd3OIn~6aPPduKq1uCVjrG*C{MuR3K zCM0I?j!Ff@3yQT>C`H8>6hTD1fdVRCQAE6OSJeNTvzJVJGOP3d|5|&kz1QqLoz;yy z?iiNJs~Y57;D)+FH~xWPbArmQ?Ck}?s;H|V6Rr)MYs=O*W}E98oPKGS@1B>octN(l zWoeGTAl{m7%P#W%7YFc-19(?Io^n0nGvcu+*DE}2B6(A8TcBbyr%a2M4Z1!|xgBy% z_a)xzmm=To8o+lC;CuS110n$NYbpD*9-@5j^bfOvD*v8bUf+uqU^4@$ek66+h9 zTNX7o$7)(LJ}zx>YeQW}Q_JpFU$lD z3@Fce)XJ12jK~>EZbQ;BS0bN6d&7+wpjCqnSU;+v9qRx`i z!PdM{-CZT?^FjhvDsY~xR(*v(D7;X%Qk$I(^blBvzFAtYw1nH5>%{bkaKC78*xJMq~{ z*9nK7llK|nyJRa=oGz~yUPk~9Tj8_9B(k9Agb75a2wNV_ifj;W@;LqoSk51Q%k!!*`^flf!sNZj zcVJVXZ9ou?A~m13Y!=q#rpgo$C+^W5-4bmTZuOkjzAoG$o8@!7A&h3mqb2v7(sa3N zWqkr$gQ3n5%&hksJyEtSGnb_ANMG!Iyb<6vextoBJX|qv>HfA1KRLGPj?X5# zQ_oDYld;55gZCDG ztMRe0S{eQ?d?JAdWC#6IVS>CydXMe=giB!?#~|c#VG^UkF!d z9Aox#<_O~bh{INSP?-K1KP1cw?(>KBOJQQrt>{<6S4ty_85W02X2Vq@t2k_GYo79iu{C_3Javl-pp&S26m`7_}4u2LQ2!|CpDy%Cm zfU#CPqgjjL*U!B8X@Q*7ujh2P=lHiUgYi-5 zlMHEz&hA6|O z@Y=P;T_iqChEC)7=tZ+CCBn(ITrAF)9lFI_BFs3OZK*JE=;Y+1S=xoy$fXhxaqHWfidG7b?H*sbwB$c^