From f9be00604326a6dda719734ba90f43a9367c6300 Mon Sep 17 00:00:00 2001 From: Alexander Gauggel <agauggel@uni-koblenz.de> Date: Tue, 25 May 2021 11:58:50 +0200 Subject: [PATCH] [#35]Hacked camera into push constants --- include/vkcv/Core.hpp | 2 +- modules/camera/include/vkcv/camera/Camera.hpp | 25 +++++++++++------- projects/first_triangle/shaders/shader.vert | 12 ++++++--- projects/first_triangle/shaders/vert.spv | Bin 1508 -> 1772 bytes projects/first_triangle/src/main.cpp | 23 +++++++++------- src/vkcv/Core.cpp | 5 +++- src/vkcv/PipelineManager.cpp | 12 ++++----- 7 files changed, 48 insertions(+), 31 deletions(-) diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 065c21d2..a3016f91 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -164,7 +164,7 @@ namespace vkcv * @brief render a beautiful triangle */ void renderTriangle(const PassHandle renderpassHandle, const PipelineHandle pipelineHandle, - const int width, const int height); + const int width, const int height, const size_t pushConstantSize, const void* pushConstantData); /** * @brief end recording and present image diff --git a/modules/camera/include/vkcv/camera/Camera.hpp b/modules/camera/include/vkcv/camera/Camera.hpp index 90a2b003..64d8770e 100644 --- a/modules/camera/include/vkcv/camera/Camera.hpp +++ b/modules/camera/include/vkcv/camera/Camera.hpp @@ -8,15 +8,22 @@ namespace vkcv { class Camera { protected: - glm::mat4 m_view, m_projection; - - int m_width, m_height; - - float m_oldX, m_oldY, - m_near, m_far, - m_fov, m_ratio; - - glm::vec3 m_position, m_direction, m_up; + glm::mat4 m_view; + glm::mat4 m_projection; + + int m_width; + int m_height; + + float m_oldX; + float m_oldY; + float m_near; + float m_far; + float m_fov; + float m_ratio; + + glm::vec3 m_position; + glm::vec3 m_direction; + glm::vec3 m_up; public: Camera(); diff --git a/projects/first_triangle/shaders/shader.vert b/projects/first_triangle/shaders/shader.vert index 1d278d5f..e129186a 100644 --- a/projects/first_triangle/shaders/shader.vert +++ b/projects/first_triangle/shaders/shader.vert @@ -3,11 +3,15 @@ layout(location = 0) out vec3 fragColor; +layout( push_constant ) uniform constants{ + mat4 mvp; +}; + void main() { vec3 positions[3] = { - vec3(-0.5, 0.5, 0), - vec3( 0.5, 0.5, 0), - vec3(0, -0.5, 0) + vec3(-0.5, 0.5, -1), + vec3( 0.5, 0.5, -1), + vec3(0, -0.5, -1) }; vec3 colors[3] = { @@ -16,6 +20,6 @@ void main() { vec3(0, 0, 1) }; - gl_Position = vec4(positions[gl_VertexIndex], 1.0); + gl_Position = mvp * vec4(positions[gl_VertexIndex], 1.0); fragColor = colors[gl_VertexIndex]; } \ No newline at end of file diff --git a/projects/first_triangle/shaders/vert.spv b/projects/first_triangle/shaders/vert.spv index bd1e0e682c52e6e38a5f5aba4eeaf8e73a70d741..03af5758ffff1b5b6505fe98b02044849026832d 100644 GIT binary patch literal 1772 zcmYk6ZBNut5QQ)7F0TS2@}eSiT?J(k-vCimf@l_#O+ZQf+N`@3Yf5+17NUOQFZhc{ z{8fH2@jPuW={3XLbLPx+=HBa;`fG#6^qCPeW?q?WO`3i&#*CVQ)Hj+(&9yk`tgUZ6 zMlo(msSwSC8A|tM{XJ><A;6K<Wm~e6{`JfMk+^JzO{3}VetPT1Uau9k63>mlwK`tp zcE5c0+DVLN1Wn`MpwWEqwtGD{PJRZS8~CB;cKk>x|I9--RM7chJ2>qW1r;fZJylG_ zTu~prZtN$1H`J%Zl+Cn!yBl;P5f#n5AbcFShhFsAixTgLpxBIOPb@DXb}-d*4k_=4 z$&vp{-I0^Um|d~G!0)~D<D?a~y~`M<NbEESE@Ks)mm{7<&v)h9YFC*Yk8;Z?NBrch zCq>CD0kr6!b63r*`43@-38=$ee2rSid(5i+zBp!Ojb`qWV;(rX)iDPgJzI`F9Ov9n zgnH=q3q4j+oXw%FsqsgP8qCJh12k7<)PSQ#LpAF1)L+RlGuWP|q(WC!4t=nn(QZKA zk<BWfx?tkd!n{;R#;WIdSbO60!XxtJz&XNv8w`)0T4OS;3ya4yykqf1iq9`rrM7dC zgN~TxCv(p7HvgJ<meoyZ4@V7~Pe0dXoEde{*!&sojXB@3`LjZB)W9r1mtz~V{EdQ^ z7(Cy*DWev7XgJ?n@|+3x&-Xdsc^U79^Smuj9Bx57?#|{A!#L+fdG3Jtc8;B#<KC*; zgQ?4Rz;|S<IpLZ-b?IY4m3TvN)V?RreZo;2yp(gqm-D^VuL$!UzJVUhJA_03P@a3m zz#H=P&iBF3b4;9kFz*)4rrtd7ls;K-f5q^B1TF84-zb|4=JyHwMrvZ*J9~KUWLMeC z^7m!T#ksszE#`S3g9lgTS7ppX4s)!@s0ojT?>v&hf0Ty1;|Cv(Ww|HX!}S%or#Z)b zhpNPRJd=@+o;dI6x9SpGm(d>@`r#ZmWsZy)m=TQ5_WwfrV*f9NIR|*#|F-t<<a6%e Jf9iBg_8)N7hMWKZ literal 1508 zcmZ9M>rd1`6van&m&YO?BH#nD>-q#-e8<EnK`_;16HpSrHg&gRP3>;lV$@ImXD0qt zelhX<+L?9ZkjuU2+;eB{+$q#1+Ed1yGEFmQ9++w^nh7z+%$mv4``x2%ColS)hmY=} zm^Zajh-Se|mvLRcKZkJ&xFT!Iwq-T_OvwL|xNc^Q-wk%(z6kPY7-nG+1^LIYA7#Pd z{imo`<Y<~`{DT9(`!eVahe2L^OQIl&(<tc2nN;zY2;KCUE>3&NNq=0>kYc>2hH047 z>SH*_<02lUI!a94oRjYjl0hb-q5EDIK2CzeD0>%WMf6orY{e6kvs;LrD)r2v<m0qB ziodHnYN{M}S8gwfhx>6}glR7t<(MM5lO!4C8k!gLW6=+Dl%{Itb=s#R?!s(8Wa051 zy(@ktj^0_bl^b!@Tk^{Pbo7Oe9$YOk9CP!PVLx=f82TW$VKL{g%UDZNp=+szJ&0En zP0D++Rn_YwD>3<HVZItq#@e)aMlty{;ifz_aGo${gW=J$_nb`Yr^E9V-f?)L!e&cq zYR|~1K}XK<i<bMJKWlZ=I6dbt$=HiJH151*#m4;Dar>?a!BOk#>0{Mmmvj2_V_I_X zoOeOSUeuvso)_hr0dK|m%=40rH)eio^5o&x74ep?h8)IRc|&GS{;9=$f9{<;#Tff? z4slDyqW-EpIZsACxGk%=y1A~HJ7eg#<k_2Ez#WUpQxD#@++%&yd`sMsMcr>P4SBSD z6Z}oPS}=dl;OA14<E@C{nd39ndGgm}^tr3u=<$XOJv<urxG95wBMq~>WjVPKciVE@ z*XcGaNAHK)iMwvfs7Ftp_vLKnaYx3?TQYhDqj$aXPj|f6d&1lY-t~H4F+BCm5Bx{3 H@I>|(cxrZg diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 5ff33793..d9c16d57 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -24,7 +24,7 @@ int main(int argc, const char** argv) { std::shared_ptr<vkcv::TrackballCamera> trackball; camera.setPerspective( glm::radians(60.0f), windowWidth / (float)windowHeight, 0.1f, 10.f); glm::vec3 up(0.0f, 1.0f, 0.0f); - glm::vec3 position(1.0f, 0.0f, 0.0f); + glm::vec3 position(0.0f, 0.0f, 0.0f); glm::vec3 front(0.0f, 0.0f, -1.0f); glm::vec3 center = position + front; camera.lookAt(position, center, up); @@ -41,7 +41,7 @@ int main(int argc, const char** argv) { // showing basic usage lambda events of window window.e_mouseMove.add([&](double x, double y) { - std::cout << "movement: " << x << " , " << y << std::endl; + //std::cout << "movement: " << x << " , " << y << std::endl; if (firstMouse) { lastX = x; @@ -77,7 +77,7 @@ int main(int argc, const char** argv) { center = position + front; camera.lookAt(position, center, up); - std::cout << "New center: " << center.x << ", " << center.y << ", " << center.z << std::endl; + //std::cout << "New center: " << center.x << ", " << center.y << ", " << center.z << std::endl; }); window.e_mouseScroll.add([&](double xoffset, double yoffset) { @@ -90,37 +90,37 @@ int main(int argc, const char** argv) { fov = 45.0f; } camera.setFov(fov); - std::cout << "New FOV: " << fov << std::endl; + //std::cout << "New FOV: " << fov << std::endl; }); window.e_key.add([&](int key, int scancode, int action, int mods) { switch (key) { case GLFW_KEY_W: - std::cout << "Move forward" << std::endl; + //std::cout << "Move forward" << std::endl; position += cameraSpeed * front; center = position + front; camera.lookAt(position, center, up); break; case GLFW_KEY_S: - std::cout << "Move left" << std::endl; + //std::cout << "Move left" << std::endl; position -= cameraSpeed * front; center = position + front; camera.lookAt(position, center, up); break; case GLFW_KEY_A: - std::cout << "Move backward" << std::endl; + //std::cout << "Move backward" << std::endl; position -= glm::normalize(glm::cross(front, up)) * cameraSpeed; center = position + front; camera.lookAt(position, center, up); break; case GLFW_KEY_D: - std::cout << "Move right" << std::endl; + //std::cout << "Move right" << std::endl; position += glm::normalize(glm::cross(front, up)) * cameraSpeed; center = position + front; camera.lookAt(position, center, up); break; default: - std::cout << "this key is not supported yet: " << std::endl; + __nop;//std::cout << "this key is not supported yet: " << std::endl; } }); @@ -211,7 +211,10 @@ int main(int argc, const char** argv) { while (window.isWindowOpen()) { core.beginFrame(); - core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight); + + const glm::mat4 mvp = camera.getProjection() * camera.getView(); + + core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight, sizeof(mvp), &mvp); core.endFrame(); } return 0; diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index 48871511..2a8dddfc 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -167,7 +167,8 @@ namespace vkcv } void Core::renderTriangle(const PassHandle renderpassHandle, const PipelineHandle pipelineHandle, - const int width, const int height) { + const int width, const int height, const size_t pushConstantSize, const void *pushConstantData) { + if (m_currentSwapchainImageIndex == std::numeric_limits<uint32_t>::max()) { return; } @@ -184,7 +185,9 @@ namespace vkcv m_CommandResources.commandBuffer.beginRenderPass(beginInfo, subpassContents, {}); const vk::Pipeline pipeline = m_PipelineManager->getVkPipeline(pipelineHandle); + const vk::PipelineLayout pipelineLayout = m_PipelineManager->getVkPipelineLayout(pipelineHandle); m_CommandResources.commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline, {}); + m_CommandResources.commandBuffer.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eAll, 0, pushConstantSize, pushConstantData); m_CommandResources.commandBuffer.draw(3, 1, 0, 0, {}); m_CommandResources.commandBuffer.endRenderPass(); } diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp index e6d6beea..576cb473 100644 --- a/src/vkcv/PipelineManager.cpp +++ b/src/vkcv/PipelineManager.cpp @@ -140,14 +140,14 @@ namespace vkcv { 1.f,1.f,1.f,1.f } ); + const size_t matrixPushConstantSize = 4 * 4 * sizeof(float); + const vk::PushConstantRange pushConstantRange(vk::ShaderStageFlagBits::eAll, 0, matrixPushConstantSize); + // pipeline layout vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo( - {}, - 0, - {}, - 0, - {} - ); + {}, + {}, + (pushConstantRange)); vk::PipelineLayout vkPipelineLayout{}; if (m_Device.createPipelineLayout(&pipelineLayoutCreateInfo, nullptr, &vkPipelineLayout) != vk::Result::eSuccess) { -- GitLab