From edfcf33578d94963420f9396b51686e7e94db737 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 13:20:22 +0300 Subject: [PATCH] feat: render 2 rotating cubes side by side - Push constant changed from float angle (4B) to mat4 model (64B) - Two draw calls with different model matrices (x=-1.5 and x=+1.5) - Both cubes rotate around Y axis at 0.2 rad/s - 0 validation errors --- .../Shaders/triangle.vert | 13 +++---------- .../Shaders/triangle.vert.spv | Bin 2164 -> 1544 bytes src/Engine.Graphics.Vulkan/VulkanPipeline.cs | 2 +- src/Engine.Graphics.Vulkan/VulkanRenderer.cs | 10 ++++++++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.vert b/src/Engine.Graphics.Vulkan/Shaders/triangle.vert index d74154e..d587a87 100644 --- a/src/Engine.Graphics.Vulkan/Shaders/triangle.vert +++ b/src/Engine.Graphics.Vulkan/Shaders/triangle.vert @@ -10,18 +10,11 @@ layout(row_major, set = 0, binding = 0) uniform CameraUBO { mat4 vp; }; -layout(push_constant) uniform PC { - float angle; +layout(row_major, push_constant) uniform PC { + mat4 model; } pc; void main() { - float c = cos(pc.angle); - float s = sin(pc.angle); - vec3 rotated = vec3( - inPosition.x * c - inPosition.z * s, - inPosition.y, - inPosition.x * s + inPosition.z * c - ); - gl_Position = vp * vec4(rotated, 1.0); + gl_Position = vp * pc.model * vec4(inPosition, 1.0); fragColor = inColor; } diff --git a/src/Engine.Graphics.Vulkan/Shaders/triangle.vert.spv b/src/Engine.Graphics.Vulkan/Shaders/triangle.vert.spv index 7e657ddc6b4d7990610786dc8982bedcdcdaa183..edfeddb33d4d1e99fac4fcba0ca89073fe8ad874 100644 GIT binary patch literal 1544 zcmZ9L+iuf95QaB#oE8c_PiMn5Gybu5I<`;P7BDD^3QF9zP^v z)p$0Lm^E|O+ATdNVVnZaO9Dw>a!)dlc=|P^e=Es1E&b;4zV2BOK246sQT{2)i|Cu6 z*pkP_m(AiL&Qh^UHlF(}AE(7({5>Mh`M68IVG>W@#IqtykE7a0_xQdfN$vC1AANIt z{WheB;Uvn#kFVd$ZmVNBð1p4lv+wRdEXhs5~?n={EyqC}e5OVZQhvUVUlPU~^x z_wBAe=i%uvOS0VNwCwKUv}A~3k8%1g%O@da%}90G8?(NZADiQ}J;WM(SzbDK; zf_S)&EOzQ@;6nn%os)Jue^z0>K{)PNwQ*%#?g6h!IJ?5^ox1eZQ5Nq6j@lQbnFWs8 zVBQ5B{)?4OJh|-E7P-s~ckeFU~-rHIIA4hQ&a8>e5vLo4*>`5~EwM+lerku;_cNU+MuT%Iyf_+Z9RCGE$ z=WRh3RgWs=)ZZn2qF`b#$!>T)>xQN4wIoW)hw|lo9dWf(Ys5)hQ)M}2e5#nE%EwZ< z{-In?%3lS=1|A!qZOFS0AJ08KA6Jw8_#0(tNAPhc`HGeJWHW9gQT3pF>Z42eK36KI zK5C{nENWbmE=I@Ydh~vS{^!*hIM$bwaL45UeLOw=RF95|wMwlnn_kl6xEdI8((kys zSF0aK6`5`;?J2cx%TIq<6G6$J^}QNB#TkEZi>GHS`pzN;T$qudjbjgS+}${AIG#DR zaKDiI?5_BTx4Ua7-NhEJxn6oQCSg%Oc-*6a>C@SLLXW`IOgudTQ%Ar4(POHOTCoRZ z<)sT=vU=Li3*4xD^f36d{tW;lOUlg~!F|C4!rjsZ31?5G_=0R!LAXcS@(l?O3X_{! z@DE9IK0Nq}G`YZ>2j-oFHi6f*i|5@dVMdsPW#yoL<{iFU2;3*(eB$w~=w!};w>WRr)p z@R5i5;K{>0@GdYz%!$==BjpVjggO70_E6uLgqVWF@=VAk&$z_)-INV)_?B$Ww>-CH z69fM<&3#8U`SDrqyRykWDY0DlWW!s`l#{A7nxF5CS=Xo$6@SM+VuS%GAn~z1=Ym&f+Z^XJV z``)Ez6=lP*jN6nA*Ve?nNI7P@q^aZ`c`0E(@%T3+zm*r?mSjyr4E1eGzmo7SQy=w% ViK92%@r{J{3ExhN|EY=v$$!$Ce?$NP diff --git a/src/Engine.Graphics.Vulkan/VulkanPipeline.cs b/src/Engine.Graphics.Vulkan/VulkanPipeline.cs index b85b299..c4b7544 100644 --- a/src/Engine.Graphics.Vulkan/VulkanPipeline.cs +++ b/src/Engine.Graphics.Vulkan/VulkanPipeline.cs @@ -154,7 +154,7 @@ internal sealed unsafe class VulkanPipeline : IDisposable { stageFlags = VkShaderStageFlags.Vertex, offset = 0, - size = 4, + size = 64, }; var descLayout = DescriptorSetLayout; diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index 9f0de6c..1f3db02 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -188,9 +188,15 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen Vk.vkCmdBindIndexBuffer(cmd, _indexBuffer.Buffer, 0, 1); - float angle = _totalTime * 0.2f; - Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex, 0, 4, &angle); + var angle = _totalTime * 0.2f; + var rot = Matrix4x4.CreateRotationY(angle); + var model1 = Matrix4x4.CreateTranslation(-1.5f, 0, 0) * rot; + Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex, 0, 64, &model1); + Vk.vkCmdDrawIndexed(cmd, _indexCount, 1, 0, 0, 0); + + var model2 = Matrix4x4.CreateTranslation(1.5f, 0, 0) * rot; + Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex, 0, 64, &model2); Vk.vkCmdDrawIndexed(cmd, _indexCount, 1, 0, 0, 0); Vk.vkCmdEndRendering(cmd);