Проходы рендера

This commit is contained in:
parent 825fde662d
commit 4725603dee
2 changed files with 56 additions and 0 deletions

View File

@ -22,6 +22,7 @@ class Vulkan
VkSwapchainKHR swapChain; // Список показа VkSwapchainKHR swapChain; // Список показа
std::vector<VkImage> swapChainImages; // Изображения из списка показа std::vector<VkImage> swapChainImages; // Изображения из списка показа
std::vector<VkImageView> swapChainImageViews; // Информация об изображениях из списка показа std::vector<VkImageView> swapChainImageViews; // Информация об изображениях из списка показа
VkRenderPass renderPass; // Проходы рендера
// Структура для хранения флагов // Структура для хранения флагов
struct struct
@ -36,6 +37,7 @@ class Vulkan
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
void createSwapchain(GLFWwindow* window); // Создание цепочки показа void createSwapchain(GLFWwindow* window); // Создание цепочки показа
void createRenderpass(); // Создание проходов рендера
}; };
#endif // VK_H #endif // VK_H

View File

@ -16,11 +16,14 @@ void Vulkan::init(GLFWwindow* window)
selectPhysicalDevice(deviceExtensions); // Выбор физического устройства selectPhysicalDevice(deviceExtensions); // Выбор физического устройства
createLogicalDevice(deviceExtensions); // Создание физического устройства createLogicalDevice(deviceExtensions); // Создание физического устройства
createSwapchain(window); // Создание списка показа createSwapchain(window); // Создание списка показа
createRenderpass(); // Создание проходов рендера
} }
// завершение работы // завершение работы
void Vulkan::destroy() void Vulkan::destroy()
{ {
vkDestroyRenderPass(logicalDevice, renderPass, nullptr);
// Уничтожение информации о изображениях списка показа // Уничтожение информации о изображениях списка показа
for (auto & imageView : swapChainImageViews) for (auto & imageView : swapChainImageViews)
{ {
@ -460,3 +463,54 @@ void Vulkan::createSwapchain(GLFWwindow* window)
} }
} }
} }
// Создание проходов рендера
void Vulkan::createRenderpass()
{
// Информация о прикреплении
VkAttachmentDescription colorAttachment{};
colorAttachment.format = surface.selectedFormat.format;
colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
// Информация о выходном прикреплении
VkAttachmentReference colorAttachmentRef{};
colorAttachmentRef.attachment = 0;
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
// Информация о подпроходе
VkSubpassDescription subpass{};
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass.colorAttachmentCount = 1;
subpass.pColorAttachments = &colorAttachmentRef;
// Зависимости подпрохода
VkSubpassDependency dependency{};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.srcAccessMask = 0;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
// Информация о создаваемом проходе рендера
VkRenderPassCreateInfo renderPassInfo{};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo.attachmentCount = 1;
renderPassInfo.pAttachments = &colorAttachment;
renderPassInfo.subpassCount = 1;
renderPassInfo.pSubpasses = &subpass;
renderPassInfo.dependencyCount = 1;
renderPassInfo.pDependencies = &dependency;
// Создание проходов рендера
if (vkCreateRenderPass(logicalDevice, &renderPassInfo, nullptr, &renderPass) != VK_SUCCESS)
{
throw std::runtime_error("Unable to create render pass");
}
}