Compare commits
No commits in common. "master" and "v0.1" have entirely different histories.
|
@ -1,15 +0,0 @@
|
|||
#ifndef I_MODEL_H
|
||||
#define I_MODEL_H
|
||||
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
class I_Model
|
||||
{
|
||||
public:
|
||||
virtual ~I_Model() {}; // Виртуальный деструктор для корректной работы деструкторов в полиморфизме
|
||||
virtual void render(VkCommandBuffer commandBuffer) = 0;
|
||||
protected:
|
||||
virtual void bindBuffers(VkCommandBuffer commandBuffer) = 0;
|
||||
};
|
||||
|
||||
#endif // I_MODEL_H
|
|
@ -1,35 +0,0 @@
|
|||
#ifndef MODEL_H
|
||||
#define MODEL_H
|
||||
|
||||
#include "I_Model.h"
|
||||
#include "Vertex.h"
|
||||
|
||||
// Класс модели без индексов
|
||||
class Model_wo_indexes : public I_Model
|
||||
{
|
||||
public:
|
||||
Model_wo_indexes(Vertex* vertexArray, uint32_t verteciesCount);
|
||||
virtual ~Model_wo_indexes();
|
||||
virtual void render(VkCommandBuffer commandBuffer);
|
||||
protected:
|
||||
void bindBuffers(VkCommandBuffer commandBuffer); // привязка используемых буферов данных
|
||||
private:
|
||||
uint32_t verteciesCount; // Количество вершин
|
||||
VkBuffer vertexBuffer; // Буфер вершин
|
||||
};
|
||||
|
||||
// Класс модели с индексами
|
||||
class Model_w_indexes : public Model_wo_indexes
|
||||
{
|
||||
public:
|
||||
Model_w_indexes(Vertex* vertexArray, uint32_t verteciesCount, uint32_t* indexArray, uint32_t indeciesCount);
|
||||
virtual ~Model_w_indexes();
|
||||
virtual void render(VkCommandBuffer commandBuffer);
|
||||
protected:
|
||||
void bindBuffers(VkCommandBuffer commandBuffer); // привязка используемых буферов данных
|
||||
private:
|
||||
uint32_t indeciesCount; // Количество индексов
|
||||
VkBuffer indexBuffer; // Буфер индексов
|
||||
};
|
||||
|
||||
#endif // MODEL_H
|
13
include/vk.h
13
include/vk.h
|
@ -9,9 +9,6 @@
|
|||
#include "Queue.h"
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
|
||||
#include "Model.h"
|
||||
|
||||
class Vulkan
|
||||
{
|
||||
|
@ -19,13 +16,8 @@ class Vulkan
|
|||
void init(GLFWwindow* window); // инициализация
|
||||
void destroy(); // завершение работы
|
||||
void renderFrame(); // рендер кадра
|
||||
void renderBegin(); // Начало рендера кадра
|
||||
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; // Физическое устройство
|
||||
|
@ -41,6 +33,8 @@ class Vulkan
|
|||
VkPipeline graphicsPipeline; // Графический конвейер
|
||||
VkCommandPool commandPool; // Пул команд
|
||||
std::vector<VkCommandBuffer> commandBuffers; // Буферы команд
|
||||
VkBuffer vertexBuffer; // Буфер вершин
|
||||
VkBuffer indexBuffer; // Буфер индексов
|
||||
std::vector<VkSemaphore> imageAvailableSemaphores; // семафор доступности изображения
|
||||
std::vector<VkSemaphore> renderFinishedSemaphores; // семафор окончания рендера
|
||||
std::vector<VkFence> inWorkFences; // барьер кадра в работе
|
||||
|
@ -48,7 +42,6 @@ class Vulkan
|
|||
uint32_t imageIndex; // Текущее изображение из списка показа
|
||||
|
||||
std::map<VkBuffer, std::pair<VkDevice, VkDeviceMemory>> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти
|
||||
std::list<I_Model*> renderList; // Спискок моделей для рендера
|
||||
|
||||
// Структура для хранения флагов
|
||||
struct
|
||||
|
@ -71,6 +64,8 @@ class Vulkan
|
|||
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
|
||||
void createSyncObjects(); // Создание объектов синхронизации
|
||||
void createFramebuffers(); // Создание буферов кадра
|
||||
void renderBegin(); // Начало рендера кадра
|
||||
void renderEnd(); // Окончание рендера кадра
|
||||
};
|
||||
|
||||
#endif // VK_H
|
|
@ -1,70 +0,0 @@
|
|||
#include "Model.h"
|
||||
|
||||
#include "vk.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// Конструктор класса без индексов - принимает массив вершин
|
||||
Model_wo_indexes::Model_wo_indexes(Vertex* vertexArray, uint32_t count) : verteciesCount(count)
|
||||
{
|
||||
extern Vulkan vulkan;
|
||||
// Создание и инициализация буфера вершин
|
||||
vertexBuffer = vulkan.createDataBuffer(vertexArray, verteciesCount * sizeof(Vertex), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
|
||||
}
|
||||
|
||||
// Деструктор класса без индексов
|
||||
Model_wo_indexes::~Model_wo_indexes()
|
||||
{
|
||||
extern Vulkan vulkan;
|
||||
vulkan.destroyBuffer(vertexBuffer);
|
||||
}
|
||||
|
||||
// привзка используемых буферов данных
|
||||
void Model_wo_indexes::bindBuffers(VkCommandBuffer commandBuffer)
|
||||
{
|
||||
VkBuffer vertexBuffers[] = {vertexBuffer};
|
||||
VkDeviceSize offsets[] = {0};
|
||||
|
||||
vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets);
|
||||
}
|
||||
|
||||
// Рендер модели без индексов
|
||||
void Model_wo_indexes::render(VkCommandBuffer commandBuffer)
|
||||
{
|
||||
bindBuffers(commandBuffer);
|
||||
vkCmdDraw(commandBuffer, verteciesCount, 1, 0, 0);
|
||||
}
|
||||
|
||||
// Конструктор класса с индексами - принимает массивы вершин и индексов
|
||||
Model_w_indexes::Model_w_indexes(Vertex* vertexArray, uint32_t vCount, uint32_t* indexArray, uint32_t iCount)
|
||||
: Model_wo_indexes(vertexArray, vCount), indeciesCount(iCount)
|
||||
{
|
||||
extern Vulkan vulkan;
|
||||
// Создание и инициализация буфера индексов
|
||||
indexBuffer = vulkan.createDataBuffer(indexArray, indeciesCount * sizeof(uint32_t), VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
|
||||
}
|
||||
|
||||
// Деструктор класса с индексами
|
||||
Model_w_indexes::~Model_w_indexes()
|
||||
{
|
||||
extern Vulkan vulkan;
|
||||
vulkan.destroyBuffer(indexBuffer);
|
||||
}
|
||||
|
||||
// привзка используемых буферов данных
|
||||
void Model_w_indexes::bindBuffers(VkCommandBuffer commandBuffer)
|
||||
{
|
||||
// Привязка родительских буферов
|
||||
Model_wo_indexes::bindBuffers(commandBuffer);
|
||||
|
||||
// Привязка индексного буфера
|
||||
vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
|
||||
}
|
||||
|
||||
// Рендер модели с индексами
|
||||
void Model_w_indexes::render(VkCommandBuffer commandBuffer)
|
||||
{
|
||||
bindBuffers(commandBuffer);
|
||||
|
||||
vkCmdDrawIndexed(commandBuffer, indeciesCount, 1, 0, 0, 0);
|
||||
}
|
32
src/main.cpp
32
src/main.cpp
|
@ -1,26 +1,11 @@
|
|||
#include "vk.h"
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "Model.h"
|
||||
void vkInit();
|
||||
|
||||
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;
|
||||
int main(int argc, char* argv[]) {
|
||||
|
||||
// Инициализация GLFW
|
||||
glfwInit();
|
||||
|
@ -28,6 +13,9 @@ int main(int argc, char* argv[])
|
|||
// Проверка доступности Vulkan
|
||||
if (glfwVulkanSupported())
|
||||
{
|
||||
// объект класса-обертки Vulkan API
|
||||
Vulkan vulkan;
|
||||
|
||||
// Отключим создание контекста
|
||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||
// Отключим возможность изменения размеров окна
|
||||
|
@ -38,19 +26,13 @@ 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))
|
||||
{
|
||||
while(!glfwWindowShouldClose(window)) {
|
||||
// Обработка событий
|
||||
glfwPollEvents();
|
||||
vulkan.renderFrame();
|
||||
}
|
||||
|
||||
delete model;
|
||||
|
||||
// Уничтожение окна
|
||||
glfwDestroyWindow(window);
|
||||
|
||||
|
|
63
src/vk.cpp
63
src/vk.cpp
|
@ -7,9 +7,6 @@
|
|||
|
||||
#include "macroses.h"
|
||||
|
||||
// объект класса-обертки Vulkan API
|
||||
Vulkan vulkan;
|
||||
|
||||
// инициализация
|
||||
void Vulkan::init(GLFWwindow* window)
|
||||
{
|
||||
|
@ -24,6 +21,23 @@ 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(); // Создание объектов синхронизации
|
||||
}
|
||||
|
||||
|
@ -809,15 +823,9 @@ void Vulkan::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryP
|
|||
// Уничтожение буфера и освобождение его памяти
|
||||
void Vulkan::destroyBuffer(VkBuffer buffer)
|
||||
{
|
||||
// Проверка что такой буфер ещё существует
|
||||
if (databuffers.find(buffer) != databuffers.end())
|
||||
{
|
||||
vkDeviceWaitIdle(logicalDevice); // Ожидание окончания асинхронных задач
|
||||
|
||||
vkDestroyBuffer(databuffers[buffer].first /*logicalDevice*/, buffer, nullptr); // Уничтожение буфера
|
||||
vkFreeMemory(databuffers[buffer].first /*logicalDevice*/, databuffers[buffer].second /*VkDeviceMemory*/, nullptr); // Освобождение памяти буфера
|
||||
databuffers.erase(buffer); // Удалим ключ из словаря
|
||||
}
|
||||
vkDestroyBuffer(databuffers[buffer].first /*logicalDevice*/, buffer, nullptr); // Уничтожение буфера
|
||||
vkFreeMemory(databuffers[buffer].first /*logicalDevice*/, databuffers[buffer].second /*VkDeviceMemory*/, nullptr); // Освобождение памяти буфера
|
||||
databuffers.erase(buffer); // Удалим ключ из словаря
|
||||
}
|
||||
|
||||
// Создание пула команд
|
||||
|
@ -980,10 +988,13 @@ void Vulkan::renderFrame()
|
|||
{
|
||||
renderBegin(); // Начало рендера
|
||||
|
||||
for (auto const& model : renderList)
|
||||
{
|
||||
model->render(commandBuffers[currentFrame]);
|
||||
}
|
||||
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);
|
||||
|
||||
renderEnd(); // Конец рендера
|
||||
}
|
||||
|
@ -1085,23 +1096,3 @@ 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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue