From e36cbc7774e7694840b7a9453ffe194fa270c416 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 17:03:15 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20diffuse=20lighting=20=E2=80=94=20normal?= =?UTF-8?q?s=20passed=20to=20fragment=20shader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Vertex shader: pass normal through mat3(model) to fragment - Fragment shader: directional light (0.5, 0.8, 0.3) with 0.25 ambient + 0.75 diffuse = faces now have depth and 3D form - Torus knot has smooth normals (vn in OBJ), cubes have face normals - 0 validation errors, ~2300 FPS --- .../Shaders/triangle.frag | 8 +++++++- .../Shaders/triangle.frag.spv | Bin 500 -> 1148 bytes .../Shaders/triangle.vert | 2 ++ .../Shaders/triangle.vert.spv | Bin 1544 -> 1880 bytes 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag index 7122ce8..8d5bf0d 100644 --- a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag +++ b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag @@ -1,8 +1,14 @@ #version 450 layout(location = 0) in vec3 fragColor; +layout(location = 1) in vec3 fragNormal; layout(location = 0) out vec4 outColor; void main() { - outColor = vec4(fragColor, 1.0); + vec3 N = normalize(fragNormal); + vec3 L = normalize(vec3(0.5, 0.8, 0.3)); + float diff = max(dot(N, L), 0.0); + float ambient = 0.25; + vec3 color = fragColor * (ambient + diff * 0.75); + outColor = vec4(color, 1.0); } diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag.spv b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag.spv index 828f1e56b1fa987e9bc5cdb272d43039ab4f4c08..cb92ce1a6be7802c4e5d26af453fd45d4a691548 100644 GIT binary patch literal 1148 zcmYk4%}$e15QYcJhbUD*wD?aeYEiIpp~l46ni#{TX*6Cz5o?-In$)s~g(lh0_4vsn zBQ8WG1sbzL-U3<~^@m3~mXVuC6ImrzA5E|-RF3#TVgWmwQ{X#`uZI-;tTCAMKla9x zQU6e`Lf?pP@-M_C^ucg2K&4vO(EZW=@WatG;Tz!h_lB)f*a2v-2T?yCE7X{5p#^wXPueu3;PVm8reM24akS zm5y>(5qoSS`n|Wcon4={b9?t(*Z-Dx7h7W!F(%_Ww)vmSzPGXE8pvtMZDE_I?+cv! z-$AUc&%WMAF86gtxwmDF2iS6cncKmZbEnMhmYnbThEBf!L&SXJ_51GjY@+r3p~5rd EFKZq=mH+?% literal 500 zcmYk1y-EX75JtzWn?w`yV?aBJSO$WH20_%qB29_}pCBNLpf1Fu&$IbdHiG9|cg2O- zxpVF}^Ucj_XN`!RXhkyy@%#0o1_@X_<>~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/src/Engine.Graphics.Vulkan/Shaders/triangle.vert b/src/Engine.Graphics.Vulkan/Shaders/triangle.vert index 8cfb483..736c74d 100644 --- a/src/Engine.Graphics.Vulkan/Shaders/triangle.vert +++ b/src/Engine.Graphics.Vulkan/Shaders/triangle.vert @@ -5,6 +5,7 @@ layout(location = 1) in vec3 inColor; layout(location = 2) in vec3 inNormal; layout(location = 0) out vec3 fragColor; +layout(location = 1) out vec3 fragNormal; layout(set = 0, binding = 0) uniform CameraUBO { mat4 vp; @@ -17,4 +18,5 @@ layout(push_constant) uniform PC { void main() { gl_Position = vp * pc.model * vec4(inPosition, 1.0); fragColor = inColor; + fragNormal = mat3(pc.model) * inNormal; } diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.vert.spv b/src/Engine.Graphics.Vulkan/Shaders/triangle.vert.spv index 7107a91cdfce10518468e6a18b36ad69da9120b0..834e27ad574172770979739a41d481cb3db94d5d 100644 GIT binary patch delta 388 zcmZXQy-osA5QS%UK_G|KumZ6TH1XO3&T@b+43Tk zBz%Xk6?gMxW=>|#ox97^^;sbdZZl?XdCOWaE;KzKzf?T>{TO-ib3XZc{hrSzQ?oQ* zwEFR}=iJPOmZIDQ|6Zw5)*ysSUjE_Ad>0LjcFxqPH2Gfi^oupk@{wa_#qqhzQ}E?wv(7roiZ{(T)Z gEhBUF>JeJ-2_lGjgz7G+SNgM+!u^kuxW%#qJ3v7nJOBUy delta 60 zcmcb?*TKWf%%sfDz`)4B&A`E+Katmzk!zx}>c$)o#?2=feHb^ZFrQ##m1kgJ(AzA? NYR<^<7pT+%hyh!L3pD@$