From e37e7a4eedace91b9a7a601991c4d873fc1c236d Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 19:36:57 +0300 Subject: [PATCH] =?UTF-8?q?debug:=20fragment=20shader=20outputs=20light=20?= =?UTF-8?q?position=20as=20color=20=E2=80=94=20test=20UBO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - If objects are colored (not black/artifacts), UBO data reaches fragment shader - Also: manual float-by-float UBO packing instead of MemoryCopy - vp matrix packed as M11..M44 (row-major, no row_major in GLSL = transpose) --- .../Shaders/triangle.frag | 17 +++++--------- .../Shaders/triangle.frag.spv | Bin 2120 -> 1448 bytes src/Engine.Graphics.Vulkan/VulkanRenderer.cs | 22 ++++++------------ 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag index 1a5630e..dcc2058 100644 --- a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag +++ b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag @@ -14,16 +14,11 @@ layout(set = 0, binding = 0) uniform CameraUBO { void main() { - vec3 N = normalize(fragNormal); - vec3 toLight = pointLightPos.xyz - fragWorldPos; - float dist = length(toLight); - vec3 L = normalize(toLight); - - float NdotL = max(dot(N, L), 0.0); - float atten = 1.0 / (1.0 + dist * dist * 0.1); + // Debug: just output the light position as color + vec3 lp = pointLightPos.xyz; float intensity = pointLightPos.w; - - vec3 color = fragAlbedo * pointLightColor.xyz * NdotL * intensity * atten; - - outColor = vec4(color, 1.0); + + // Map position to visible range + vec3 debugColor = lp * 0.1 + vec3(0.5); + outColor = vec4(debugColor * fragAlbedo, 1.0); } diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.frag.spv b/src/Engine.Graphics.Vulkan/Shaders/triangle.frag.spv index 78d2883697ab207150d2d0dfbf7c7ea38b2b662d..b7116fbb54417be1e966868f6bb073c5fb4e11c4 100644 GIT binary patch literal 1448 zcmZ9LO;1x%5QYzwRuB~s`S1%{P^*Hdi5e4wh%8{yNR2VBOImA_(o5Q6;!YQC{ZX#* z|F|*ndG5U@R!=gWdEfasGjnbW<7;O^7z@*3GCT^|nG54E0j`wlz1rK_=3v;|eEj60 z5f?%s4K!vZOoa)wa@6SbblgO$$OFWLS>p9`5mtffA^ae@2s@fr#5aYnd#tY*&SCF1 zj#~Z3yH^L;C8Fg#pNJ_@QEVT_NvAigb=n_?^<)5!KJWVL+fBMjpUMSh$d30cVv^nJ z4LZZm*mBp<&DP;bJ4;D9=Soh7Ig`aX=ZAiyz0*BxH50i~I=9^Wq~C33?WFncLjHBq zKWcPC*rN~ox5xdF*@`L7=EqF;Hv1p9rh~Ij<+ua6mm{2Y&fzu&|%ztd1*0c}jSVQ|B@t)h*_H4d>aW&`SJ@>#N zeA$kE-^-kceJ}A-c4^P<)#Dw%VEpck^91E)!b)}J&E;M|2krw@AM?Tk#oMs z*PL6;`3l+^&LJ0T+`^WN_zrdz`IhJ3#WqI%4V*o#Bl4ceZD7keW907VoHN(y&>d|e T<{PiyH?%L`Uf*vjJVX8fKKfQw literal 2120 zcmZ9NSx-|@6on6zG6*t=3{KdB1BxOlAc{Z>YO7Yj7~^xb6`K?;X|E=}X^e?aKKYA$ z#{c7siR(M}Y-qSvo$i`G#D(7$>gNpM}z^(rh!X%+4>& z;nD9>-VvVx*W)^LBD>|<9)@1YS;+%QQ8Flh?7B!=O4*(Jt>CoS*0{86J+e_pTK~xN zzER%Uj2gS;dg9+NE{;mIoe#1184}(o?^YY-*Xvu-JCzZR@6$fG%VTQYk7|3d58aNM z!e*nMBilw)j~dFIa>L^J((Xjs1e21G5U#T_Y#4qKtQc4nRmvnAcqS)|t z;c^^T84~^7)v1cAd(B$>*>fH4zRq{Pg2aaza&Nx=wpxi2j+sUuME0sD(ZY zs+}3oSFvRtX^+!~^I;!@$G9nBzM|?Q2l?P~6644Vw=Lmr=0x9oh9?u~F|(sKKJ4@a zCJ&f?%swm@KC2#hW$2^QI(23wWAdkNF!qdaw@x?&d_reiz{>$MA2{L%bP~_o8`ocE z00*83eH#Z)&Qm(6g_)2OOy6)L!l!j+B-}9*@JPVKk4ndvd{z^4!5{ktoz@re)Hf~R zGd$zbmo>w;g#R2ItZ@Il^o+MB{@?|P&1g|N_mkJ|XAiCQJ`6t8Q;<%q)eB}%aEqD| zxtJFp++Q)gFLJXFe#i7*NbJE%CH|50t zyo4Bd?qm*d=6_K-9CfmrjD(!)5^TgUtBk~ACZ$^pcT7o$p*L*AWOc$@%w_5HYxs(E ze154;?!79(2fk00!(Ee*cUpp-lichE8@ceiA)!XYHv|42a?b`Ic;n`z!}Er}2EW_V zdE?lA1ny4YuyHr<04}eadDHhKwlm(l)vy$7#PC+Y*88$_-oEX9MLIcn|M;-?Rj(iI zeJybCe9VQt(+@kyNyv+z)sUCYtbPWcb?G??y!mWMr#|y}Bpp9^^I@;_Z9Y$=;|EWF zynQ(QspY8z?q!(av%u*%w?w CL3)D# diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index 64db632..f340232 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -102,21 +102,13 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen // Pack UBO: mat4 vp (64 bytes) + vec4 lightPos (16) + vec4 lightColor (16) = 96 bytes var uboData = stackalloc byte[128]; - { - var vpCopy = vp; - var src = &vpCopy; - System.Buffer.MemoryCopy(src, uboData, 64, 64); - } - { - var lpCopy = lightPos; - var src = &lpCopy; - System.Buffer.MemoryCopy(src, uboData + 64, 16, 16); - } - { - var lcCopy = lightColor; - var src = &lcCopy; - System.Buffer.MemoryCopy(src, uboData + 80, 16, 16); - } + var pFloat = (float*)uboData; + pFloat[0] = vp.M11; pFloat[1] = vp.M12; pFloat[2] = vp.M13; pFloat[3] = vp.M14; + pFloat[4] = vp.M21; pFloat[5] = vp.M22; pFloat[6] = vp.M23; pFloat[7] = vp.M24; + pFloat[8] = vp.M31; pFloat[9] = vp.M32; pFloat[10] = vp.M33; pFloat[11] = vp.M34; + pFloat[12] = vp.M41; pFloat[13] = vp.M42; pFloat[14] = vp.M43; pFloat[15] = vp.M44; + pFloat[16] = lightPos.X; pFloat[17] = lightPos.Y; pFloat[18] = lightPos.Z; pFloat[19] = lightPos.W; + pFloat[20] = lightColor.X; pFloat[21] = lightColor.Y; pFloat[22] = lightColor.Z; pFloat[23] = lightColor.W; var drawCalls = new List<(VkBuffer vertexBuf, VkBuffer indexBuf, uint indexCount, Matrix4x4 model)>();