From a17a3cfef8bf3bd7d84740a8cbf944046b6d8e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Katharina=20Kr=C3=A4mer?= <kkraemer4@uni-koblenz.de> Date: Wed, 9 Jun 2021 20:24:31 +0200 Subject: [PATCH] [#69]added vertexbuffer and vertex attribute array and funny blue circle c: --- projects/first_mesh/src/main.cpp | 4 +- projects/particle_simulation/shaders/frag.spv | Bin 832 -> 1540 bytes .../particle_simulation/shaders/shader.frag | 5 +- .../particle_simulation/shaders/shader.vert | 10 +- projects/particle_simulation/shaders/vert.spv | Bin 1496 -> 1184 bytes projects/particle_simulation/src/main.cpp | 123 +++++++++++------- 6 files changed, 86 insertions(+), 56 deletions(-) diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp index 599eae46..95c81ba0 100644 --- a/projects/first_mesh/src/main.cpp +++ b/projects/first_mesh/src/main.cpp @@ -89,6 +89,7 @@ int main(int argc, const char** argv) { triangleShaderProgram.reflectShader(vkcv::ShaderStage::FRAGMENT); auto& attributes = mesh.vertexGroups[0].vertexBuffer.attributes; + std::sort(attributes.begin(), attributes.end(), [](const vkcv::VertexAttribute& x, const vkcv::VertexAttribute& y) { return static_cast<uint32_t>(x.type) < static_cast<uint32_t>(y.type); @@ -108,7 +109,8 @@ int main(int argc, const char** argv) { { core.getDescriptorSet(descriptorSet).layout }, true); vkcv::PipelineHandle trianglePipeline = core.createGraphicsPipeline(trianglePipelineDefinition); - + + if (!trianglePipeline) { std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl; return EXIT_FAILURE; diff --git a/projects/particle_simulation/shaders/frag.spv b/projects/particle_simulation/shaders/frag.spv index 2bda54b389e0b6a615e819f05c1ac07bbd714f86..fdf98514955a63d0e54791970d2f1867ca3c5375 100644 GIT binary patch literal 1540 zcmZQ(Qf6mhU}WH8;AJppfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z4D1Xn3=CkLo0ypgl8|CxV31*8U=Uzn28**ZFfcGPFf%YQFfbfq1gYg@aQBIK404Ju zPAy0*N-Rl@FV09zNiB-cPs&P7E-417;R2~~_xE@Aag9$dD2OjEsmw`@&&kY7jZeue zN=+`wEK3Ec<3LiEnU|bXnu4r=m4OB92AJDGd`<=ihTQzp;#39(237`E1}+8$hSGri z;>?oFe2@p&7}&sKAioqKgu!Zg7#J9kl!C=T{>?8fan8@lF9PXdWncsQKRqYjttc_w zIX}NB1tQMEpbxSOs*;U?70d_8B||lX+-JzZzyMXk-~n|XNR2XxU|?WyXJ7`q4-}s6 z3@i*FHz~p8AbdpzP^^N~vM_+$Cx;{tiW_bQ1_pix2C(@cH-V&)%?F9W%m=v#*?bTm zWIjlbFar}fUKPPH%m8MKF)%Z*F)%PFFfcHPGq5m#;vd8ZnWw<O!ob1602Tv@%R&7D zVuR#B?gFU;#fdco3j>G`@*hY{l!1kT7iumjeQHDbd?1G~Fff4RL4E?+3laj!gZKg< z4p<)xgCGOMjUe~H<VB!i1#+td0|VIYpfn9~k0dzlGBAL|LGA(ZLE#C?0U&v4s9u;n zhz|;1nEOEXK*H*TlL!M711KCp_JYJ!pzeb4Rl)oQdmRRLuzl(b3=AMOAPkZN(V*}G z#SO?lko}+x2?`sK7|4AfJ}7=bVjy`VsDDA~%@|n0@dNT3$SRN@elRdGure?(fb@dm z1(Y{HapB0o1`aDB1_p5Y0);Us9Bmm`z~Ljzz`y{KgQ*imQU?l8m^v|Vyf82XFtCE- zT%3V{0i+isZpXmP0J0Ax22u}lqb#)S@MmBLs|Tf9kQfMq+zbj=kXn!%<rx^j`gs`G z!EOS@J4oJ{fq?;}4<x^XffXF)ptKE=2gSuo22c)XU{GUVU;v53!nTir6&&sw3=9mQ zum{P5>;kz<6U|*(3=9k)F%U*~mo}Qabf9Sj<Svjtko-QVyL1^C7(nvK?$TpmU;v53 z+~vr?$^eQ-V+IBWP~3vz0_H9g1_lO@ILz&)3=9k)F_0OJQ2&@QFff4p1d;=VIVk;t O#QricGFUJ$G5`P*lWw{I delta 425 zcmZqSIl#ut%%sfDz`)4B#lXuTHj&p<n2mvjfdPzj6EpJ|7#J8hCq~XxXJz1IU|`5E zEpg7z$u9y4vof$Sa4|42ltM+=7+4v&CO0w)NAfT*FhB(vSQ%Iugh8qT@{2P|GV?(u zvN5oM#XzPMAcVncMHv_vkd!jGGq8YdmIEoCJeSel5ybF-nhIhog9ru&26qN#u&GR7 zHVXsDBqg{Ugs;fJz`!`!mPua`<Vghv76uLm1_ovZ1_pKp1_o;=ALLW!$+b-Wo*)(c z3=9k)GeIiE8CV#E7#JAXpki`RJ3(R~wIWb)kdHy8f%qVIFin2REN|h+z{&tJO@M)c l0Tf1j3=9mm3@l)~1sNC^K;m``%wYe5_<tD~87vqW8359{C#e7c diff --git a/projects/particle_simulation/shaders/shader.frag b/projects/particle_simulation/shaders/shader.frag index 87ae41a7..540281d9 100644 --- a/projects/particle_simulation/shaders/shader.frag +++ b/projects/particle_simulation/shaders/shader.frag @@ -13,5 +13,8 @@ layout(set=0,binding=1) uniform uPosition{ void main() { - outColor = Color.color; + vec2 mouse = vec2(Position.position.x, Position.position.y); + + outColor = float(distance(gl_FragCoord.xy, mouse) < 100) * vec4(0,0,1,0) + + float(distance(gl_FragCoord.xy, mouse) >= 100) * Color.color; } \ No newline at end of file diff --git a/projects/particle_simulation/shaders/shader.vert b/projects/particle_simulation/shaders/shader.vert index 6c78c446..97376d3d 100644 --- a/projects/particle_simulation/shaders/shader.vert +++ b/projects/particle_simulation/shaders/shader.vert @@ -1,17 +1,13 @@ #version 450 core #extension GL_ARB_separate_shader_objects : enable +layout(location = 0) in vec3 position; + layout( push_constant ) uniform constants{ mat4 mvp; }; -vec3 positions[3] = { -vec3(-0.5, 0.5, -1), -vec3( 0.5, 0.5, -1), -vec3(0, -0.5, -1) -}; - void main() { - gl_Position = mvp * vec4(positions[gl_VertexIndex], 1.0); + gl_Position = mvp * vec4(position, 1.0); } \ No newline at end of file diff --git a/projects/particle_simulation/shaders/vert.spv b/projects/particle_simulation/shaders/vert.spv index 9e89006811ae50bbd74619623632a0d5e4423ddb..1d8d780bcb1a3dff229389902f9d624e83500380 100644 GIT binary patch literal 1184 zcmZQ(Qf6mhU}WH8;AK!|fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z4D4Vw3j+f~ZenI0h{Makz#z%Mz`)GF%)rFJz;K9>fq{jAlfm65-Z982zBsiYu_&=5 zHNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_TvnVyWB(p3P zq>ckgU1nZ#PH76V0#*hV24wfJGO#glGcYiu=fnr37KNo2m84dH+{p$N2eCnN`Nf$f znfZAPYz*vR^`I~Si)ZGQ1ZP&Ig4Ds}K>kY4iFeM)EO5yzE=kNwPKE0Og$_urG$#ix z$I8IW016k78LSMf41x>{49WR<Ae|tuGq5qRfW<)axn%_mAoao^4g&)NNIfV#3t$dp zU|{fIU<JDoqy*$Q5DgOpxf>(~qG4hn_kzSgZi9(|*dQ@bSh+JWgUth}^FVS7E7UHK zdqH-<(g?^5m>4Jp2rw`(fXo1ify{7cU;(EAIglm>1_ogUCU9C%1g8oHFk6g)nSqUg zfkA<RfkB*s1)P#Ve2{xY8CV!NpmHE1w4r=X22g5cV31*8Vc=q50P6>d$wA{1<Q9+_ zAUP0LU|?b30jEV!dS+m-hVnsi0rEe{9zLi&pzs3O1LE_8EM;I|kYHe80Qn7MF34SS z49wto0*Qgl7Ghvv0ND@nH^^)d9~5sOF_63nR34-r<VSI+n?ZJi<Rzf~0f~e3gZQAh zhPegg7iq9t8tg&p6`_6sxyOuw6&#KrcY&0E%>2Q?!~lvjM+Q~~klmu-uxDTZ`NtOO z7cm9~29P+253*MZnqLDMKsf~zwhRm)F_4)sF<AzP7|2~PF;Lus)PdqVfPozxfAS0v z{UG%qd63&DGO&W>K=BN+8>9y0K9FCO7#P6$0^~kB24)5jAEfRt10#b410w?fYA#~M literal 1496 zcmZQ(Qf6mhU}WH8;AJpkfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z4D4Vw3j+f~ZenI0h$F?oz@W;&z`)GF%)rFJz;K9>fq{jAlfm65-Z982zBsiYu_&=5 zHNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_TvnVyWB(p3P zq>ckgU1nZ#PH76V0#*hV24wfJGO#l6FfcF_<QHd_Waj4;GcYi)GO#g7FfcHr=fnr3 z7KNo2m84dH+|C9S2eCnNP%R8>4D4X_pl|_;XXcdzXI7<x)WPIHeofDbch1QyaLFt# zNz6-5h3f-_7)Y)(CkHOa%D~J33M-HqAUDb}Ffb(N=Ye#Bf`fsLfrSAi29nP$D_{Vr zR{(LK?gxc&dQLpV@t%1pARl-zu!7wQQpOD;7#J8}Vj#DJ#6UDm4CH2z7|4AvF%TOh z1`0!W24=8%Aax!{?qP+R3v-_`l3g${P|6TsU|;~50TKh5;m*JUP8%TewHO!}gc+E? zX+#m6S{T4=F$QJ^HU<U;kYB|aSimU^#0R-cl!1kT11blyQX9(W1gAF!1{nqx1}+8$ zupW?@0s{*J$S#n6khnFJ4@wUpF_3-`%?mP&fnh(4&j;b#!}$DQe#3qpaEvlAfcyp0 z15yW)gNX|=Fff3`Ko}$r(=P<p&%gjvC(OXW01^Y40a6DN2f0s#0b(}D9FQ82|3w)X zz~KRk50H5v|BEqzaxKKa;!t^zm>e|y!t{XTKo}GblF%>$rF&2~fcT*F2MbqeXt;vX z2gn`}Uk2)K2?iDhSq26Mkhvgt$T2X3(<Vp^WVSp50|O|$LGcVS8^j02A4m)&uLzZg zsaJuzA7lqeJ%|rV&mg-&>eZos0;M64TR?FHN-qoy4fY^;P(cK7Hv@wi11mV)fZPRg zE=c?b0}}%%joL9VgY!NpTpbx$89?q(g8CEWH(RK`K<O7G4&sB{qy{a+KzcxK(O_Tz zn*$ODsR6l5lYxN&BpwJZO&A!o85kHqVjwrb#B`uyAb-KcbfIFP{1Cvv4h~a228e!; xdXPNGuM-(q!E*Wx3=AOmfz*K91M<5e0|U710QmvrM-U&R?k@u)g9QU40{{wWb>RR2 diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index 1d5f4de5..5c48c52f 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -4,25 +4,6 @@ #include <vkcv/camera/CameraManager.hpp> #include <chrono> -uint32_t findMemoryType( vk::PhysicalDeviceMemoryProperties const & memoryProperties, - uint32_t typeBits, - vk::MemoryPropertyFlags requirementsMask ) -{ - uint32_t typeIndex = uint32_t( ~0 ); - for ( uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++ ) - { - if ( ( typeBits & 1 ) && - ( ( memoryProperties.memoryTypes[i].propertyFlags & requirementsMask ) == requirementsMask ) ) - { - typeIndex = i; - break; - } - typeBits >>= 1; - } - assert( typeIndex != uint32_t( ~0 ) ); - return typeIndex; -} - int main(int argc, const char** argv) { const char* applicationName = "Particlesystem"; @@ -48,31 +29,10 @@ int main(int argc, const char** argv) { { "VK_KHR_swapchain" } ); - const auto& context = core.getContext(); - const vk::Instance& instance = context.getInstance(); - const vk::PhysicalDevice& physicalDevice = context.getPhysicalDevice(); - const vk::Device& device = context.getDevice(); - - struct vec3 { - float x, y, z; - }; - - const size_t n = 5027; - - auto testBuffer = core.createBuffer<vec3>(vkcv::BufferType::VERTEX, n, vkcv::BufferMemoryType::DEVICE_LOCAL); - vec3 vec_data[n]; - - for (size_t i = 0; i < n; i++) { - vec_data[i] = { 42, static_cast<float>(i), 7 }; - } - - testBuffer.fill(vec_data); - - auto particleIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, n, vkcv::BufferMemoryType::DEVICE_LOCAL); + auto particleIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, 3, vkcv::BufferMemoryType::DEVICE_LOCAL); uint16_t indices[3] = { 0, 1, 2 }; particleIndexBuffer.fill(&indices[0], sizeof(indices)); - std::cout << "Physical device: " << physicalDevice.getProperties().deviceName << std::endl; // an example attachment for passes that output to the window const vkcv::AttachmentDescription present_color_attachment( @@ -96,6 +56,27 @@ int main(int argc, const char** argv) { particleShaderProgram.reflectShader(vkcv::ShaderStage::VERTEX); particleShaderProgram.reflectShader(vkcv::ShaderStage::FRAGMENT); + vkcv::Buffer<glm::vec3> vertexbuffer = core.createBuffer<glm::vec3>( + vkcv::BufferType::VERTEX, + 3 + ); + + const std::vector<glm::vec3> vertices = {glm::vec3(-0.5, 0.5, -1), + glm::vec3( 0.5, 0.5, -1), + glm::vec3(0, -0.5, -1)}; + + vertexbuffer.fill(vertices); + + + vkcv::VertexAttribute attrib = vkcv::VertexAttribute{ + vkcv::PrimitiveType::POSITION, + 0, + sizeof(glm::vec3) * vertices.size(), + 0, + 5126, + 3}; + + std::vector<vkcv::DescriptorBinding> descriptorBindings = { vkcv::DescriptorBinding(vkcv::DescriptorType::UNIFORM_BUFFER, 1, vkcv::ShaderStage::FRAGMENT), vkcv::DescriptorBinding(vkcv::DescriptorType::UNIFORM_BUFFER, 1, vkcv::ShaderStage::FRAGMENT)}; @@ -106,7 +87,7 @@ int main(int argc, const char** argv) { UINT32_MAX, UINT32_MAX, particlePass, - {}, + {attrib}, { core.getDescriptorSet(descriptorSet).layout }, true); @@ -121,6 +102,10 @@ int main(int argc, const char** argv) { 1 ); + const std::vector<vkcv::VertexBufferBinding> vertexBufferBindings = { + vkcv::VertexBufferBinding(0, vertexbuffer.getVulkanHandle()) + }; + vkcv::DescriptorWrites setWrites; setWrites.uniformBufferWrites = {vkcv::UniformBufferDescriptorWrite(0,color.getHandle()), vkcv::UniformBufferDescriptorWrite(1,position.getHandle())}; @@ -134,7 +119,8 @@ int main(int argc, const char** argv) { const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle(); - const vkcv::Mesh renderMesh({}, particleIndexBuffer.getVulkanHandle(), 3); + const vkcv::Mesh renderMesh({vertexBufferBindings}, particleIndexBuffer.getVulkanHandle(), 3); + vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle); vkcv::DrawcallInfo drawcalls(renderMesh, {vkcv::DescriptorSetUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle)}); auto start = std::chrono::system_clock::now(); @@ -147,6 +133,33 @@ int main(int argc, const char** argv) { pos = glm::vec2(static_cast<float>(offsetX), static_cast<float>(offsetY)); }); + + struct Particle{ + glm::vec2 Position; + glm::vec2 Velocity; + float Rotation = 0.0f; + float SizeBegin, SizeEnd; + + float LifeTime = 1.0f; + float LifeRemaining = 0.0f; + + bool Active = true; + }; + + std::vector<Particle> m_ParticlePool; + uint32_t poolIndex = 999; + + m_ParticlePool.resize(1000); + + //float angle = 0.0005; + glm::mat4 modelmatrix = glm::mat4(1.0); + + for(auto& particle : m_ParticlePool){ + if(!particle.Active){ + continue; + } + } + while (window.isWindowOpen()) { window.pollEvents(); @@ -159,12 +172,28 @@ int main(int argc, const char** argv) { color.fill(&colorData); position.fill(&pos); - auto end = std::chrono::system_clock::now(); - auto deltatime = end - start; + float deltatime = std::chrono::duration<float>(end - start).count(); start = end; - cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count()); - const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); + + //modelmatrix = glm::rotate(modelmatrix, angle, glm::vec3(0,0,1)); + for(auto& particle : m_ParticlePool){ + if (!particle.Active){ + continue; + } + if (particle.LifeRemaining <= 0.0f){ + particle.Active = false; + continue; + } + + particle.LifeRemaining -= deltatime; + particle.Position += particle.Velocity * deltatime; + particle.Rotation += 0.01f * deltatime; + + } + + cameraManager.getCamera().updateView(deltatime); + const glm::mat4 mvp = modelmatrix * cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); vkcv::PushConstantData pushConstantData((void*)&mvp, sizeof(glm::mat4)); auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); -- GitLab