重构到descriptorPool
parent
baa5457b4e
commit
c125768fdf
|
@ -127,185 +127,17 @@ void VulkanExampleBase::prepare()
|
||||||
/*
|
/*
|
||||||
Command pool
|
Command pool
|
||||||
*/
|
*/
|
||||||
VkCommandPoolCreateInfo cmdPoolInfo = {};
|
|
||||||
cmdPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
|
||||||
cmdPoolInfo.queueFamilyIndex = swapChain.queueNodeIndex;
|
|
||||||
cmdPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
|
||||||
VK_CHECK_RESULT(vkCreateCommandPool(device, &cmdPoolInfo, nullptr, &cmdPool));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Render pass
|
Render pass
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (settings.multiSampling) {
|
|
||||||
std::array<VkAttachmentDescription, 4> attachments = {};
|
|
||||||
|
|
||||||
// Multisampled attachment that we render to
|
|
||||||
attachments[0].format = swapChain.colorFormat;
|
|
||||||
attachments[0].samples = settings.sampleCount;
|
|
||||||
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
|
||||||
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
// This is the frame buffer attachment to where the multisampled image
|
|
||||||
// will be resolved to and which will be presented to the swapchain
|
|
||||||
attachments[1].format = swapChain.colorFormat;
|
|
||||||
attachments[1].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachments[1].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
|
||||||
|
|
||||||
// Multisampled depth attachment we render to
|
|
||||||
attachments[2].format = depthFormat;
|
|
||||||
attachments[2].samples = settings.sampleCount;
|
|
||||||
attachments[2].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
|
||||||
attachments[2].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[2].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[2].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[2].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachments[2].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
// Depth resolve attachment
|
|
||||||
attachments[3].format = depthFormat;
|
|
||||||
attachments[3].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachments[3].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[3].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachments[3].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[3].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[3].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachments[3].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
VkAttachmentReference colorReference = {};
|
|
||||||
colorReference.attachment = 0;
|
|
||||||
colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
VkAttachmentReference depthReference = {};
|
|
||||||
depthReference.attachment = 2;
|
|
||||||
depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
// Resolve attachment reference for the color attachment
|
|
||||||
VkAttachmentReference resolveReference = {};
|
|
||||||
resolveReference.attachment = 1;
|
|
||||||
resolveReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
VkSubpassDescription subpass = {};
|
|
||||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
|
||||||
subpass.colorAttachmentCount = 1;
|
|
||||||
subpass.pColorAttachments = &colorReference;
|
|
||||||
// Pass our resolve attachments to the sub pass
|
|
||||||
subpass.pResolveAttachments = &resolveReference;
|
|
||||||
subpass.pDepthStencilAttachment = &depthReference;
|
|
||||||
|
|
||||||
std::array<VkSubpassDependency, 2> dependencies;
|
|
||||||
|
|
||||||
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
|
|
||||||
dependencies[0].dstSubpass = 0;
|
|
||||||
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
|
||||||
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
|
||||||
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
|
||||||
|
|
||||||
dependencies[1].srcSubpass = 0;
|
|
||||||
dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
|
|
||||||
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
|
||||||
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
|
||||||
dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
|
||||||
|
|
||||||
VkRenderPassCreateInfo renderPassCI = {};
|
|
||||||
renderPassCI.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
|
||||||
renderPassCI.attachmentCount = static_cast<uint32_t>(attachments.size());
|
|
||||||
renderPassCI.pAttachments = attachments.data();
|
|
||||||
renderPassCI.subpassCount = 1;
|
|
||||||
renderPassCI.pSubpasses = &subpass;
|
|
||||||
renderPassCI.dependencyCount = 2;
|
|
||||||
renderPassCI.pDependencies = dependencies.data();
|
|
||||||
VK_CHECK_RESULT(vkCreateRenderPass(device, &renderPassCI, nullptr, &renderPass));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
std::array<VkAttachmentDescription, 2> attachments = {};
|
|
||||||
// Color attachment
|
|
||||||
attachments[0].format = swapChain.colorFormat;
|
|
||||||
attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
|
||||||
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachments[0].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
|
||||||
// Depth attachment
|
|
||||||
attachments[1].format = depthFormat;
|
|
||||||
attachments[1].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
|
||||||
attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
|
||||||
attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
VkAttachmentReference colorReference = {};
|
|
||||||
colorReference.attachment = 0;
|
|
||||||
colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
VkAttachmentReference depthReference = {};
|
|
||||||
depthReference.attachment = 1;
|
|
||||||
depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
|
||||||
|
|
||||||
VkSubpassDescription subpassDescription = {};
|
|
||||||
subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
|
||||||
subpassDescription.colorAttachmentCount = 1;
|
|
||||||
subpassDescription.pColorAttachments = &colorReference;
|
|
||||||
subpassDescription.pDepthStencilAttachment = &depthReference;
|
|
||||||
subpassDescription.inputAttachmentCount = 0;
|
|
||||||
subpassDescription.pInputAttachments = nullptr;
|
|
||||||
subpassDescription.preserveAttachmentCount = 0;
|
|
||||||
subpassDescription.pPreserveAttachments = nullptr;
|
|
||||||
subpassDescription.pResolveAttachments = nullptr;
|
|
||||||
|
|
||||||
// Subpass dependencies for layout transitions
|
|
||||||
std::array<VkSubpassDependency, 2> dependencies;
|
|
||||||
|
|
||||||
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
|
|
||||||
dependencies[0].dstSubpass = 0;
|
|
||||||
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
|
||||||
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
|
||||||
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
|
||||||
|
|
||||||
dependencies[1].srcSubpass = 0;
|
|
||||||
dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
|
|
||||||
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
|
||||||
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
|
||||||
dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
|
||||||
|
|
||||||
VkRenderPassCreateInfo renderPassCI{};
|
|
||||||
renderPassCI.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
|
||||||
renderPassCI.attachmentCount = static_cast<uint32_t>(attachments.size());
|
|
||||||
renderPassCI.pAttachments = attachments.data();
|
|
||||||
renderPassCI.subpassCount = 1;
|
|
||||||
renderPassCI.pSubpasses = &subpassDescription;
|
|
||||||
renderPassCI.dependencyCount = static_cast<uint32_t>(dependencies.size());
|
|
||||||
renderPassCI.pDependencies = dependencies.data();
|
|
||||||
VK_CHECK_RESULT(vkCreateRenderPass(device, &renderPassCI, nullptr, &renderPass));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Pipeline cache
|
Pipeline cache
|
||||||
*/
|
*/
|
||||||
VkPipelineCacheCreateInfo pipelineCacheCreateInfo{};
|
|
||||||
pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
|
|
||||||
VK_CHECK_RESULT(vkCreatePipelineCache(device, &pipelineCacheCreateInfo, nullptr, &pipelineCache));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Frame buffer
|
Frame buffer
|
||||||
|
@ -1921,7 +1753,7 @@ void VulkanExampleBase::setupFrameBuffer()
|
||||||
depthStencilView.image = depthStencil.image;
|
depthStencilView.image = depthStencil.image;
|
||||||
VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view));
|
VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view));
|
||||||
|
|
||||||
//
|
// create framebuffer
|
||||||
|
|
||||||
VkImageView attachments[4];
|
VkImageView attachments[4];
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ function(buildHomework HOMEWORK_NAME)
|
||||||
"render/glTFModel.h"
|
"render/glTFModel.h"
|
||||||
"render/glTFModel.cpp"
|
"render/glTFModel.cpp"
|
||||||
|
|
||||||
"render/vulkanFoundation.h" "render/vulkanFoundation.cpp" "render/renderSetter.h" "render/renderSetter.cpp")
|
"render/vulkanFoundation.h" "render/vulkanFoundation.cpp" "render/renderSetter.h" "render/renderSetter.cpp" "render/PBR.h" "render/PBR.cpp")
|
||||||
target_link_libraries(${HOMEWORK_NAME} base ${Vulkan_LIBRARY} ${WINLIBS})
|
target_link_libraries(${HOMEWORK_NAME} base ${Vulkan_LIBRARY} ${WINLIBS})
|
||||||
else(WIN32)
|
else(WIN32)
|
||||||
add_executable(${HOMEWORK_NAME} ${MAIN_CPP} ${SOURCE} ${MAIN_HEADER} ${SHADERS_GLSL} ${SHADERS_HLSL} ${README_FILES})
|
add_executable(${HOMEWORK_NAME} ${MAIN_CPP} ${SOURCE} ${MAIN_HEADER} ${SHADERS_GLSL} ${SHADERS_HLSL} ${README_FILES})
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#pragma once
|
||||||
|
#include "glm/glm.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace PBR
|
||||||
|
{
|
||||||
|
class Material
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Material();
|
||||||
|
~Material();
|
||||||
|
|
||||||
|
struct PushConstBlockMaterial {
|
||||||
|
glm::vec4 baseColorFactor;
|
||||||
|
glm::vec4 emissiveFactor;
|
||||||
|
glm::vec4 diffuseFactor;
|
||||||
|
glm::vec4 specularFactor;
|
||||||
|
float workflow;
|
||||||
|
int colorTextureSet;
|
||||||
|
int PhysicalDescriptorTextureSet;
|
||||||
|
int normalTextureSet;
|
||||||
|
int occlusionTextureSet;
|
||||||
|
int emissiveTextureSet;
|
||||||
|
float metallicFactor;
|
||||||
|
float roughnessFactor;
|
||||||
|
float alphaMask;
|
||||||
|
float alphaMaskCutoff;
|
||||||
|
} pushConstBlockMaterial;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Material::Material()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Material::~Material()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -300,39 +300,7 @@ void PlumageRender::setupNodeDescriptorSet(glTFModel::Node* node)
|
||||||
|
|
||||||
void PlumageRender::setupDescriptors()
|
void PlumageRender::setupDescriptors()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
Descriptor Pool
|
|
||||||
*/
|
|
||||||
uint32_t imageSamplerCount = 0;
|
|
||||||
uint32_t materialCount = 0;
|
|
||||||
uint32_t meshCount = 0;
|
|
||||||
|
|
||||||
// Environment samplers (radiance, irradiance, brdflut)
|
|
||||||
imageSamplerCount += 3;
|
|
||||||
|
|
||||||
std::vector<glTFModel::Model*> modellist = { &models.skybox, &models.scene };
|
|
||||||
for (auto& model : modellist) {
|
|
||||||
for (auto& material : model->materials) {
|
|
||||||
imageSamplerCount += 5;
|
|
||||||
materialCount++;
|
|
||||||
}
|
|
||||||
for (auto node : model->linearNodes) {
|
|
||||||
if (node->mesh) {
|
|
||||||
meshCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<VkDescriptorPoolSize> poolSizes = {
|
|
||||||
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, (4 + meshCount) * swapChain.imageCount },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, imageSamplerCount * swapChain.imageCount }
|
|
||||||
};
|
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolCI{};
|
|
||||||
descriptorPoolCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
|
||||||
descriptorPoolCI.poolSizeCount = 2;
|
|
||||||
descriptorPoolCI.pPoolSizes = poolSizes.data();
|
|
||||||
descriptorPoolCI.maxSets = (2 + materialCount + meshCount) * swapChain.imageCount;
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolCI, nullptr, &descriptorPool));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Descriptor sets
|
Descriptor sets
|
||||||
|
@ -492,154 +460,6 @@ void PlumageRender::setupDescriptors()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlumageRender::preparePipelines()
|
|
||||||
{
|
|
||||||
VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCI{};
|
|
||||||
inputAssemblyStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
|
||||||
inputAssemblyStateCI.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
|
||||||
|
|
||||||
VkPipelineRasterizationStateCreateInfo rasterizationStateCI{};
|
|
||||||
rasterizationStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
|
||||||
rasterizationStateCI.polygonMode = VK_POLYGON_MODE_FILL;
|
|
||||||
rasterizationStateCI.cullMode = VK_CULL_MODE_BACK_BIT;
|
|
||||||
rasterizationStateCI.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
|
||||||
rasterizationStateCI.lineWidth = 1.0f;
|
|
||||||
|
|
||||||
VkPipelineColorBlendAttachmentState blendAttachmentState{};
|
|
||||||
blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
|
||||||
blendAttachmentState.blendEnable = VK_FALSE;
|
|
||||||
|
|
||||||
VkPipelineColorBlendStateCreateInfo colorBlendStateCI{};
|
|
||||||
colorBlendStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
|
||||||
colorBlendStateCI.attachmentCount = 1;
|
|
||||||
colorBlendStateCI.pAttachments = &blendAttachmentState;
|
|
||||||
|
|
||||||
VkPipelineDepthStencilStateCreateInfo depthStencilStateCI{};
|
|
||||||
depthStencilStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
|
||||||
depthStencilStateCI.depthTestEnable = VK_FALSE;
|
|
||||||
depthStencilStateCI.depthWriteEnable = VK_FALSE;
|
|
||||||
depthStencilStateCI.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
|
|
||||||
depthStencilStateCI.front = depthStencilStateCI.back;
|
|
||||||
depthStencilStateCI.back.compareOp = VK_COMPARE_OP_ALWAYS;
|
|
||||||
|
|
||||||
VkPipelineViewportStateCreateInfo viewportStateCI{};
|
|
||||||
viewportStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
|
||||||
viewportStateCI.viewportCount = 1;
|
|
||||||
viewportStateCI.scissorCount = 1;
|
|
||||||
|
|
||||||
VkPipelineMultisampleStateCreateInfo multisampleStateCI{};
|
|
||||||
multisampleStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
|
||||||
|
|
||||||
if (setter.settings.multiSampling) {
|
|
||||||
multisampleStateCI.rasterizationSamples = setter.settings.sampleCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<VkDynamicState> dynamicStateEnables = {
|
|
||||||
VK_DYNAMIC_STATE_VIEWPORT,
|
|
||||||
VK_DYNAMIC_STATE_SCISSOR
|
|
||||||
};
|
|
||||||
VkPipelineDynamicStateCreateInfo dynamicStateCI{};
|
|
||||||
dynamicStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
|
|
||||||
dynamicStateCI.pDynamicStates = dynamicStateEnables.data();
|
|
||||||
dynamicStateCI.dynamicStateCount = static_cast<uint32_t>(dynamicStateEnables.size());
|
|
||||||
|
|
||||||
// Pipeline layout
|
|
||||||
const std::vector<VkDescriptorSetLayout> setLayouts = {
|
|
||||||
descriptorSetLayouts.scene, descriptorSetLayouts.material, descriptorSetLayouts.node
|
|
||||||
};
|
|
||||||
VkPipelineLayoutCreateInfo pipelineLayoutCI{};
|
|
||||||
pipelineLayoutCI.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
||||||
pipelineLayoutCI.setLayoutCount = static_cast<uint32_t>(setLayouts.size());
|
|
||||||
pipelineLayoutCI.pSetLayouts = setLayouts.data();
|
|
||||||
VkPushConstantRange pushConstantRange{};
|
|
||||||
pushConstantRange.size = sizeof(PushConstBlockMaterial);
|
|
||||||
pushConstantRange.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
|
|
||||||
pipelineLayoutCI.pushConstantRangeCount = 1;
|
|
||||||
pipelineLayoutCI.pPushConstantRanges = &pushConstantRange;
|
|
||||||
VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCI, nullptr, &pipelineLayout));
|
|
||||||
|
|
||||||
// Vertex bindings an attributes
|
|
||||||
VkVertexInputBindingDescription vertexInputBinding = { 0, sizeof(glTFModel::Model::Vertex), VK_VERTEX_INPUT_RATE_VERTEX };
|
|
||||||
std::vector<VkVertexInputAttributeDescription> vertexInputAttributes = {
|
|
||||||
{ 0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0 },
|
|
||||||
{ 1, 0, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 3 },
|
|
||||||
{ 2, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 6 },
|
|
||||||
{ 3, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 8 },
|
|
||||||
{ 4, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 10 },
|
|
||||||
{ 5, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 14 },
|
|
||||||
{ 6, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 18 }
|
|
||||||
};
|
|
||||||
VkPipelineVertexInputStateCreateInfo vertexInputStateCI{};
|
|
||||||
vertexInputStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
|
||||||
vertexInputStateCI.vertexBindingDescriptionCount = 1;
|
|
||||||
vertexInputStateCI.pVertexBindingDescriptions = &vertexInputBinding;
|
|
||||||
vertexInputStateCI.vertexAttributeDescriptionCount = static_cast<uint32_t>(vertexInputAttributes.size());
|
|
||||||
vertexInputStateCI.pVertexAttributeDescriptions = vertexInputAttributes.data();
|
|
||||||
|
|
||||||
// Pipelines
|
|
||||||
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages;
|
|
||||||
|
|
||||||
VkGraphicsPipelineCreateInfo pipelineCI{};
|
|
||||||
pipelineCI.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
|
||||||
pipelineCI.layout = pipelineLayout;
|
|
||||||
pipelineCI.renderPass = renderPass;
|
|
||||||
pipelineCI.pInputAssemblyState = &inputAssemblyStateCI;
|
|
||||||
pipelineCI.pVertexInputState = &vertexInputStateCI;
|
|
||||||
pipelineCI.pRasterizationState = &rasterizationStateCI;
|
|
||||||
pipelineCI.pColorBlendState = &colorBlendStateCI;
|
|
||||||
pipelineCI.pMultisampleState = &multisampleStateCI;
|
|
||||||
pipelineCI.pViewportState = &viewportStateCI;
|
|
||||||
pipelineCI.pDepthStencilState = &depthStencilStateCI;
|
|
||||||
pipelineCI.pDynamicState = &dynamicStateCI;
|
|
||||||
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
|
||||||
pipelineCI.pStages = shaderStages.data();
|
|
||||||
|
|
||||||
if (setter.settings.multiSampling) {
|
|
||||||
multisampleStateCI.rasterizationSamples = setter.settings.sampleCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skybox pipeline (background cube)
|
|
||||||
shaderStages = {
|
|
||||||
loadShader(device,setter.filePath.skyboxVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT),
|
|
||||||
loadShader(device,setter.filePath.skyboxFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT)
|
|
||||||
};
|
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.skybox));
|
|
||||||
for (auto shaderStage : shaderStages) {
|
|
||||||
vkDestroyShaderModule(device, shaderStage.module, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// PBR pipeline
|
|
||||||
shaderStages = {
|
|
||||||
loadShader(device,setter.filePath.pbrVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT),
|
|
||||||
loadShader(device,setter.filePath.pbrFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT)
|
|
||||||
};
|
|
||||||
depthStencilStateCI.depthWriteEnable = VK_TRUE;
|
|
||||||
depthStencilStateCI.depthTestEnable = VK_TRUE;
|
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.pbr));
|
|
||||||
rasterizationStateCI.cullMode = VK_CULL_MODE_NONE;
|
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.pbrDoubleSided));
|
|
||||||
|
|
||||||
rasterizationStateCI.cullMode = VK_CULL_MODE_NONE;
|
|
||||||
blendAttachmentState.blendEnable = VK_TRUE;
|
|
||||||
blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
|
||||||
blendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
|
|
||||||
blendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
|
||||||
blendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD;
|
|
||||||
blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
|
||||||
blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
|
|
||||||
blendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
|
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.pbrAlphaBlend));
|
|
||||||
|
|
||||||
for (auto shaderStage : shaderStages) {
|
|
||||||
vkDestroyShaderModule(device, shaderStage.module, nullptr);
|
|
||||||
}
|
|
||||||
//Create Tone Mapping render pipeline
|
|
||||||
//CreateToneMappingPipeline();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate two cube maps
|
// generate two cube maps
|
||||||
// irradiance cube map
|
// irradiance cube map
|
||||||
// prefileter environment cube map
|
// prefileter environment cube map
|
||||||
|
|
|
@ -124,22 +124,6 @@ public:
|
||||||
glm::vec3 camPos;
|
glm::vec3 camPos;
|
||||||
} shaderDataScene, shaderDataSkybox;
|
} shaderDataScene, shaderDataSkybox;
|
||||||
|
|
||||||
struct PushConstBlockMaterial {
|
|
||||||
glm::vec4 baseColorFactor;
|
|
||||||
glm::vec4 emissiveFactor;
|
|
||||||
glm::vec4 diffuseFactor;
|
|
||||||
glm::vec4 specularFactor;
|
|
||||||
float workflow;
|
|
||||||
int colorTextureSet;
|
|
||||||
int PhysicalDescriptorTextureSet;
|
|
||||||
int normalTextureSet;
|
|
||||||
int occlusionTextureSet;
|
|
||||||
int emissiveTextureSet;
|
|
||||||
float metallicFactor;
|
|
||||||
float roughnessFactor;
|
|
||||||
float alphaMask;
|
|
||||||
float alphaMaskCutoff;
|
|
||||||
} pushConstBlockMaterial;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,27 +148,9 @@ public:
|
||||||
VkDeviceMemory memory;
|
VkDeviceMemory memory;
|
||||||
} vertexStaging, indexStaging;
|
} vertexStaging, indexStaging;
|
||||||
|
|
||||||
struct Pipelines {
|
|
||||||
VkPipeline skybox;
|
|
||||||
VkPipeline pbr;
|
|
||||||
VkPipeline pbrDoubleSided;
|
|
||||||
VkPipeline pbrAlphaBlend;
|
|
||||||
VkPipeline solid;
|
|
||||||
VkPipeline wireframe = VK_NULL_HANDLE;
|
|
||||||
VkPipeline toneMapping = VK_NULL_HANDLE;
|
|
||||||
} pipelines;
|
|
||||||
|
|
||||||
VkPipeline boundPipeline = VK_NULL_HANDLE;
|
|
||||||
|
|
||||||
struct PipelineLayouts
|
|
||||||
{
|
|
||||||
VkDescriptorSetLayout scene;
|
|
||||||
VkDescriptorSetLayout material;
|
|
||||||
VkDescriptorSetLayout node;
|
|
||||||
VkPipelineLayout tonemappingLayout;
|
|
||||||
} pipelineLayouts;
|
|
||||||
|
|
||||||
VkPipelineLayout pipelineLayout;
|
|
||||||
|
|
||||||
struct DescriptorSets {
|
struct DescriptorSets {
|
||||||
VkDescriptorSet scene;
|
VkDescriptorSet scene;
|
||||||
|
@ -192,9 +158,6 @@ public:
|
||||||
VkDescriptorSet tonemappingDescriptorSet = VK_NULL_HANDLE;
|
VkDescriptorSet tonemappingDescriptorSet = VK_NULL_HANDLE;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<DescriptorSets> descriptorSets;
|
std::vector<DescriptorSets> descriptorSets;
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,39 @@ void VulkanBackend::VulkanFondation::initVulkan()
|
||||||
|
|
||||||
// 创建renderpass
|
// 创建renderpass
|
||||||
createRenderPass();
|
createRenderPass();
|
||||||
|
|
||||||
|
// 创建资源描述符层级
|
||||||
|
createDescriptorSetLayout();
|
||||||
|
|
||||||
|
// 创建管线缓存
|
||||||
|
createPipelineCache();
|
||||||
|
|
||||||
|
// 创建图形管线
|
||||||
|
createGraphicPipeline();
|
||||||
|
|
||||||
|
// 创建主要帧缓冲区
|
||||||
|
createFramebuffer();
|
||||||
|
|
||||||
|
// 创建命令缓冲池
|
||||||
|
createCommandPool();
|
||||||
|
|
||||||
|
// 创建顶点缓存
|
||||||
|
createVertexBuffer();
|
||||||
|
|
||||||
|
// 创建索引缓存区
|
||||||
|
createIndexBuffer();
|
||||||
|
|
||||||
|
// 创建统一缓存区
|
||||||
|
createUniformBuffer();
|
||||||
|
|
||||||
|
// 创建资源描述存储池
|
||||||
|
createDescriptorPool();
|
||||||
|
|
||||||
|
// 创建资源描述符集
|
||||||
|
createDescriptorSets();
|
||||||
|
|
||||||
|
// 创建命令缓存区
|
||||||
|
createCommandBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -823,6 +856,8 @@ bool VulkanBackend::VulkanFondation::hasStencilComponent(VkFormat format)
|
||||||
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
|
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void VulkanBackend::VulkanFondation::createDescriptorSetLayout()
|
void VulkanBackend::VulkanFondation::createDescriptorSetLayout()
|
||||||
{
|
{
|
||||||
// scene,场景的资源描述符
|
// scene,场景的资源描述符
|
||||||
|
@ -865,3 +900,248 @@ void VulkanBackend::VulkanFondation::createDescriptorSetLayout()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createPipelineCache()
|
||||||
|
{
|
||||||
|
VkPipelineCacheCreateInfo pipelineCacheCreateInfo{};
|
||||||
|
pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
|
||||||
|
VK_CHECK_RESULT(vkCreatePipelineCache(device, &pipelineCacheCreateInfo, nullptr, &pipelineCache));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createGraphicPipeline()
|
||||||
|
{
|
||||||
|
VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCI{};
|
||||||
|
inputAssemblyStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||||
|
inputAssemblyStateCI.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
|
||||||
|
VkPipelineRasterizationStateCreateInfo rasterizationStateCI{};
|
||||||
|
rasterizationStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||||
|
rasterizationStateCI.polygonMode = VK_POLYGON_MODE_FILL;
|
||||||
|
rasterizationStateCI.cullMode = VK_CULL_MODE_BACK_BIT;
|
||||||
|
rasterizationStateCI.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
||||||
|
rasterizationStateCI.lineWidth = 1.0f;
|
||||||
|
|
||||||
|
VkPipelineColorBlendAttachmentState blendAttachmentState{};
|
||||||
|
blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
||||||
|
blendAttachmentState.blendEnable = VK_FALSE;
|
||||||
|
|
||||||
|
VkPipelineColorBlendStateCreateInfo colorBlendStateCI{};
|
||||||
|
colorBlendStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||||
|
colorBlendStateCI.attachmentCount = 1;
|
||||||
|
colorBlendStateCI.pAttachments = &blendAttachmentState;
|
||||||
|
|
||||||
|
VkPipelineDepthStencilStateCreateInfo depthStencilStateCI{};
|
||||||
|
depthStencilStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
||||||
|
depthStencilStateCI.depthTestEnable = VK_FALSE;
|
||||||
|
depthStencilStateCI.depthWriteEnable = VK_FALSE;
|
||||||
|
depthStencilStateCI.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
|
||||||
|
depthStencilStateCI.front = depthStencilStateCI.back;
|
||||||
|
depthStencilStateCI.back.compareOp = VK_COMPARE_OP_ALWAYS;
|
||||||
|
|
||||||
|
VkPipelineViewportStateCreateInfo viewportStateCI{};
|
||||||
|
viewportStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
||||||
|
viewportStateCI.viewportCount = 1;
|
||||||
|
viewportStateCI.scissorCount = 1;
|
||||||
|
|
||||||
|
VkPipelineMultisampleStateCreateInfo multisampleStateCI{};
|
||||||
|
multisampleStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
||||||
|
|
||||||
|
if (setter.settings.multiSampling) {
|
||||||
|
multisampleStateCI.rasterizationSamples = setter.settings.sampleCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<VkDynamicState> dynamicStateEnables = {
|
||||||
|
VK_DYNAMIC_STATE_VIEWPORT,
|
||||||
|
VK_DYNAMIC_STATE_SCISSOR
|
||||||
|
};
|
||||||
|
VkPipelineDynamicStateCreateInfo dynamicStateCI{};
|
||||||
|
dynamicStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
|
||||||
|
dynamicStateCI.pDynamicStates = dynamicStateEnables.data();
|
||||||
|
dynamicStateCI.dynamicStateCount = static_cast<uint32_t>(dynamicStateEnables.size());
|
||||||
|
|
||||||
|
// Pipeline layout
|
||||||
|
const std::vector<VkDescriptorSetLayout> setLayouts = {
|
||||||
|
descriptorSetLayouts.scene, descriptorSetLayouts.material, descriptorSetLayouts.node
|
||||||
|
};
|
||||||
|
VkPipelineLayoutCreateInfo pipelineLayoutCI{};
|
||||||
|
pipelineLayoutCI.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||||
|
pipelineLayoutCI.setLayoutCount = static_cast<uint32_t>(setLayouts.size());
|
||||||
|
pipelineLayoutCI.pSetLayouts = setLayouts.data();
|
||||||
|
VkPushConstantRange pushConstantRange{};
|
||||||
|
pushConstantRange.size = sizeof(pbrMaterial.pushConstBlockMaterial);
|
||||||
|
pushConstantRange.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||||
|
pipelineLayoutCI.pushConstantRangeCount = 1;
|
||||||
|
pipelineLayoutCI.pPushConstantRanges = &pushConstantRange;
|
||||||
|
VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCI, nullptr, &pipelineLayout));
|
||||||
|
|
||||||
|
// Vertex bindings an attributes
|
||||||
|
VkVertexInputBindingDescription vertexInputBinding = { 0, sizeof(glTFModel::Model::Vertex), VK_VERTEX_INPUT_RATE_VERTEX };
|
||||||
|
std::vector<VkVertexInputAttributeDescription> vertexInputAttributes = {
|
||||||
|
{ 0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0 },
|
||||||
|
{ 1, 0, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 3 },
|
||||||
|
{ 2, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 6 },
|
||||||
|
{ 3, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 8 },
|
||||||
|
{ 4, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 10 },
|
||||||
|
{ 5, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 14 },
|
||||||
|
{ 6, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 18 }
|
||||||
|
};
|
||||||
|
VkPipelineVertexInputStateCreateInfo vertexInputStateCI{};
|
||||||
|
vertexInputStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
|
vertexInputStateCI.vertexBindingDescriptionCount = 1;
|
||||||
|
vertexInputStateCI.pVertexBindingDescriptions = &vertexInputBinding;
|
||||||
|
vertexInputStateCI.vertexAttributeDescriptionCount = static_cast<uint32_t>(vertexInputAttributes.size());
|
||||||
|
vertexInputStateCI.pVertexAttributeDescriptions = vertexInputAttributes.data();
|
||||||
|
|
||||||
|
// Pipelines
|
||||||
|
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages;
|
||||||
|
|
||||||
|
VkGraphicsPipelineCreateInfo pipelineCI{};
|
||||||
|
pipelineCI.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
|
pipelineCI.layout = pipelineLayout;
|
||||||
|
pipelineCI.renderPass = renderPass;
|
||||||
|
pipelineCI.pInputAssemblyState = &inputAssemblyStateCI;
|
||||||
|
pipelineCI.pVertexInputState = &vertexInputStateCI;
|
||||||
|
pipelineCI.pRasterizationState = &rasterizationStateCI;
|
||||||
|
pipelineCI.pColorBlendState = &colorBlendStateCI;
|
||||||
|
pipelineCI.pMultisampleState = &multisampleStateCI;
|
||||||
|
pipelineCI.pViewportState = &viewportStateCI;
|
||||||
|
pipelineCI.pDepthStencilState = &depthStencilStateCI;
|
||||||
|
pipelineCI.pDynamicState = &dynamicStateCI;
|
||||||
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
|
pipelineCI.pStages = shaderStages.data();
|
||||||
|
|
||||||
|
if (setter.settings.multiSampling) {
|
||||||
|
multisampleStateCI.rasterizationSamples = setter.settings.sampleCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skybox pipeline (background cube)
|
||||||
|
shaderStages = {
|
||||||
|
loadShader(device,setter.filePath.skyboxVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT),
|
||||||
|
loadShader(device,setter.filePath.skyboxFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT)
|
||||||
|
};
|
||||||
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.skybox));
|
||||||
|
for (auto shaderStage : shaderStages) {
|
||||||
|
vkDestroyShaderModule(device, shaderStage.module, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PBR pipeline
|
||||||
|
shaderStages = {
|
||||||
|
loadShader(device,setter.filePath.pbrVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT),
|
||||||
|
loadShader(device,setter.filePath.pbrFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT)
|
||||||
|
};
|
||||||
|
depthStencilStateCI.depthWriteEnable = VK_TRUE;
|
||||||
|
depthStencilStateCI.depthTestEnable = VK_TRUE;
|
||||||
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.pbr));
|
||||||
|
rasterizationStateCI.cullMode = VK_CULL_MODE_NONE;
|
||||||
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.pbrDoubleSided));
|
||||||
|
|
||||||
|
rasterizationStateCI.cullMode = VK_CULL_MODE_NONE;
|
||||||
|
blendAttachmentState.blendEnable = VK_TRUE;
|
||||||
|
blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
||||||
|
blendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
|
||||||
|
blendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
|
blendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD;
|
||||||
|
blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
|
blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
|
||||||
|
blendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
|
||||||
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.pbrAlphaBlend));
|
||||||
|
|
||||||
|
for (auto shaderStage : shaderStages) {
|
||||||
|
vkDestroyShaderModule(device, shaderStage.module, nullptr);
|
||||||
|
}
|
||||||
|
//Create Tone Mapping render pipeline
|
||||||
|
//CreateToneMappingPipeline();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createFramebuffer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createCommandPool()
|
||||||
|
{
|
||||||
|
QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice);
|
||||||
|
|
||||||
|
VkCommandPoolCreateInfo poolInfo{};
|
||||||
|
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
|
poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||||
|
poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value();
|
||||||
|
|
||||||
|
if (vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool) != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("failed to create command pool in createCommandpool");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createVertexBuffer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createIndexBuffer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createUniformBuffer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createDescriptorPool()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Descriptor Pool
|
||||||
|
*/
|
||||||
|
uint32_t imageSamplerCount = 0;
|
||||||
|
uint32_t materialCount = 0;
|
||||||
|
uint32_t meshCount = 0;
|
||||||
|
|
||||||
|
// Environment samplers (radiance, irradiance, brdflut)
|
||||||
|
imageSamplerCount += 3;
|
||||||
|
|
||||||
|
std::vector<glTFModel::Model*> modellist = { &models.skybox, &models.scene };
|
||||||
|
for (auto& model : modellist) {
|
||||||
|
for (auto& material : model->materials) {
|
||||||
|
imageSamplerCount += 5;
|
||||||
|
materialCount++;
|
||||||
|
}
|
||||||
|
for (auto node : model->linearNodes) {
|
||||||
|
if (node->mesh) {
|
||||||
|
meshCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<VkDescriptorPoolSize> poolSizes = {
|
||||||
|
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, (4 + meshCount) * swapChain.imageCount },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, imageSamplerCount * swapChain.imageCount }
|
||||||
|
};
|
||||||
|
VkDescriptorPoolCreateInfo descriptorPoolCI{};
|
||||||
|
descriptorPoolCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||||
|
descriptorPoolCI.poolSizeCount = 2;
|
||||||
|
descriptorPoolCI.pPoolSizes = poolSizes.data();
|
||||||
|
descriptorPoolCI.maxSets = (2 + materialCount + meshCount) * swapChain.imageCount;
|
||||||
|
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolCI, nullptr, &descriptorPool));
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createDescriptorSets()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanBackend::VulkanFondation::createCommandBuffer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
#include "renderSetter.h"
|
#include "renderSetter.h"
|
||||||
#include <VulkanSwapChain.hpp>
|
#include <VulkanSwapChain.hpp>
|
||||||
|
#include "glTFModel.h"
|
||||||
|
#include "VulkanUtils.hpp"
|
||||||
|
#include "PBR.h"
|
||||||
|
|
||||||
namespace VulkanBackend
|
namespace VulkanBackend
|
||||||
{
|
{
|
||||||
|
@ -35,6 +38,7 @@ namespace VulkanBackend
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VulkanBackend::Setter setter;
|
VulkanBackend::Setter setter;
|
||||||
|
PBR::Material pbrMaterial;
|
||||||
|
|
||||||
VkInstance instance;
|
VkInstance instance;
|
||||||
|
|
||||||
|
@ -91,12 +95,44 @@ namespace VulkanBackend
|
||||||
|
|
||||||
VkRenderPass renderPass;
|
VkRenderPass renderPass;
|
||||||
|
|
||||||
|
VkCommandPool commandPool;
|
||||||
|
|
||||||
|
struct Models
|
||||||
|
{
|
||||||
|
glTFModel::Model scene;
|
||||||
|
glTFModel::Model skybox;
|
||||||
|
} models;
|
||||||
|
|
||||||
struct DescriptorSetLayouts {
|
struct DescriptorSetLayouts {
|
||||||
VkDescriptorSetLayout scene;
|
VkDescriptorSetLayout scene;
|
||||||
VkDescriptorSetLayout material;
|
VkDescriptorSetLayout material;
|
||||||
VkDescriptorSetLayout node;
|
VkDescriptorSetLayout node;
|
||||||
} descriptorSetLayouts;
|
} descriptorSetLayouts;
|
||||||
|
|
||||||
|
struct Pipelines {
|
||||||
|
VkPipeline skybox;
|
||||||
|
VkPipeline pbr;
|
||||||
|
VkPipeline pbrDoubleSided;
|
||||||
|
VkPipeline pbrAlphaBlend;
|
||||||
|
VkPipeline solid;
|
||||||
|
VkPipeline wireframe = VK_NULL_HANDLE;
|
||||||
|
VkPipeline toneMapping = VK_NULL_HANDLE;
|
||||||
|
} pipelines;
|
||||||
|
|
||||||
|
VkPipeline boundPipeline = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
struct PipelineLayouts
|
||||||
|
{
|
||||||
|
VkDescriptorSetLayout scene;
|
||||||
|
VkDescriptorSetLayout material;
|
||||||
|
VkDescriptorSetLayout node;
|
||||||
|
VkPipelineLayout tonemappingLayout;
|
||||||
|
} pipelineLayouts;
|
||||||
|
|
||||||
|
VkPipelineLayout pipelineLayout;
|
||||||
|
|
||||||
|
VkPipelineCache pipelineCache;
|
||||||
|
|
||||||
// 句柄创建,检查校验层支持和获取需要的扩展
|
// 句柄创建,检查校验层支持和获取需要的扩展
|
||||||
void createInstance();
|
void createInstance();
|
||||||
bool checkValidationLayerSupport();
|
bool checkValidationLayerSupport();
|
||||||
|
@ -143,6 +179,9 @@ namespace VulkanBackend
|
||||||
// 创建资源描述符层级,用于访问绑定的资源
|
// 创建资源描述符层级,用于访问绑定的资源
|
||||||
void createDescriptorSetLayout();
|
void createDescriptorSetLayout();
|
||||||
|
|
||||||
|
// 创建管线缓存
|
||||||
|
void createPipelineCache();
|
||||||
|
|
||||||
// 创建图形管线
|
// 创建图形管线
|
||||||
void createGraphicPipeline();
|
void createGraphicPipeline();
|
||||||
|
|
||||||
|
@ -167,6 +206,8 @@ namespace VulkanBackend
|
||||||
// 创建描述符集合
|
// 创建描述符集合
|
||||||
void createDescriptorSets();
|
void createDescriptorSets();
|
||||||
|
|
||||||
|
// 创建命令缓存区
|
||||||
|
void createCommandBuffer();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue