using index buffer

This commit is contained in:
IlyaShurupov 2024-11-18 14:10:51 +03:00
parent eb269cc88e
commit a6f4b253ae

View file

@ -45,11 +45,14 @@ const std::vector<const char *> gValidationLayers = {
};
const std::vector<Vertex> vertices = {
{{0.f, -0.5f}, {1.f, 0.f, 0.f}},
{{0.5f, 0.5f}, {0.f, 1.f, 0.f}},
{{-0.5f, 0.5f}, {0.f, 0.f, 1.f}},
{{-0.5f, -0.5f}, {1.f, 0.f, 0.f}},
{{0.5f, -0.5f}, {0.f, 1.f, 0.f}},
{{0.5f, 0.5f}, {0.f, 0.f, 1.f}},
{{-0.5f, 0.5f}, {1.f, 1.f, 1.f}},
};
const std::vector<uint16_t > indices = { 0, 1, 2, 2, 3, 0 };
class Application {
public:
void run() {
@ -107,6 +110,7 @@ private:
createSynchronizationObjects();
createVertexBuffer();
createIndexBuffer();
}
void mainLoop() {
@ -782,7 +786,32 @@ private:
}
throw std::runtime_error("no suitable memory for vertex buffer found");
return {};
}
void createIndexBuffer() {
VkDeviceSize size = sizeof(indices[0]) * indices.size();
VkBuffer stagingBuffer;
VkDeviceMemory stagingBufferMemory;
createBuffer(&stagingBuffer, &stagingBufferMemory,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size,
VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
{
void* memory;
vkMapMemory(mDevice, stagingBufferMemory, 0, size, 0, &memory);
memcpy(memory, indices.data(), size);
vkUnmapMemory(mDevice, stagingBufferMemory);
}
createBuffer(&mIndexBuffer, &mIndexBufferMemory,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, size,
VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
copyBuffer(stagingBuffer, mIndexBuffer, size);
destroyBuffer(stagingBuffer, stagingBufferMemory);
}
void createVertexBuffer() {
@ -931,8 +960,9 @@ private:
VkBuffer vertexBuffers[] = { mVertexBuffer };
VkDeviceSize offsets[] = { 0 };
vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets);
vkCmdBindIndexBuffer(commandBuffer, mIndexBuffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdDraw(commandBuffer, vertices.size(), 1, 0, 0);
vkCmdDrawIndexed(commandBuffer, indices.size(), 1, 0, 0, 0);
vkCmdEndRenderPass(commandBuffer);
@ -1014,10 +1044,6 @@ private:
*/
}
void createBuffer() {
}
static VkVertexInputBindingDescription getShaderVertexInputDescription() {
return {
.binding = 0,
@ -1054,6 +1080,7 @@ private:
void cleanup() {
destroyBuffer(mVertexBuffer, mVertexBufferMemory);
destroyBuffer(mIndexBuffer, mIndexBufferMemory);
destroySynchronizationObjects();
@ -1115,6 +1142,8 @@ private:
VkBuffer mVertexBuffer = VK_NULL_HANDLE;
VkDeviceMemory mVertexBufferMemory = VK_NULL_HANDLE;
VkBuffer mIndexBuffer = VK_NULL_HANDLE;
VkDeviceMemory mIndexBufferMemory = VK_NULL_HANDLE;
};
int main() {