インデックスバッファー
テクニカル諏訪子 <suwako@076.moe>、2026-07-22 10:49
コミット 4848c56757038a8d253546ec222235bf36dee92a
・親 0ce43e8
・ファイルを見る
2個のファイル、+44 -14
| @@ -43,6 +43,8 @@ | ||
| 43 | 43 | |
| 44 | 44 | vk::Buffer vertBuf = nullptr; |
| 45 | 45 | vk::DeviceMemory vertBufMem = nullptr; |
| 46 | +vk::Buffer idxBuf = nullptr; | |
| 47 | +vk::DeviceMemory idxBufMem = nullptr; | |
| 46 | 48 | |
| 47 | 49 | #pragma region debugCallback |
| 48 | 50 | static VKAPI_ATTR vk::Bool32 VKAPI_CALL debugCallback( |
| @@ -254,12 +256,13 @@ | ||
| 254 | 256 | cmdBuf.beginRendering(renderingInfo); |
| 255 | 257 | cmdBuf.bindPipeline(vk::PipelineBindPoint::eGraphics, gfxPipeline); |
| 256 | 258 | cmdBuf.bindVertexBuffers(0, vertBuf, {0}); |
| 259 | + cmdBuf.bindIndexBuffer(idxBuf, 0, vk::IndexType::eUint16); | |
| 257 | 260 | cmdBuf.setViewport(0, vk::Viewport(0.f, 0.f, |
| 258 | 261 | static_cast<float>(swapChainExtent.width), |
| 259 | 262 | static_cast<float>(swapChainExtent.height), |
| 260 | 263 | 0.f, 1.f)); |
| 261 | 264 | 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); | |
| 263 | 266 | cmdBuf.endRendering(); |
| 264 | 267 | |
| 265 | 268 | transitionImgLayout(imgIdx, |
| @@ -646,18 +649,39 @@ | ||
| 646 | 649 | #pragma endregion |
| 647 | 650 | |
| 648 | 651 | #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); | |
| 652 | 656 | |
| 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); | |
| 656 | 660 | |
| 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 | + } | |
| 659 | 666 | #pragma endregion |
| 660 | 667 | |
| 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 | + | |
| 661 | 685 | #pragma region commandbuffers |
| 662 | 686 | vk::CommandBufferAllocateInfo allocInfo = {}; |
| 663 | 687 | allocInfo.commandPool = cmdPool; |
| @@ -761,8 +785,8 @@ | ||
| 761 | 785 | #pragma region destroy |
| 762 | 786 | if (device) device.waitIdle(); |
| 763 | 787 | 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); | |
| 766 | 790 | if (vertBuf) device.destroyBuffer(vertBuf); |
| 767 | 791 | if (vertBufMem) device.freeMemory(vertBufMem); |
| 768 | 792 | if (gfxPipeline) device.destroyPipeline(gfxPipeline); |
| @@ -61,7 +61,13 @@ | ||
| 61 | 61 | }; |
| 62 | 62 | |
| 63 | 63 | 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, | |
| 67 | 73 | }; |