From 116a474c5ffdb0856fbe9a1b14c607312a6a7f9a Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Thu, 7 Apr 2022 13:17:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D1=81=20=D0=B8=D0=BD=D0=B4?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=BD=D1=8B=D0=BC=20=D0=B1=D1=83=D1=84=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 7 +++++++ src/main.cpp | 20 ++++++++++++++++++++ src/vk.cpp | 48 ++++++++++++++++++++++++------------------------ 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/include/vk.h b/include/vk.h index 6ef2e42..a8b7c42 100644 --- a/include/vk.h +++ b/include/vk.h @@ -9,6 +9,9 @@ #include "Queue.h" #include +#include + +#include "Model.h" class Vulkan { @@ -20,6 +23,9 @@ class Vulkan void renderEnd(); // Окончание рендера кадра VkBuffer createDataBuffer(void* data, VkDeviceSize size, VkBufferUsageFlags usage); // Создание буфера данных void destroyBuffer(VkBuffer buffer); // Уничтожение буфера и освобождение его памяти + void addToRenderList(I_Model* model); // Добавление модели в список рендера + void removeFromRenderList(I_Model* model); // Удалеие модели из список рендера + void clearRenderList(); // Очистка списка рендера моделей private: VkInstance instance; // Экземпляр Vulkan PhysicalDevice physicalDevice; // Физическое устройство @@ -42,6 +48,7 @@ class Vulkan uint32_t imageIndex; // Текущее изображение из списка показа std::map> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти + std::list renderList; // Спискок моделей для рендера // Структура для хранения флагов struct diff --git a/src/main.cpp b/src/main.cpp index de4e4fb..8f953c0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,11 +2,26 @@ #include +#include "Model.h" + int main(int argc, char* argv[]) { // объект класса-обертки Vulkan API 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 glfwInit(); @@ -23,6 +38,9 @@ int main(int argc, char* argv[]) // Инициализация Vulkan API vulkan.init(window); + model = new Model_w_indexes(vertices, 4, indices, 6); + vulkan.addToRenderList(model); + // Жизненный цикл while(!glfwWindowShouldClose(window)) { @@ -31,6 +49,8 @@ int main(int argc, char* argv[]) vulkan.renderFrame(); } + delete model; + // Уничтожение окна glfwDestroyWindow(window); diff --git a/src/vk.cpp b/src/vk.cpp index ae259bc..e6c3876 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -24,23 +24,6 @@ void Vulkan::init(GLFWwindow* window) createFramebuffers(); // Создание буферов кадра createGraphicPipeline(); // Создание графического конвейера 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(); // Создание объектов синхронизации } @@ -991,13 +974,10 @@ void Vulkan::renderFrame() { renderBegin(); // Начало рендера - VkBuffer vertexBuffers[] = {vertexBuffer}; - VkDeviceSize offsets[] = {0}; - vkCmdBindVertexBuffers(commandBuffers[currentFrame], 0, 1, vertexBuffers, offsets); - - vkCmdBindIndexBuffer(commandBuffers[currentFrame], indexBuffer, 0, VK_INDEX_TYPE_UINT16); - - vkCmdDrawIndexed(commandBuffers[currentFrame], 6, 1, 0, 0, 0); + for (auto const& model : renderList) + { + model->render(commandBuffers[currentFrame]); + } renderEnd(); // Конец рендера } @@ -1099,3 +1079,23 @@ void Vulkan::renderEnd() 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(); +}