Пример использования класса модели с индексным буфером

This commit is contained in:
parent 10b58f8556
commit 116a474c5f
3 changed files with 51 additions and 24 deletions

View File

@ -9,6 +9,9 @@
#include "Queue.h" #include "Queue.h"
#include <map> #include <map>
#include <list>
#include "Model.h"
class Vulkan class Vulkan
{ {
@ -20,6 +23,9 @@ class Vulkan
void renderEnd(); // Окончание рендера кадра void renderEnd(); // Окончание рендера кадра
VkBuffer createDataBuffer(void* data, VkDeviceSize size, VkBufferUsageFlags usage); // Создание буфера данных VkBuffer createDataBuffer(void* data, VkDeviceSize size, VkBufferUsageFlags usage); // Создание буфера данных
void destroyBuffer(VkBuffer buffer); // Уничтожение буфера и освобождение его памяти void destroyBuffer(VkBuffer buffer); // Уничтожение буфера и освобождение его памяти
void addToRenderList(I_Model* model); // Добавление модели в список рендера
void removeFromRenderList(I_Model* model); // Удалеие модели из список рендера
void clearRenderList(); // Очистка списка рендера моделей
private: private:
VkInstance instance; // Экземпляр Vulkan VkInstance instance; // Экземпляр Vulkan
PhysicalDevice physicalDevice; // Физическое устройство PhysicalDevice physicalDevice; // Физическое устройство
@ -42,6 +48,7 @@ class Vulkan
uint32_t imageIndex; // Текущее изображение из списка показа uint32_t imageIndex; // Текущее изображение из списка показа
std::map<VkBuffer, std::pair<VkDevice, VkDeviceMemory>> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти std::map<VkBuffer, std::pair<VkDevice, VkDeviceMemory>> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти
std::list<I_Model*> renderList; // Спискок моделей для рендера
// Структура для хранения флагов // Структура для хранения флагов
struct struct

View File

@ -2,11 +2,26 @@
#include <iostream> #include <iostream>
#include "Model.h"
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
// объект класса-обертки Vulkan API // объект класса-обертки Vulkan API
extern Vulkan vulkan; extern Vulkan vulkan;
//Вершины, записываемые в буфер
Vertex 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} }
};
// Индексы, записываемые в буфер
uint32_t indices[] = {0, 1, 2, 2, 3, 0};
I_Model * model;
// Инициализация GLFW // Инициализация GLFW
glfwInit(); glfwInit();
@ -23,6 +38,9 @@ int main(int argc, char* argv[])
// Инициализация Vulkan API // Инициализация Vulkan API
vulkan.init(window); vulkan.init(window);
model = new Model_w_indexes(vertices, 4, indices, 6);
vulkan.addToRenderList(model);
// Жизненный цикл // Жизненный цикл
while(!glfwWindowShouldClose(window)) while(!glfwWindowShouldClose(window))
{ {
@ -31,6 +49,8 @@ int main(int argc, char* argv[])
vulkan.renderFrame(); vulkan.renderFrame();
} }
delete model;
// Уничтожение окна // Уничтожение окна
glfwDestroyWindow(window); glfwDestroyWindow(window);

View File

@ -24,23 +24,6 @@ void Vulkan::init(GLFWwindow* window)
createFramebuffers(); // Создание буферов кадра createFramebuffers(); // Создание буферов кадра
createGraphicPipeline(); // Создание графического конвейера createGraphicPipeline(); // Создание графического конвейера
createCommandPool(); // Создание пула команд createCommandPool(); // Создание пула команд
//Вершины, записываемые в буфер
Vertex 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} }
};
// Размер буфера в байтах
VkDeviceSize bufferSize = sizeof(Vertex) * 4;
vertexBuffer = createDataBuffer(vertices, bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); // Создание буфера вершин
// Индексы, записываемые в буфер
uint16_t indices[] = {0, 1, 2, 2, 3, 0};
// Размер буфера в байтах
bufferSize = sizeof(uint16_t) * 6;
indexBuffer = createDataBuffer(indices, bufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT); // Создание буфера индексов
createSyncObjects(); // Создание объектов синхронизации createSyncObjects(); // Создание объектов синхронизации
} }
@ -991,13 +974,10 @@ void Vulkan::renderFrame()
{ {
renderBegin(); // Начало рендера renderBegin(); // Начало рендера
VkBuffer vertexBuffers[] = {vertexBuffer}; for (auto const& model : renderList)
VkDeviceSize offsets[] = {0}; {
vkCmdBindVertexBuffers(commandBuffers[currentFrame], 0, 1, vertexBuffers, offsets); model->render(commandBuffers[currentFrame]);
}
vkCmdBindIndexBuffer(commandBuffers[currentFrame], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(commandBuffers[currentFrame], 6, 1, 0, 0, 0);
renderEnd(); // Конец рендера renderEnd(); // Конец рендера
} }
@ -1099,3 +1079,23 @@ void Vulkan::renderEnd()
throw std::runtime_error("Unable to present swap chain image"); throw std::runtime_error("Unable to present swap chain image");
} }
} }
// Добавление модели в список рендера
void Vulkan::addToRenderList(I_Model* model)
{
if (model)
renderList.push_back(model);
}
// Удалеие модели из список рендера
void Vulkan::removeFromRenderList(I_Model* model)
{
if (model)
renderList.remove(model);
}
// Очистка списка рендера моделей
void Vulkan::clearRenderList()
{
renderList.clear();
}