Пример использования класса модели с индексным буфером
This commit is contained in:
parent
10b58f8556
commit
116a474c5f
|
@ -9,6 +9,9 @@
|
|||
#include "Queue.h"
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
|
||||
#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<VkBuffer, std::pair<VkDevice, VkDeviceMemory>> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти
|
||||
std::list<I_Model*> renderList; // Спискок моделей для рендера
|
||||
|
||||
// Структура для хранения флагов
|
||||
struct
|
||||
|
|
20
src/main.cpp
20
src/main.cpp
|
@ -2,11 +2,26 @@
|
|||
|
||||
#include <iostream>
|
||||
|
||||
#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);
|
||||
|
||||
|
|
48
src/vk.cpp
48
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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue