Пример использования класса модели с индексным буфером
This commit is contained in:
parent
10b58f8556
commit
116a474c5f
|
@ -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
|
||||||
|
|
20
src/main.cpp
20
src/main.cpp
|
@ -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);
|
||||||
|
|
||||||
|
|
48
src/vk.cpp
48
src/vk.cpp
|
@ -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();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue