Added a Index Buffer and created a Quad out of 2 triangles

This commit is contained in:
Rebekah 2024-07-15 08:54:37 -04:00
parent 1350d6adf7
commit 7e429da9ae
Signed by: oneechanhax
GPG Key ID: 0074BF373B812798

View File

@ -109,10 +109,8 @@ class VulkanExampleApplication {
}
} vk_physical_card_info;
std::unique_ptr<vk::raii::DeviceMemory> vk_buffer_vertex_memory; // in order to get a clean desctruction sequence, instantiate the DeviceMemory for the vertex buffer first
std::unique_ptr<vk::raii::Buffer> vk_buffer_vertex; // https://github.com/KhronosGroup/Vulkan-Hpp/blob/6f72ceca515d59f40d64b64cf2734f6261e1f9f2/RAII_Samples/13_InitVertexBuffer/13_InitVertexBuffer.cpp
std::unique_ptr<vk::raii::DeviceMemory> vk_buffer_vertex_staging_memory; // optional, but speeds things up!
std::unique_ptr<vk::raii::Buffer> vk_buffer_vertex_staging;
std::pair<std::unique_ptr<vk::raii::Buffer>, std::unique_ptr<vk::raii::DeviceMemory>> vk_buffer_vertex; // in order to get a clean desctruction sequence, instantiate the DeviceMemory for the vertex buffer first // https://github.com/KhronosGroup/Vulkan-Hpp/blob/6f72ceca515d59f40d64b64cf2734f6261e1f9f2/RAII_Samples/13_InitVertexBuffer/13_InitVertexBuffer.cpp
std::pair<std::unique_ptr<vk::raii::Buffer>, std::unique_ptr<vk::raii::DeviceMemory>> vk_buffer_index; // used to make rendering models more efficent by sharing values
struct Vertex {
glm::vec2 pos;
@ -142,10 +140,14 @@ class VulkanExampleApplication {
return attribute_descriptions;
}
};
static inline const std::vector<Vertex> triangle_vertices = {
{ { 0.0f, -0.5f }, { 1.0f, 1.0f, 1.0f } },
{ { 0.5f, 0.5f }, { 0.0f, 1.0f, 0.0f } },
{ { -0.5f, 0.5f }, { 0.0f, 0.0f, 1.0f } }
static inline const std::vector<Vertex> quad_vertices = {
{ { -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, 0.0f, 1.0f } },
{ { -0.5f, 0.5f }, { 1.0f, 1.0f, 1.0f } }
};
static inline const std::vector<std::uint16_t> quad_indexes = {
0, 1, 2, 2, 3, 0 // Wraps a quad-box's 2 triangles around itself. // https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/03_Index_buffer.html
};
public:
@ -646,15 +648,27 @@ public:
this->vk_command_buffers = std::make_unique<vk::raii::CommandBuffers>(*this->vk_gpu, command_buffer_alloc_info);
}
{
const auto vertex_buffer_size = sizeof(triangle_vertices[0]) * triangle_vertices.size();
std::tie(this->vk_buffer_vertex_staging, this->vk_buffer_vertex_staging_memory) = CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
// vertex
const auto vertex_buffer_size = sizeof(quad_vertices[0]) * quad_vertices.size();
const auto vertex_buffer_staging = this->CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
std::uint8_t* const vertex_buffer_data = static_cast<std::uint8_t*>(this->vk_buffer_vertex_staging_memory->mapMemory(0, vertex_buffer_size));
memcpy(vertex_buffer_data, triangle_vertices.data(), vertex_buffer_size);
this->vk_buffer_vertex_staging_memory->unmapMemory();
std::uint8_t* const vertex_buffer_data = static_cast<std::uint8_t*>(vertex_buffer_staging.second->mapMemory(0, vertex_buffer_size));
memcpy(vertex_buffer_data, quad_vertices.data(), vertex_buffer_size);
vertex_buffer_staging.second->unmapMemory();
std::tie(this->vk_buffer_vertex, this->vk_buffer_vertex_memory) = CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal);
this->CopyBuffer(*this->vk_buffer_vertex_staging, *this->vk_buffer_vertex, vertex_buffer_size);
this->vk_buffer_vertex = CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal);
this->CopyBuffer(*vertex_buffer_staging.first, *this->vk_buffer_vertex.first, vertex_buffer_size);
// index
const auto index_buffer_size = sizeof(quad_indexes[0]) * quad_indexes.size();
const auto index_buffer_staging = this->CreateBuffer(index_buffer_size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
std::uint8_t* const indicies_buffer_data = static_cast<std::uint8_t*>(index_buffer_staging.second->mapMemory(0, index_buffer_size));
memcpy(indicies_buffer_data, quad_indexes.data(), index_buffer_size);
index_buffer_staging.second->unmapMemory();
this->vk_buffer_index = CreateBuffer(index_buffer_size, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal);
this->CopyBuffer(*index_buffer_staging.first, *this->vk_buffer_index.first, index_buffer_size);
}
{ // syncronizing vars
this->vk_semephore_image_available = std::make_unique<vk::raii::Semaphore>(*this->vk_gpu, vk::SemaphoreCreateInfo {});
@ -676,7 +690,8 @@ public:
}
protected:
std::pair<std::unique_ptr<vk::raii::Buffer>, std::unique_ptr<vk::raii::DeviceMemory>> CreateBuffer(vk::DeviceSize wanted_size, vk::BufferUsageFlags wanted_usage, vk::MemoryPropertyFlags wanted_properties) {
std::pair<std::unique_ptr<vk::raii::Buffer>, std::unique_ptr<vk::raii::DeviceMemory>>
CreateBuffer(vk::DeviceSize wanted_size, vk::BufferUsageFlags wanted_usage, vk::MemoryPropertyFlags wanted_properties) {
const vk::BufferCreateInfo buffer_create_info {
.size = wanted_size,
.usage = wanted_usage,
@ -833,10 +848,11 @@ public:
command_buffer.beginRenderPass(render_pass_info, vk::SubpassContents::eInline);
command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics, **this->vk_pipeline);
command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *this->vk_pipeline_layout, 0, { this->vk_descriptor_sets->front() }, nullptr);
command_buffer.bindVertexBuffers(0, { **this->vk_buffer_vertex }, { 0 });
command_buffer.bindVertexBuffers(0, { **this->vk_buffer_vertex.first }, { 0 });
command_buffer.bindIndexBuffer(**this->vk_buffer_index.first, 0, vk::IndexType::eUint16);
this->RecordDynamic(command_buffer);
command_buffer.draw(3, 1, 0, 0);
command_buffer.drawIndexed(static_cast<uint32_t>(quad_indexes.size()), 1, 0, 0, 0);
command_buffer.endRenderPass();
command_buffer.end();