feat: square indicies

This commit is contained in:
2020-06-01 21:08:45 +02:00
parent 56cc09ea22
commit df42db1cbe
2 changed files with 43 additions and 4 deletions

View File

@@ -43,10 +43,20 @@ struct Vertex {
} }
}; };
//const std::vector<Vertex> vertices = {
// {{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}},
// {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
// {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
//};
const std::vector<Vertex> vertices = { const std::vector<Vertex> vertices = {
{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}},
{{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, {{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}},
{{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}, {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}},
};
const std::vector<uint16_t> indices = {
0, 1, 2, 2, 3, 0,
}; };
VkShaderModule HelloTriangleApplication::createShaderModule(const std::vector<char> &code) { VkShaderModule HelloTriangleApplication::createShaderModule(const std::vector<char> &code) {
@@ -423,6 +433,27 @@ void HelloTriangleApplication::createVertexBuffer() {
vkFreeMemory(myVkInstance->device, stagingBufferMemory, nullptr); vkFreeMemory(myVkInstance->device, stagingBufferMemory, nullptr);
} }
void HelloTriangleApplication::createIndexBuffer() {
VkDeviceSize bufferSize = sizeof(indices[0]) * indices.size();
VkBuffer stagingBuffer;
VkDeviceMemory stagingBufferMemory;
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);
void* data;
vkMapMemory(myVkInstance->device, stagingBufferMemory, 0, bufferSize, 0, &data);
memcpy(data, indices.data(), (size_t)bufferSize);
vkUnmapMemory(myVkInstance->device, stagingBufferMemory);
createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBuffer, indexBufferMemory);
copyBuffer(stagingBuffer, indexBuffer, bufferSize);
vkDestroyBuffer(myVkInstance->device, stagingBuffer, nullptr);
vkFreeMemory(myVkInstance->device, stagingBufferMemory, nullptr);
}
void HelloTriangleApplication::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) { void HelloTriangleApplication::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) {
VkCommandBufferAllocateInfo commandBufferAllocateInfo{ VkCommandBufferAllocateInfo commandBufferAllocateInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
@@ -505,7 +536,8 @@ void HelloTriangleApplication::createCommandBuffers() {
VkBuffer vertexBuffers[] = {vertexBuffer}; VkBuffer vertexBuffers[] = {vertexBuffer};
VkDeviceSize offset[] = {0}; VkDeviceSize offset[] = {0};
vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offset); vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offset);
vkCmdDraw(commandBuffers[i], static_cast<uint32_t>(vertices.size()), 1, 0, 0); vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
vkCmdEndRenderPass(commandBuffers[i]); vkCmdEndRenderPass(commandBuffers[i]);
if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) { if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) {
throw std::runtime_error{"Failed to record command buffer"}; throw std::runtime_error{"Failed to record command buffer"};
@@ -543,6 +575,7 @@ void HelloTriangleApplication::initVulkan() {
createFrameBuffers(); createFrameBuffers();
createCommandPool(); createCommandPool();
createVertexBuffer(); createVertexBuffer();
createIndexBuffer();
createCommandBuffers(); createCommandBuffers();
createSyncObjects(); createSyncObjects();
} }
@@ -669,6 +702,9 @@ void HelloTriangleApplication::cleanup() {
vkDestroyBuffer(myVkInstance->device, vertexBuffer, nullptr); vkDestroyBuffer(myVkInstance->device, vertexBuffer, nullptr);
vkFreeMemory(myVkInstance->device, vertexBufferMemory, nullptr); vkFreeMemory(myVkInstance->device, vertexBufferMemory, nullptr);
vkDestroyBuffer(myVkInstance->device, indexBuffer, nullptr);
vkFreeMemory(myVkInstance->device, indexBufferMemory, nullptr);
for (int i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) { for (int i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
vkDestroySemaphore(myVkInstance->device, renderFinishedSemaphores[i], nullptr); vkDestroySemaphore(myVkInstance->device, renderFinishedSemaphores[i], nullptr);
vkDestroySemaphore(myVkInstance->device, imageAvailableSemaphores[i], nullptr); vkDestroySemaphore(myVkInstance->device, imageAvailableSemaphores[i], nullptr);

View File

@@ -32,6 +32,8 @@ private:
std::vector<VkFramebuffer> swapChainFrameBuffers; std::vector<VkFramebuffer> swapChainFrameBuffers;
VkBuffer vertexBuffer; VkBuffer vertexBuffer;
VkDeviceMemory vertexBufferMemory; VkDeviceMemory vertexBufferMemory;
VkBuffer indexBuffer;
VkDeviceMemory indexBufferMemory;
VkCommandPool commandPool; VkCommandPool commandPool;
std::vector<VkCommandBuffer> commandBuffers; std::vector<VkCommandBuffer> commandBuffers;
@@ -50,6 +52,7 @@ private:
void createFrameBuffers(); void createFrameBuffers();
void createCommandPool(); void createCommandPool();
void createVertexBuffer(); void createVertexBuffer();
void createIndexBuffer();
void createCommandBuffers(); void createCommandBuffers();
void createSyncObjects(); void createSyncObjects();
void initVulkan(); void initVulkan();