Changeset cae7a2c in opengl-game


Ignore:
Timestamp:
Jul 24, 2019, 2:59:33 AM (5 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
de32fda
Parents:
d9ef6ab
Message:

Use an index buffer to avoid having duplicate points in the vertex buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    rd9ef6ab rcae7a2c  
     1/*
     2DESIGN GUIDE
     3
     4I should store multiple buffers (e.g. vertex and index buffers) in the same VkBuffer and use offsets into it
     5*/
     6
    17#include "game-gui-glfw.hpp"
    28
     
    8591
    8692const vector<Vertex> vertices = {
    87    {{ 0.0f, -0.5f}, {1.0f, 1.0f, 1.0f}},
    88    {{ 0.5f,  0.5f}, {0.0f, 1.0f, 0.0f}},
    89    {{-0.5f,  0.5f}, {0.0f, 0.0f, 1.0f}}
     93   {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}},
     94   {{ 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}},
     95   {{ 0.5f,  0.5f}, {0.0f, 0.0f, 1.0f}},
     96   {{-0.5f,  0.5f}, {1.0f, 1.0f, 1.0f}}
     97};
     98
     99const vector<uint16_t> indices = {
     100   0, 1, 2, 2, 3, 0
    90101};
    91102
     
    153164      VkBuffer vertexBuffer;
    154165      VkDeviceMemory vertexBufferMemory;
     166      VkBuffer indexBuffer;
     167      VkDeviceMemory indexBufferMemory;
    155168
    156169      vector<VkFramebuffer> swapChainFramebuffers;
     
    194207         createCommandPool();
    195208         createVertexBuffer();
     209         createIndexBuffer();
    196210         createCommandBuffers();
    197211         createSyncObjects();
     
    879893      }
    880894
     895      void createIndexBuffer() {
     896         VkDeviceSize bufferSize = sizeof(indices[0]) * indices.size();
     897
     898         VkBuffer stagingBuffer;
     899         VkDeviceMemory stagingBufferMemory;
     900         createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
     901            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
     902            stagingBuffer, stagingBufferMemory);
     903
     904         void* data;
     905         vkMapMemory(device, stagingBufferMemory, 0, bufferSize, 0, &data);
     906         memcpy(data, indices.data(), (size_t)bufferSize);
     907         vkUnmapMemory(device, stagingBufferMemory);
     908
     909         createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
     910            VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBuffer, indexBufferMemory);
     911
     912         copyBuffer(stagingBuffer, indexBuffer, bufferSize);
     913
     914         vkDestroyBuffer(device, stagingBuffer, nullptr);
     915         vkFreeMemory(device, stagingBufferMemory, nullptr);
     916      }
     917
    881918      void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
    882919            VkBuffer& buffer, VkDeviceMemory& bufferMemory) {
     
    9961033            vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets);
    9971034
    998             vkCmdDraw(commandBuffers[i], static_cast<uint32_t>(vertices.size()), 1, 0, 0);
     1035            vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
     1036
     1037            vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
    9991038            vkCmdEndRenderPass(commandBuffers[i]);
    10001039
     
    11241163         cleanupSwapChain();
    11251164
     1165         vkDestroyBuffer(device, indexBuffer, nullptr);
     1166         vkFreeMemory(device, indexBufferMemory, nullptr);
     1167
    11261168         vkDestroyBuffer(device, vertexBuffer, nullptr);
    11271169         vkFreeMemory(device, vertexBufferMemory, nullptr);
Note: See TracChangeset for help on using the changeset viewer.