Проходы рендера
This commit is contained in:
parent
825fde662d
commit
4725603dee
|
@ -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
|
54
src/vk.cpp
54
src/vk.cpp
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue