From dca0b5cc5ac6e5d0c2ced06b23dc665f822249f7 Mon Sep 17 00:00:00 2001 From: Sebastian Gaida <gaida@ca-digit.com> Date: Mon, 21 Jun 2021 20:05:39 +0200 Subject: [PATCH] [#69] added instance rendering and added GPU computation --- include/vkcv/DrawcallRecording.hpp | 5 +- .../particle_simulation/shaders/comp1.spv | Bin 1316 -> 2112 bytes projects/particle_simulation/shaders/frag.spv | Bin 1064 -> 1156 bytes .../particle_simulation/shaders/shader.frag | 4 +- .../particle_simulation/shaders/shader.vert | 9 +++- .../particle_simulation/shaders/shader1.comp | 14 ++++- projects/particle_simulation/shaders/vert.spv | Bin 1620 -> 2116 bytes .../src/ParticleSystem.cpp | 4 ++ .../src/ParticleSystem.hpp | 2 + projects/particle_simulation/src/main.cpp | 51 ++++++++---------- src/vkcv/DrawcallRecording.cpp | 4 +- 11 files changed, 56 insertions(+), 37 deletions(-) diff --git a/include/vkcv/DrawcallRecording.hpp b/include/vkcv/DrawcallRecording.hpp index 0929ad03..7f653d21 100644 --- a/include/vkcv/DrawcallRecording.hpp +++ b/include/vkcv/DrawcallRecording.hpp @@ -37,11 +37,12 @@ namespace vkcv { }; struct DrawcallInfo { - inline DrawcallInfo(const Mesh& mesh, const std::vector<DescriptorSetUsage>& descriptorSets) - : mesh(mesh), descriptorSets(descriptorSets) {} + inline DrawcallInfo(const Mesh& mesh, const std::vector<DescriptorSetUsage>& descriptorSets, const uint32_t instanceCount) + : mesh(mesh), descriptorSets(descriptorSets), instanceCount(instanceCount){} Mesh mesh; std::vector<DescriptorSetUsage> descriptorSets; + uint32_t instanceCount; }; void recordDrawcall( diff --git a/projects/particle_simulation/shaders/comp1.spv b/projects/particle_simulation/shaders/comp1.spv index aa72785c8955dbb67fd1d1f5d37274e8789ddb40..c82562d6735289dd7f7ba2dbeb2243817034d47d 100644 GIT binary patch delta 1109 zcmZ3&bwGfZnMs+Qfq{{Mi-DKHeIxH_Mo(4-Rt9MX28QJPyyB9?ypm!D1_m|;Hn122 z0|P@*YH>kgd0s$%F+!Y?fq@|<HK!yoBr`Xafq{XQftf*e@<qnumL5>kKsuE{1Oo#D zObnz8B*w$Qz~Iin47Py@%w}P5+dP*^nz3G+frUYwfq_Aa0pv&q1~~>6urfgg1_l8J z1_lKN76usx1_n+B2C%p_lrIYv1If!l*)a8r3=9k)Ye0OE`5;;o>NF7sCI&4A1_r2j zJ%c`2!odM#kP*}%kmVr0DbyekAEW`~P&=p?h|k8rz~I8bz~BHi5X5(ddPIkT4eV$) zs2Y$s2%9mmf*r>Kws*1{OI*Dp11kf_5AqBQ3?P4j!orq;1?qnW29UTT13LrAUrG!N z3}Orn3=#|s43f}rgQ*1tHAudhffcM*g@J(qB&NW?zyQ;)imAVz!H$8M0VDy^05S~Z z4>bk`1`Z^R>PQ+va>$O<U|?VX$?srbg$6DI14s-M=-(Nb8FayZWnlQlz`~%-z`&rx zzyKEe!NA0z!%)w_0JBsN%~As-OF?oVOF@nWiGv~zrq2+rkCg!wiN?^71ceev4JZOl z7#J8p;-HWKMXVXj?0N<U29N<D#UR5$5+KDt8JOU%1o;4D5GZ8Kp_ak;7EnISU`v?6 z3=9k)Igq&^wID}WF)%QI<Y7^6&A`A=j~?eX3=9k)36Lg`g|=uG*dtj0k^?14kXn!h zpri<r?_*$P0P!86$rEH|BUH?Zfq?<!5RjZB1G_E*C^(#v3<dcR<Z4i8fW$!>{xUE! JSTHa$003VbMOFX+ delta 284 zcmX>gu!M`3nMs+Qfq{{Mi-DIxZ6oh##>pB?2Uy)1SQu0{D>6$n)+;cuFi0~nFfcJN zFbFa*FlaNdFbFU(Fvu}L0E{osz`($DUD-y5feoxq0jdTh4pIwJ$Hu_Gpv=I)-~crT z#8+VeS<k=#(#Ofbz@Q3M0}@wZV3@4Unj31%z`_7hE5*RTz`?-4;K;xZc9RSP1A`a? z1A_zu0|Q77M1$0V+$qbzzyOkOWMBomN0EVn0VD=;7g+z~gRH_5ARTrL%nV8l3=AL@ Me;F7VEEpIW0ApVhwg3PC diff --git a/projects/particle_simulation/shaders/frag.spv b/projects/particle_simulation/shaders/frag.spv index 1b3a6f369887d3cad66e2f93316261c9c94202ac..a37f971964481b32a05bafc7efcf0c7b4b25671e 100644 GIT binary patch delta 298 zcmZ3%(Zb2g%%sfDz`)4B#lXv;GLhF*oSlJ%fdPzj6EpJ|7#J9&7#J87CWijCXJb%c zU|=XnEG`a9&B;&BEU5%Zvof$SC^9fGlsf0<<QFk8uraWL`5?Juh!6uvjq>D5#%Nb} z1{Sa>att6_85lf}R4aqDFfcH<GcbcqU;?vQ7(n7ma5)wR<;|Q-qKrZf_Sy_A3~USx z3^Gv3$p*|KiXaXMi!-n=fNTLNU<P@CfrUXHWb5QaW?@Z61_lN>s67%;S&$tdJ3+p& PW?*3e@s%eRGH(X}R`DGS delta 209 zcmZqST*1N1%%sfDz`)4B#lXv;IFZ*>n2mvjfdPzj6EpJ|7#J9&CPw}hW?_(HU|=Y9 z&d<p&VqjonU}cb-+{h@*s4#gdW3;IUh!0ZBz`&pkrQI2r!Fre&7#Q3cSQr!-7#Nh` zax4rAn@yQS8J!szv>8|!*cccXWWbUQ_Bssg3=#|s46+Oi4AM|>5Dmg|P(wlT3Jfd^ S@(c_NOp_-v3s1hlyafQ3VHGI= diff --git a/projects/particle_simulation/shaders/shader.frag b/projects/particle_simulation/shaders/shader.frag index f7a6c9bc..1c228be0 100644 --- a/projects/particle_simulation/shaders/shader.frag +++ b/projects/particle_simulation/shaders/shader.frag @@ -1,6 +1,8 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable +layout(location = 1) in vec3 passVelocity; + layout(location = 0) out vec4 outColor; layout(set=0, binding=0) uniform uColor { @@ -14,7 +16,7 @@ layout(set=0,binding=1) uniform uPosition{ void main() { vec2 mouse = vec2(Position.position.x, Position.position.y); - outColor = vec4(0,1,0,0); + outColor = vec4(1,0,0,0); //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 9e3a8249..d68f087f 100644 --- a/projects/particle_simulation/shaders/shader.vert +++ b/projects/particle_simulation/shaders/shader.vert @@ -1,4 +1,4 @@ -#version 450 core +#version 460 core #extension GL_ARB_separate_shader_objects : enable layout(location = 0) in vec3 particle; @@ -20,7 +20,12 @@ layout( push_constant ) uniform constants{ mat4 mvp; }; +layout(location = 1) out vec3 passVelocity; + void main() { - gl_Position = mvp * vec4(particle, 1.0); + int id = gl_InstanceIndex; + passVelocity = inParticle[id].velocity; + vec3 moved_particle = particle + inParticle[id].position; + gl_Position = mvp * vec4(moved_particle, 1.0); } \ No newline at end of file diff --git a/projects/particle_simulation/shaders/shader1.comp b/projects/particle_simulation/shaders/shader1.comp index ee84397b..eea7fe7b 100644 --- a/projects/particle_simulation/shaders/shader1.comp +++ b/projects/particle_simulation/shaders/shader1.comp @@ -16,7 +16,19 @@ layout(std430, binding = 0) coherent buffer buffer_inParticle Particle inParticle[]; }; +layout( push_constant ) uniform constants{ + vec3 respawnPos; + float deltaTime; +}; + void main() { uint id = gl_GlobalInvocationID.x; - inParticle[id].position = inParticle[id].position + vec3(0.f,0.01f,0.f); + inParticle[id].lifeTime -= deltaTime; + if(inParticle[id].lifeTime < 0.f) + { + inParticle[id].lifeTime = 3.f; + inParticle[id].position = respawnPos; + } + + inParticle[id].position = (inParticle[id].position + deltaTime * inParticle[id].velocity); } diff --git a/projects/particle_simulation/shaders/vert.spv b/projects/particle_simulation/shaders/vert.spv index 841133cd5ef81d8fed6fdf94b598f82627eed2f5..bdfc6c77e59f2b2a73ea0c4ec9a44086a438d15e 100644 GIT binary patch literal 2116 zcmZQ(Qf6mhU}WH8;AOC8fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z44hy#3j+f~ZenI0h{MIez`)PIz#zxKz@Wvzz`)GF%)rFJz;K3<fq{jAlfm65-Z982 zzBsiYu_&=5HNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_T zvnVyWB(p3Pq>ckgU1nZ#PH76V0#*hV24r`!GB7i6FfcG=rZ6zDGO#m%+?k#e@0nLz zl9-pA>Y104S^;uDD+3$Y{RN4|#bK#A`N^3jl@M`O1_1^JhJeJPlFa0sRFD`O0~=Tj z#4gA$&Me8y2ZsSn92AZ@nQ5sZnYk$HLE%w`WHwAaC}ax~Q&KYX(&LR7Anp`mU|>ip zO-oBHiqFhLvK*ubBnPq^Spwuw5s)BQKO2J#C~or0Qd8m!;4WunU<JnyLIh+N8-oS| z14DXFd_ZbZSZYxTBs@U&fW$#Yg5+S{WMg0ls|WcJES{NH5}a8D^(RCQ<j?e+c;}qV z0+&okI5WWXf&2=RE6vG)%YobuN;4q4KyK7wU|>kj2geX7X)v%curPqcK=Qd|1q>kd zdLRx11A{vQ3ph@>85kI}p?p|61i8_J0TO>8<;oy}fq?-g29gJf@gRwT+zt{0#W_qJ z$ju-zP?&=36J%guU}IolPyp*=VSvSlIGE20=Y#ZstaN8!28)5r0qF<DlM+Y*>Ru3E zk%0l6UqJGpJOsiZB_KDz;sNAGWHFHYL1G{prViwOkQm4=m>7r+5(DK6kXu0Jfz){* zg)1x6?XYl$xgBH%OpKj@0i5nZW`M*%W(YGdf!(bL&hZdGh%&Ii!w2Lx1qK!dkX{gm zgd3<t0F^+HaI^-O5DegW1gRHeU}gZt2`GHU8CV#285qEPkUv0X@qx=12Cz6tFNhC{ zbCA3oG;hN6z-U<pW(H8af#OvT8Xq7&$UI?a*n{E`WFCkQiW89kw4r_x1qD1fjY0ed ziffQONWTPBKgcc+Uz&jd>|YpPmI2~d5Fcbdh!2WikY7RmQ-S&q6hEM_Q-!82kd+|& zL3}l+88Qqk4C+wzATf}CLGcMQ10)B+Aa`g&!wDo0vKPb$<ugz?NieX0^9x8H$X-yG zfZ`OChd_FD85qE&JV*?r7sLnUIZ(+DlGlgIgVclE2#PObkb@Z->_PIDP`g3qn=!D0 z(+J2OkP?vnKNy%8KxqzSHYi<y%4iS`;)B8ul-EFfTWI)$(l4m&wu6@EAU;e^jDZ1M z#yc{wGl1ekl7WE%6n~&N1IdBn3Zxbk{!$DK3?O-sIiNHH;=|<Rq4gJt4@sw}=7RDl z%v?~~1ep&~3o;j!pF#4C46NXE3Ccep^FZPtyFmT{i8(T`GJwJkRH=f(6J`b|91R&5 z7(n7MGeLC$NM9fWD>(g|FfcHH#6V#P6ElU1fzlF8%nT|9N}mA?><pkdFlS(30O<#* v2g!rtY9a$GSk8ihfdOPUNDat+pt!Sw*5e@ef!q(`gVg<HU}UghU}OLQd@8GA literal 1620 zcmZQ(Qf6mhU}WH8;APNYfB-=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#3lfV; zGLv(_?f{7?GcYg&Ac=we0}=yiD}Z^1fq?-g4)RY<W?E`UW-izam^jEUWvMy&$(bdU zAiXegkUt6%Q&KYX(<5?qFw7Wnf@PDosmEEsD>~L$VyC2P6m5k1PT5hdM}*fq}t; zffXFCATB6AKr~DY<Tj8Ph=z%Q+yxQ?xdSE!VuQp$@$1gO3^os>&I2j@SfO@-!Wd)+ zEKERVz{EhQR)B$l0b~Y93}l8o0}D9a%7HXN&4B5J(I7KGY>+!aG!K$GkQpE`khw5* zAoqgAWWaW@FsOjzgMmQ-td9j8o*?VQ!F*OYAEXB)4sstTTtVi5+y@FvC6ENvJP==z zfdQP)gc+E?v?4g?LBzxum>Jj@Aohtfuz+(bhz|-sQ3e(U4yYW+NNp&elL1sBFfhn4 zurP2z-3t<vgXR}d*n!Ld$$_u}0}BHv96)Xa#f>$T4@&PKF_1lcP<ue(2C@gl=LcEJ zz`!8Ez`_6uGmyC;cgZm@gYyDN3}m(t0|Nudeo#Dt%m(p6c>^Q{k{5x>gVclk2ntJ( z`#^Ss<Rzf~0f~e3gZQBQ1ak{Wtu)vz4fY`Qpzs9g1-S?0XHZ;#^n%pEXjukka9o1q zK<)*_5h!j!`qiNE0TKh*2jYX`36ws}7+Aq^1o9`yN{~H27?>D9Y1WZ}l>y`zQ3eJE zkpDp8V+#!%F$M+(kT{4Ba)T7Kj16P}m2RN8VqgG?fy{)7$udC1K>mb@fzmce9mp*K z4D8_aAkP5N4^j`32ZhB%23D{fD4l}r2B`tL4-___^aqMtko)Wym>EEPkh;GNj0_eG Gj0^zCZ-?&y diff --git a/projects/particle_simulation/src/ParticleSystem.cpp b/projects/particle_simulation/src/ParticleSystem.cpp index daf9a16d..b3162d6b 100644 --- a/projects/particle_simulation/src/ParticleSystem.cpp +++ b/projects/particle_simulation/src/ParticleSystem.cpp @@ -54,3 +54,7 @@ void ParticleSystem::setRdmVelocity( glm::vec3 minVelocity, glm::vec3 maxVelocit m_rdmVel[1] = std::uniform_real_distribution<float> (minVelocity.y,maxVelocity.y); m_rdmVel[2] = std::uniform_real_distribution<float> (minVelocity.z,maxVelocity.z); } + +const glm::vec3 ParticleSystem::getRespawnPos() const{ + return m_respawnPos; +} diff --git a/projects/particle_simulation/src/ParticleSystem.hpp b/projects/particle_simulation/src/ParticleSystem.hpp index 2afb8253..fe5c99f9 100644 --- a/projects/particle_simulation/src/ParticleSystem.hpp +++ b/projects/particle_simulation/src/ParticleSystem.hpp @@ -14,6 +14,8 @@ public: void setRespawnPos( const glm::vec3 respawnPos ); void setRdmLifeTime( const glm::vec2 lifeTime ); void setRdmVelocity( glm::vec3 minVelocity, glm::vec3 maxVelocity ); + const glm::vec3 getRespawnPos() const; + private: void addParticle( const Particle particle ); diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index a9c3e259..5305be84 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -120,9 +120,9 @@ int main(int argc, const char **argv) { 1 ); - glm::vec3 minVelocity = glm::vec3(-0.0f,-0.0f,0.f); - glm::vec3 maxVelocity = glm::vec3(0.0f,0.0f,0.f); - glm::vec2 lifeTime = glm::vec2(0.f,5.f); + glm::vec3 minVelocity = glm::vec3(-0.1f,-0.1f,0.f); + glm::vec3 maxVelocity = glm::vec3(0.1f,0.1f,0.f); + glm::vec2 lifeTime = glm::vec2(0.f,2.f); ParticleSystem particleSystem = ParticleSystem( 100 , minVelocity, maxVelocity, lifeTime); vkcv::Buffer<Particle> particleBuffer = core.createBuffer<Particle>( @@ -164,6 +164,7 @@ int main(int argc, const char **argv) { window.e_mouseMove.add([&](double offsetX, double offsetY) { pos = glm::vec2(static_cast<float>(offsetX), static_cast<float>(offsetY)); +// std::cout << offsetX << " , " << offsetY << std::endl; // borders are assumed to be 0.5 //pos = glm::vec2((pos.x -0.5f * static_cast<float>(window.getWidth()))/static_cast<float>(window.getWidth()), (pos.y -0.5f * static_cast<float>(window.getHeight()))/static_cast<float>(window.getHeight())); //borders are assumed to be 1 @@ -173,11 +174,11 @@ int main(int argc, const char **argv) { glm::vec4 row2 = glm::row(cameraManager.getCamera(0).getView(), 1); glm::vec4 row3 = glm::row(cameraManager.getCamera(0).getView(), 2); glm::vec4 camera_pos = glm::column(cameraManager.getCamera(0).getView(), 3); - std::cout << "row1: " << row1.x << ", " << row1.y << ", " << row1.z << std::endl; - std::cout << "row2: " << row2.x << ", " << row2.y << ", " << row2.z << std::endl; - std::cout << "row3: " << row3.x << ", " << row3.y << ", " << row3.z << std::endl; - std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl; - std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl; +// std::cout << "row1: " << row1.x << ", " << row1.y << ", " << row1.z << std::endl; +// std::cout << "row2: " << row2.x << ", " << row2.y << ", " << row2.z << std::endl; +// std::cout << "row3: " << row3.x << ", " << row3.y << ", " << row3.z << std::endl; +// std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl; +// std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl; //glm::vec4 view_axis = glm::row(cameraManager.getCamera().getView(), 2); // std::cout << "view_axis: " << view_axis.x << ", " << view_axis.y << ", " << view_axis.z << std::endl; //std::cout << "Front: " << cameraManager.getCamera().getFront().x << ", " << cameraManager.getCamera().getFront().z << ", " << cameraManager.getCamera().getFront().z << std::endl; @@ -186,15 +187,12 @@ int main(int argc, const char **argv) { tempPosition = viewmat * glm::vec4(spawnPosition, 1.0f); spawnPosition = glm::vec3(tempPosition.x, tempPosition.y, tempPosition.z); particleSystem.setRespawnPos(glm::vec3(-spawnPosition.x, -spawnPosition.y, spawnPosition.z)); - std::cout << "respawn pos: " << spawnPosition.x << ", " << spawnPosition.y << ", " << spawnPosition.z << std::endl; +// std::cout << "respawn pos: " << spawnPosition.x << ", " << spawnPosition.y << ", " << spawnPosition.z << std::endl; }); std::vector<glm::mat4> modelMatrices; std::vector<vkcv::DrawcallInfo> drawcalls; - for (auto particle : particleSystem.getParticles()) { - modelMatrices.push_back(glm::translate(glm::mat4(1.f), particle.getPosition())); - drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage})); - } + drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage}, particleSystem.getParticles().size())); auto start = std::chrono::system_clock::now(); @@ -215,41 +213,36 @@ int main(int argc, const char **argv) { } color.fill(&colorData); - - position.fill(&pos); + auto end = std::chrono::system_clock::now(); - auto deltatime = std::chrono::duration_cast<std::chrono::microseconds>(end - start); + float deltatime = 0.000001 * static_cast<float>( std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() ); start = end; - particleSystem.updateParticles(0.000001 * static_cast<float>(deltatime.count())); + particleSystem.updateParticles(deltatime); - modelMatrices.clear(); - for (Particle particle : particleSystem.getParticles()) { - modelMatrices.push_back(glm::translate(glm::mat4(1.f), particle.getPosition())); - } - - cameraManager.update(0.000001 * static_cast<double>(deltatime.count())); + cameraManager.update(deltatime); std::vector<glm::mat4> mvp; mvp.clear(); - for (const auto &m : modelMatrices) { - mvp.push_back(m * cameraManager.getActiveCamera().getMVP()); - } + mvp.push_back( cameraManager.getCamera(0).getMVP()); - vkcv::PushConstantData pushConstantData((void *) mvp.data(), sizeof(glm::mat4)); auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); + glm::vec4 pushData = glm::vec4(particleSystem.getRespawnPos(),deltatime); + + vkcv::PushConstantData pushConstantDataCompute( &pushData, sizeof(glm::vec4)); uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/64.f)),1,1}; core.recordComputeDispatchToCmdStream(cmdStream, computePipeline, computeDispatchCount, {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet).vulkanHandle)}, - vkcv::PushConstantData(nullptr, 0)); + pushConstantDataCompute); + vkcv::PushConstantData pushConstantDataDraw((void *) mvp.data(), sizeof(glm::mat4)); core.recordDrawcallsToCmdStream( cmdStream, particlePass, particlePipeline, - pushConstantData, + pushConstantDataDraw, {drawcalls}, {swapchainInput}); core.prepareSwapchainImageForPresent(cmdStream); diff --git a/src/vkcv/DrawcallRecording.cpp b/src/vkcv/DrawcallRecording.cpp index df7b7bbc..5e0ef6ba 100644 --- a/src/vkcv/DrawcallRecording.cpp +++ b/src/vkcv/DrawcallRecording.cpp @@ -36,10 +36,10 @@ namespace vkcv { if (drawcall.mesh.indexBuffer) { cmdBuffer.bindIndexBuffer(drawcall.mesh.indexBuffer, 0, vk::IndexType::eUint16); //FIXME: choose proper size - cmdBuffer.drawIndexed(drawcall.mesh.indexCount, 1, 0, 0, {}); + cmdBuffer.drawIndexed(drawcall.mesh.indexCount, drawcall.instanceCount, 0, 0, {}); } else { cmdBuffer.draw(drawcall.mesh.indexCount, 1, 0, 0, {}); } } -} \ No newline at end of file +} -- GitLab