Add configurable dof framebuffer downscale factor
This commit is contained in:
parent
1ea4b4faab
commit
c3c678c5b0
3 changed files with 20 additions and 18 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
Reference in a new issue