インデックスバッファー

テクニカル諏訪子 <suwako@076.moe>、2026-07-22 10:49
コミット 4848c56757038a8d253546ec222235bf36dee92a ・親 0ce43e8 ・ファイルを見る

2個のファイル、+44 -14

@@ -43,6 +43,8 @@
4343
4444 vk::Buffer vertBuf = nullptr;
4545 vk::DeviceMemory vertBufMem = nullptr;
46+vk::Buffer idxBuf = nullptr;
47+vk::DeviceMemory idxBufMem = nullptr;
4648
4749 #pragma region debugCallback
4850 static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback(
@@ -254,12 +256,13 @@
254256 cmdBuf.beginRendering(renderingInfo);
255257 cmdBuf.bindPipeline(vk::PipelineBindPoint::eGraphics, gfxPipeline);
256258 cmdBuf.bindVertexBuffers(0, vertBuf, {0});
259+ cmdBuf.bindIndexBuffer(idxBuf, 0, vk::IndexType::eUint16);
257260 cmdBuf.setViewport(0, vk::Viewport(0.f, 0.f,
258261 static_cast<float>(swapChainExtent.width),
259262 static_cast<float>(swapChainExtent.height),
260263 0.f, 1.f));
261264 cmdBuf.setScissor(0, vk::Rect2D(vk::Offset2D(0, 0), swapChainExtent));
262- cmdBuf.draw(static_cast<uint32_t>(vertices.size()), 1, 0, 0);
265+ cmdBuf.drawIndexed(static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
263266 cmdBuf.endRendering();
264267
265268 transitionImgLayout(imgIdx,
@@ -646,18 +649,39 @@
646649 #pragma endregion
647650
648651 #pragma region vertexBuffer
649- vk::DeviceSize bufSize = sizeof(vertices[0]) * vertices.size();
650- vk::MemoryPropertyFlags flags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
651- auto [stagingBuf, stagingBufMem] = createBuffer(bufSize, vk::BufferUsageFlagBits::eTransferSrc, flags);
652+ {
653+ vk::DeviceSize bufSize = sizeof(vertices[0]) * vertices.size();
654+ vk::MemoryPropertyFlags flags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
655+ auto [stagingBuf, stagingBufMem] = createBuffer(bufSize, vk::BufferUsageFlagBits::eTransferSrc, flags);
652656
653- void *dataStaging = device.mapMemory(stagingBufMem, 0, bufSize);
654- memcpy(dataStaging, vertices.data(), bufSize);
655- device.unmapMemory(stagingBufMem);
657+ void *dataStaging = device.mapMemory(stagingBufMem, 0, bufSize);
658+ memcpy(dataStaging, vertices.data(), bufSize);
659+ device.unmapMemory(stagingBufMem);
656660
657- std::tie(vertBuf, vertBufMem) = createBuffer(bufSize, vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
658- copyBuffer(stagingBuf, vertBuf, bufSize);
661+ std::tie(vertBuf, vertBufMem) = createBuffer(bufSize, vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
662+ copyBuffer(stagingBuf, vertBuf, bufSize);
663+ if (stagingBuf) device.destroyBuffer(stagingBuf);
664+ if (stagingBufMem) device.freeMemory(stagingBufMem);
665+ }
659666 #pragma endregion
660667
668+#pragma region indexBuffer
669+ {
670+ vk::DeviceSize bufSize = sizeof(indices[0]) * indices.size();
671+ vk::MemoryPropertyFlags flags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
672+ auto [stagingBuf, stagingBufMem] = createBuffer(bufSize, vk::BufferUsageFlagBits::eTransferSrc, flags);
673+
674+ void *dataStaging = device.mapMemory(stagingBufMem, 0, bufSize);
675+ memcpy(dataStaging, indices.data(), (size_t)bufSize);
676+ device.unmapMemory(stagingBufMem);
677+
678+ std::tie(idxBuf, idxBufMem) = createBuffer(bufSize, vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
679+ copyBuffer(stagingBuf, idxBuf, bufSize);
680+ if (stagingBuf) device.destroyBuffer(stagingBuf);
681+ if (stagingBufMem) device.freeMemory(stagingBufMem);
682+ }
683+#pragma endregion
684+
661685 #pragma region commandbuffers
662686 vk::CommandBufferAllocateInfo allocInfo = {};
663687 allocInfo.commandPool = cmdPool;
@@ -761,8 +785,8 @@
761785 #pragma region destroy
762786 if (device) device.waitIdle();
763787 if (cmdPool) device.destroyCommandPool(cmdPool);
764- if (stagingBuf) device.destroyBuffer(stagingBuf);
765- if (stagingBufMem) device.freeMemory(stagingBufMem);
788+ if (idxBuf) device.destroyBuffer(idxBuf);
789+ if (idxBufMem) device.freeMemory(idxBufMem);
766790 if (vertBuf) device.destroyBuffer(vertBuf);
767791 if (vertBufMem) device.freeMemory(vertBufMem);
768792 if (gfxPipeline) device.destroyPipeline(gfxPipeline);
@@ -61,7 +61,13 @@
6161 };
6262
6363 inline const std::vector<Vertex> vertices = {
64- {{ 0.0f, -0.5f }, { 1.f, 0.f, 0.f }},
65- {{ 0.5f, 0.5f }, { 0.f, 1.f, 0.f }},
66- {{ -0.5f, 0.5f }, { 0.f, 0.f, 1.f }},
64+ {{ -0.5f, -0.5f }, { 1.f, 0.f, 0.f }},
65+ {{ 0.5f, -0.5f }, { 0.f, 1.f, 0.f }},
66+ {{ 0.5f, 0.5f }, { 0.f, 0.f, 1.f }},
67+ {{ -0.5f, 0.5f }, { 1.f, 1.f, 0.f }},
68+};
69+
70+inline const std::vector<uint16_t> indices = {
71+ 0, 1, 2,
72+ 2, 3, 0,
6773 };