From af1b3b9845110a9ee1c081072be66bd695fe6475 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Wed, 7 Nov 2018 07:20:52 -0500 Subject: [PATCH] Add sky pass --- CMakeLists.txt | 7 ++- include/renderer.h | 6 +++ include/skypass.h | 21 +++++++++ shaders/sky.frag | 10 +++++ shaders/sky.vert | 10 +++++ src/renderer.cpp | 25 +++++++++-- src/skypass.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++ src/worldpass.cpp | 25 +++-------- 8 files changed, 187 insertions(+), 25 deletions(-) create mode 100644 include/skypass.h create mode 100644 shaders/sky.frag create mode 100644 shaders/sky.vert create mode 100644 src/skypass.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 32b6560..62ecd72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,8 @@ add_executable(Graph src/worldpass.cpp src/postpass.cpp src/dofpass.cpp - src/imguipass.cpp) + src/imguipass.cpp + src/skypass.cpp) target_compile_options(Graph PUBLIC -fno-exceptions @@ -78,7 +79,9 @@ add_shaders(Graph shaders/dof.vert shaders/dof.frag shaders/imgui.vert - shaders/imgui.frag) + shaders/imgui.frag + shaders/sky.vert + shaders/sky.frag) add_data(Graph data/suzanne.obj diff --git a/include/renderer.h b/include/renderer.h index 386c05c..9e5ddbb 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -6,6 +6,7 @@ #include "postpass.h" #include "dofpass.h" #include "imguipass.h" +#include "skypass.h" constexpr int numFrameResources = 2; @@ -123,6 +124,10 @@ public: return materialSetLayout_; } + WorldPass& getWorldPass() const { + return *worldPass_; + } + private: void createInstance(); #ifdef DEBUG @@ -168,4 +173,5 @@ private: PostPass* postPass_ = nullptr; DoFPass* dofPass_ = nullptr; ImGuiPass* imguiPass_ = nullptr; + SkyPass* skyPass_ = nullptr; }; diff --git a/include/skypass.h b/include/skypass.h new file mode 100644 index 0000000..fa353a2 --- /dev/null +++ b/include/skypass.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +class Renderer; + +class SkyPass { +public: + SkyPass(Renderer& renderer); + ~SkyPass(); + + void render(VkCommandBuffer commandBuffer); + +private: + void createPipeline(); + + VkPipeline pipeline_ = nullptr; + VkPipelineLayout pipelineLayout_ = nullptr; + + Renderer& renderer_; +}; diff --git a/shaders/sky.frag b/shaders/sky.frag new file mode 100644 index 0000000..eace1ef --- /dev/null +++ b/shaders/sky.frag @@ -0,0 +1,10 @@ +#version 460 core + +layout(location = 0) in vec2 inUV; + +layout(location = 0) out vec4 outColor; + +void main() { + outColor = vec4(0.1, 0.1, 0.8, 1.0); +} + diff --git a/shaders/sky.vert b/shaders/sky.vert new file mode 100644 index 0000000..b0192d8 --- /dev/null +++ b/shaders/sky.vert @@ -0,0 +1,10 @@ +#version 460 core + +layout(location = 0) out vec2 outUV; + +void main() { + outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); + gl_Position = vec4(outUV * 2.0 + -1.0, 1.0, 1.0); +} + + diff --git a/src/renderer.cpp b/src/renderer.cpp index aafa8cc..5000328 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -30,11 +30,13 @@ Renderer::Renderer() { postPass_ = new PostPass(*this); dofPass_ = new DoFPass(*this); imguiPass_ = new ImGuiPass(*this); + skyPass_ = new SkyPass(*this); } Renderer::~Renderer() { vkDeviceWaitIdle(device_); + delete skyPass_; delete imguiPass_; delete dofPass_; delete postPass_; @@ -84,22 +86,39 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) { vkCmdSetScissor(commandBuffer, 0, 1, &scissor); + std::array clearColor = {}; + clearColor[1].depthStencil.depth = 1.0f; + + VkRenderPassBeginInfo renderPassBeginInfo = {}; + renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + renderPassBeginInfo.framebuffer = target->offscreenFramebuffers[target->currentResource]; + renderPassBeginInfo.renderPass = worldPass_->getRenderPass(); + renderPassBeginInfo.renderArea.extent = target->extent; + renderPassBeginInfo.clearValueCount = clearColor.size(); + renderPassBeginInfo.pClearValues = clearColor.data(); + + vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + worldPass_->render(commandBuffer, world, camera, target); + skyPass_->render(commandBuffer); + + vkCmdEndRenderPass(commandBuffer); + dofPass_->render(commandBuffer, camera, target); // reset after dof pass vkCmdSetViewport(commandBuffer, 0, 1, &viewport); vkCmdSetScissor(commandBuffer, 0, 1, &scissor); - VkClearValue clearColor = {}; + clearColor = {}; - VkRenderPassBeginInfo renderPassBeginInfo = {}; + renderPassBeginInfo = {}; renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; renderPassBeginInfo.framebuffer = target->swapchainFramebuffers[target->currentResource]; renderPassBeginInfo.renderPass = presentationRenderPass_; renderPassBeginInfo.renderArea.extent = target->extent; renderPassBeginInfo.clearValueCount = 1; - renderPassBeginInfo.pClearValues = &clearColor; + renderPassBeginInfo.pClearValues = &clearColor[0]; vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); diff --git a/src/skypass.cpp b/src/skypass.cpp new file mode 100644 index 0000000..4440746 --- /dev/null +++ b/src/skypass.cpp @@ -0,0 +1,108 @@ +#include "skypass.h" + +#include "renderer.h" + +SkyPass::SkyPass(Renderer& renderer) : renderer_(renderer) { + createPipeline(); +} + +SkyPass::~SkyPass() { + vkDestroyPipeline(renderer_.getDevice(), pipeline_, nullptr); + vkDestroyPipelineLayout(renderer_.getDevice(), pipelineLayout_, nullptr); +} + +void SkyPass::render(VkCommandBuffer commandBuffer) { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_); + vkCmdDraw(commandBuffer, 3, 1, 0, 0); +} + +void SkyPass::createPipeline() { + VkShaderModule vertShaderModule = renderer_.createShader("shaders/sky.vert.spv"); + VkShaderModule fragShaderModule = renderer_.createShader("shaders/sky.frag.spv"); + + VkPipelineShaderStageCreateInfo vertShaderStageInfo = {}; + vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; + vertShaderStageInfo.module = vertShaderModule; + vertShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo fragShaderStageInfo = {}; + fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; + fragShaderStageInfo.module = fragShaderModule; + fragShaderStageInfo.pName = "main"; + + const std::array shaderStages = {vertShaderStageInfo, fragShaderStageInfo}; + + VkPipelineVertexInputStateCreateInfo vertexInputInfo = {}; + vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + + VkPipelineInputAssemblyStateCreateInfo inputAssembly = {}; + inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + + VkPipelineViewportStateCreateInfo viewportState = {}; + viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewportState.viewportCount = 1; + viewportState.scissorCount = 1; + + VkPipelineRasterizationStateCreateInfo rasterizer = {}; + rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + rasterizer.polygonMode = VK_POLYGON_MODE_FILL; + rasterizer.cullMode = VK_CULL_MODE_NONE; + rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + rasterizer.lineWidth = 1.0f; + + VkPipelineMultisampleStateCreateInfo multisampling = {}; + multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + + VkPipelineColorBlendAttachmentState colorBlendAttachment = {}; + colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + + VkPipelineColorBlendStateCreateInfo colorBlending = {}; + colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + colorBlending.attachmentCount = 1; + colorBlending.pAttachments = &colorBlendAttachment; + + VkPipelineDepthStencilStateCreateInfo depthState = {}; + depthState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; + depthState.depthTestEnable = VK_TRUE; + depthState.depthWriteEnable = VK_FALSE; + depthState.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL; + + const std::array dynamicStates = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR + }; + + VkPipelineDynamicStateCreateInfo dynamicState = {}; + dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; + dynamicState.dynamicStateCount = dynamicStates.size(); + dynamicState.pDynamicStates = dynamicStates.data(); + + VkPipelineLayoutCreateInfo pipelineLayoutInfo = {}; + pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + + vkCreatePipelineLayout(renderer_.getDevice(), &pipelineLayoutInfo, nullptr, &pipelineLayout_); + + VkGraphicsPipelineCreateInfo pipelineInfo = {}; + pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + pipelineInfo.stageCount = shaderStages.size(); + pipelineInfo.pStages = shaderStages.data(); + pipelineInfo.pVertexInputState = &vertexInputInfo; + pipelineInfo.pInputAssemblyState = &inputAssembly; + pipelineInfo.pViewportState = &viewportState; + pipelineInfo.pRasterizationState = &rasterizer; + pipelineInfo.pMultisampleState = &multisampling; + pipelineInfo.pColorBlendState = &colorBlending; + pipelineInfo.pDepthStencilState = &depthState; + pipelineInfo.pDynamicState = &dynamicState; + pipelineInfo.layout = pipelineLayout_; + pipelineInfo.renderPass = renderer_.getWorldPass().getRenderPass(); + + vkCreateGraphicsPipelines(renderer_.getDevice(), nullptr, 1, &pipelineInfo, nullptr, &pipeline_); + + vkDestroyShaderModule(renderer_.getDevice(), fragShaderModule, nullptr); + vkDestroyShaderModule(renderer_.getDevice(), vertShaderModule, nullptr); +} diff --git a/src/worldpass.cpp b/src/worldpass.cpp index 3f10037..3fcb55d 100644 --- a/src/worldpass.cpp +++ b/src/worldpass.cpp @@ -49,19 +49,6 @@ void WorldPass::render(VkCommandBuffer commandBuffer, World& world, Camera& came vkUnmapMemory(renderer_.getDevice(), lightMemory_); - std::array clearColor = {}; - clearColor[1].depthStencil.depth = 1.0f; - - VkRenderPassBeginInfo renderPassBeginInfo = {}; - renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - renderPassBeginInfo.framebuffer = target->offscreenFramebuffers[target->currentResource]; - renderPassBeginInfo.renderPass = renderPass_; - renderPassBeginInfo.renderArea.extent = target->extent; - renderPassBeginInfo.clearValueCount = clearColor.size(); - renderPassBeginInfo.pClearValues = clearColor.data(); - - vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &descriptorSet_, 0, nullptr); @@ -81,8 +68,6 @@ void WorldPass::render(VkCommandBuffer commandBuffer, World& world, Camera& came vkCmdDrawIndexed(commandBuffer, mesh->indices.size(), 1, 0, 0, 0); } - - vkCmdEndRenderPass(commandBuffer); } void WorldPass::createRenderPass() { @@ -238,17 +223,17 @@ void WorldPass::createPipeline() { colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; colorBlendAttachment.blendEnable = VK_FALSE; + VkPipelineColorBlendStateCreateInfo colorBlending = {}; + colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + colorBlending.attachmentCount = 1; + colorBlending.pAttachments = &colorBlendAttachment; + VkPipelineDepthStencilStateCreateInfo depthState = {}; depthState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; depthState.depthTestEnable = VK_TRUE; depthState.depthWriteEnable = VK_TRUE; depthState.depthCompareOp = VK_COMPARE_OP_LESS; - VkPipelineColorBlendStateCreateInfo colorBlending = {}; - colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - colorBlending.attachmentCount = 1; - colorBlending.pAttachments = &colorBlendAttachment; - const std::array dynamicStates = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR