From c3c678c5b06d45236d296e7bdb2a09285f344c4c Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 5 Nov 2018 21:26:39 -0500 Subject: [PATCH] Add configurable dof framebuffer downscale factor --- include/dofpass.h | 2 ++ src/dofpass.cpp | 20 ++++++++++---------- src/renderer.cpp | 16 ++++++++-------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/include/dofpass.h b/include/dofpass.h index e7b97f9..7d1d326 100644 --- a/include/dofpass.h +++ b/include/dofpass.h @@ -6,6 +6,8 @@ class Renderer; struct RenderTarget; class Camera; +const int dofFramebufferDownscaleFactor = 4; + class DoFPass { public: DoFPass(Renderer& renderer); diff --git a/src/dofpass.cpp b/src/dofpass.cpp index 3d6c2b8..c7dd1ef 100644 --- a/src/dofpass.cpp +++ b/src/dofpass.cpp @@ -30,15 +30,15 @@ DoFPass::~DoFPass() { void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget* target) { VkViewport viewport = {}; - viewport.width = target->extent.width / 2; - viewport.height = target->extent.height / 2; + viewport.width = target->extent.width / dofFramebufferDownscaleFactor; + viewport.height = target->extent.height / dofFramebufferDownscaleFactor; viewport.maxDepth = 1.0f; vkCmdSetViewport(commandBuffer, 0, 1, &viewport); VkRect2D scissor = {}; - scissor.extent.width = target->extent.width / 2; - scissor.extent.height = target->extent.height / 2; + scissor.extent.width = target->extent.width / dofFramebufferDownscaleFactor; + scissor.extent.height = target->extent.height / dofFramebufferDownscaleFactor; vkCmdSetScissor(commandBuffer, 0, 1, &scissor); @@ -48,8 +48,8 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; renderPassBeginInfo.framebuffer = target->farFieldFramebuffers[target->currentImage]; renderPassBeginInfo.renderPass = renderPass_; - renderPassBeginInfo.renderArea.extent.width = target->extent.width / 2; - renderPassBeginInfo.renderArea.extent.height = target->extent.height / 2; + renderPassBeginInfo.renderArea.extent.width = target->extent.width / dofFramebufferDownscaleFactor; + renderPassBeginInfo.renderArea.extent.height = target->extent.height / dofFramebufferDownscaleFactor; renderPassBeginInfo.clearValueCount = 1; renderPassBeginInfo.pClearValues = &clearColor; @@ -59,8 +59,8 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget glm::vec4 dpack; dpack[0] = camera.aperture; dpack[1] = (camera.far - camera.focusDistance) / camera.far; - dpack[2] = target->extent.width / 2; - dpack[3] = target->extent.height / 2; + dpack[2] = target->extent.width / dofFramebufferDownscaleFactor; + dpack[3] = target->extent.height / dofFramebufferDownscaleFactor; vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentImage], 0, nullptr); @@ -68,7 +68,7 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(glm::vec4), &dpack); if(camera.aperture > 0.0f) - vkCmdDraw(commandBuffer, 3, (target->extent.width / 2) * (target->extent.height / 2), 0, 0); + vkCmdDraw(commandBuffer, 3, (target->extent.width / dofFramebufferDownscaleFactor) * (target->extent.height / dofFramebufferDownscaleFactor), 0, 0); vkCmdEndRenderPass(commandBuffer); @@ -225,7 +225,7 @@ void DoFPass::createPipeline() { 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; diff --git a/src/renderer.cpp b/src/renderer.cpp index 8b6162a..59ba1bc 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -352,8 +352,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageCreateInfo.imageType = VK_IMAGE_TYPE_2D; imageCreateInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT; - imageCreateInfo.extent.width = target->extent.width / 2; - imageCreateInfo.extent.height = target->extent.height / 2; + imageCreateInfo.extent.width = target->extent.width / dofFramebufferDownscaleFactor; + imageCreateInfo.extent.height = target->extent.height / dofFramebufferDownscaleFactor; imageCreateInfo.extent.depth = 1; imageCreateInfo.mipLevels = 1; imageCreateInfo.arrayLayers = 1; @@ -396,8 +396,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa framebufferInfo.renderPass = dofPass_->getRenderPass(); framebufferInfo.attachmentCount = 1; framebufferInfo.pAttachments = &target->nearFieldImageViews[i]; - framebufferInfo.width = target->extent.width / 2; - framebufferInfo.height = target->extent.height / 2; + framebufferInfo.width = target->extent.width / dofFramebufferDownscaleFactor; + framebufferInfo.height = target->extent.height / dofFramebufferDownscaleFactor; framebufferInfo.layers = 1; vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->nearFieldFramebuffers[i]); @@ -409,8 +409,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageCreateInfo.imageType = VK_IMAGE_TYPE_2D; imageCreateInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT; - imageCreateInfo.extent.width = target->extent.width / 2; - imageCreateInfo.extent.height = target->extent.height / 2; + imageCreateInfo.extent.width = target->extent.width / dofFramebufferDownscaleFactor; + imageCreateInfo.extent.height = target->extent.height / dofFramebufferDownscaleFactor; imageCreateInfo.extent.depth = 1; imageCreateInfo.mipLevels = 1; imageCreateInfo.arrayLayers = 1; @@ -453,8 +453,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa framebufferInfo.renderPass = dofPass_->getRenderPass(); framebufferInfo.attachmentCount = 1; framebufferInfo.pAttachments = &target->farFieldImageViews[i]; - framebufferInfo.width = target->extent.width / 2; - framebufferInfo.height = target->extent.height / 2; + framebufferInfo.width = target->extent.width / dofFramebufferDownscaleFactor; + framebufferInfo.height = target->extent.height / dofFramebufferDownscaleFactor; framebufferInfo.layers = 1; vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->farFieldFramebuffers[i]);