Archived
1
Fork 0

Add configurable dof framebuffer downscale factor

This commit is contained in:
Joshua Goins 2018-11-05 21:26:39 -05:00
parent 1ea4b4faab
commit c3c678c5b0
3 changed files with 20 additions and 18 deletions

View file

@ -6,6 +6,8 @@ class Renderer;
struct RenderTarget; struct RenderTarget;
class Camera; class Camera;
const int dofFramebufferDownscaleFactor = 4;
class DoFPass { class DoFPass {
public: public:
DoFPass(Renderer& renderer); DoFPass(Renderer& renderer);

View file

@ -30,15 +30,15 @@ DoFPass::~DoFPass() {
void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget* target) { void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget* target) {
VkViewport viewport = {}; VkViewport viewport = {};
viewport.width = target->extent.width / 2; viewport.width = target->extent.width / dofFramebufferDownscaleFactor;
viewport.height = target->extent.height / 2; viewport.height = target->extent.height / dofFramebufferDownscaleFactor;
viewport.maxDepth = 1.0f; viewport.maxDepth = 1.0f;
vkCmdSetViewport(commandBuffer, 0, 1, &viewport); vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
VkRect2D scissor = {}; VkRect2D scissor = {};
scissor.extent.width = target->extent.width / 2; scissor.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
scissor.extent.height = target->extent.height / 2; scissor.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
vkCmdSetScissor(commandBuffer, 0, 1, &scissor); 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.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassBeginInfo.framebuffer = target->farFieldFramebuffers[target->currentImage]; renderPassBeginInfo.framebuffer = target->farFieldFramebuffers[target->currentImage];
renderPassBeginInfo.renderPass = renderPass_; renderPassBeginInfo.renderPass = renderPass_;
renderPassBeginInfo.renderArea.extent.width = target->extent.width / 2; renderPassBeginInfo.renderArea.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
renderPassBeginInfo.renderArea.extent.height = target->extent.height / 2; renderPassBeginInfo.renderArea.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
renderPassBeginInfo.clearValueCount = 1; renderPassBeginInfo.clearValueCount = 1;
renderPassBeginInfo.pClearValues = &clearColor; renderPassBeginInfo.pClearValues = &clearColor;
@ -59,8 +59,8 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget
glm::vec4 dpack; glm::vec4 dpack;
dpack[0] = camera.aperture; dpack[0] = camera.aperture;
dpack[1] = (camera.far - camera.focusDistance) / camera.far; dpack[1] = (camera.far - camera.focusDistance) / camera.far;
dpack[2] = target->extent.width / 2; dpack[2] = target->extent.width / dofFramebufferDownscaleFactor;
dpack[3] = target->extent.height / 2; dpack[3] = target->extent.height / dofFramebufferDownscaleFactor;
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentImage], 0, nullptr); 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); vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(glm::vec4), &dpack);
if(camera.aperture > 0.0f) 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); vkCmdEndRenderPass(commandBuffer);
@ -225,7 +225,7 @@ void DoFPass::createPipeline() {
vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;
vertShaderStageInfo.module = vertShaderModule; vertShaderStageInfo.module = vertShaderModule;
vertShaderStageInfo.pName = "main"; vertShaderStageInfo.pName = "main";
VkPipelineShaderStageCreateInfo fragShaderStageInfo = {}; VkPipelineShaderStageCreateInfo fragShaderStageInfo = {};
fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT;

View file

@ -352,8 +352,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
imageCreateInfo.imageType = VK_IMAGE_TYPE_2D; imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
imageCreateInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT; imageCreateInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT;
imageCreateInfo.extent.width = target->extent.width / 2; imageCreateInfo.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.height = target->extent.height / 2; imageCreateInfo.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.depth = 1; imageCreateInfo.extent.depth = 1;
imageCreateInfo.mipLevels = 1; imageCreateInfo.mipLevels = 1;
imageCreateInfo.arrayLayers = 1; imageCreateInfo.arrayLayers = 1;
@ -396,8 +396,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
framebufferInfo.renderPass = dofPass_->getRenderPass(); framebufferInfo.renderPass = dofPass_->getRenderPass();
framebufferInfo.attachmentCount = 1; framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = &target->nearFieldImageViews[i]; framebufferInfo.pAttachments = &target->nearFieldImageViews[i];
framebufferInfo.width = target->extent.width / 2; framebufferInfo.width = target->extent.width / dofFramebufferDownscaleFactor;
framebufferInfo.height = target->extent.height / 2; framebufferInfo.height = target->extent.height / dofFramebufferDownscaleFactor;
framebufferInfo.layers = 1; framebufferInfo.layers = 1;
vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->nearFieldFramebuffers[i]); 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.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
imageCreateInfo.imageType = VK_IMAGE_TYPE_2D; imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
imageCreateInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT; imageCreateInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT;
imageCreateInfo.extent.width = target->extent.width / 2; imageCreateInfo.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.height = target->extent.height / 2; imageCreateInfo.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.depth = 1; imageCreateInfo.extent.depth = 1;
imageCreateInfo.mipLevels = 1; imageCreateInfo.mipLevels = 1;
imageCreateInfo.arrayLayers = 1; imageCreateInfo.arrayLayers = 1;
@ -453,8 +453,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
framebufferInfo.renderPass = dofPass_->getRenderPass(); framebufferInfo.renderPass = dofPass_->getRenderPass();
framebufferInfo.attachmentCount = 1; framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = &target->farFieldImageViews[i]; framebufferInfo.pAttachments = &target->farFieldImageViews[i];
framebufferInfo.width = target->extent.width / 2; framebufferInfo.width = target->extent.width / dofFramebufferDownscaleFactor;
framebufferInfo.height = target->extent.height / 2; framebufferInfo.height = target->extent.height / dofFramebufferDownscaleFactor;
framebufferInfo.layers = 1; framebufferInfo.layers = 1;
vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->farFieldFramebuffers[i]); vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->farFieldFramebuffers[i]);