Archived
1
Fork 0

Configure dof downscale in graphics presets

This commit is contained in:
Joshua Goins 2018-11-08 13:01:54 -05:00
parent f0bb00b251
commit f16e8b2aab
6 changed files with 30 additions and 28 deletions

View file

@ -1,8 +1,11 @@
[Low]
shadowResolution=128
dofDownscale=8
[Medium]
shadowResolution=256
dofDownscale=4
[High]
shadowResolution=512
dofDownscale=2

View file

@ -6,39 +6,37 @@ class Renderer;
struct RenderTarget;
class Camera;
const int dofFramebufferDownscaleFactor = 4;
class DoFPass {
public:
DoFPass(Renderer& renderer);
~DoFPass();
void render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget* target);
void createDescriptorSet(RenderTarget* target);
VkRenderPass getRenderPass() const {
return renderPass_;
}
private:
void createRenderPass();
void createDescriptorSetLayout();
void createPipeline();
void createBokehImage();
void createDescriptorSet();
VkRenderPass renderPass_ = nullptr;
VkDescriptorSetLayout setLayout_ = nullptr;
VkPipelineLayout pipelineLayout_ = nullptr;
VkPipeline pipeline_ = nullptr;
VkImage bokehImage_ = nullptr;
VkDeviceMemory bokehMemory_ = nullptr;
VkImageView bokehImageView_ = nullptr;
VkSampler bokehSampler_ = nullptr;
Renderer& renderer_;
};

View file

@ -69,7 +69,7 @@ struct RenderTarget {
};
struct GraphicsConfig {
int shadowResolution;
int shadowResolution, dofDownscale;
};
class World;

View file

@ -30,15 +30,15 @@ DoFPass::~DoFPass() {
void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget* target) {
VkViewport viewport = {};
viewport.width = target->extent.width / dofFramebufferDownscaleFactor;
viewport.height = target->extent.height / dofFramebufferDownscaleFactor;
viewport.width = target->extent.width / renderer_.getConfig().dofDownscale;
viewport.height = target->extent.height / renderer_.getConfig().dofDownscale;
viewport.maxDepth = 1.0f;
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
VkRect2D scissor = {};
scissor.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
scissor.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
scissor.extent.width = target->extent.width / renderer_.getConfig().dofDownscale;
scissor.extent.height = target->extent.height / renderer_.getConfig().dofDownscale;
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->currentResource];
renderPassBeginInfo.renderPass = renderPass_;
renderPassBeginInfo.renderArea.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
renderPassBeginInfo.renderArea.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
renderPassBeginInfo.renderArea.extent.width = target->extent.width / renderer_.getConfig().dofDownscale;
renderPassBeginInfo.renderArea.extent.height = target->extent.height / renderer_.getConfig().dofDownscale;
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 / dofFramebufferDownscaleFactor;
dpack[3] = target->extent.height / dofFramebufferDownscaleFactor;
dpack[2] = target->extent.width / renderer_.getConfig().dofDownscale;
dpack[3] = target->extent.height / renderer_.getConfig().dofDownscale;
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentResource], 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 / dofFramebufferDownscaleFactor) * (target->extent.height / dofFramebufferDownscaleFactor), 0, 0);
vkCmdDraw(commandBuffer, 3, (target->extent.width / renderer_.getConfig().dofDownscale) * (target->extent.height / renderer_.getConfig().dofDownscale), 0, 0);
vkCmdEndRenderPass(commandBuffer);

View file

@ -60,6 +60,7 @@ void loadGraphicsConfig() {
return;
graphicsConfig.shadowResolution = toInt(config.get(currentGraphicsPreset.c_str(), "shadowResolution"));
graphicsConfig.dofDownscale = toInt(config.get(currentGraphicsPreset.c_str(), "dofDownscale"));
}
void readConfig() {

View file

@ -382,8 +382,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 / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.width = target->extent.width / config_.dofDownscale;
imageCreateInfo.extent.height = target->extent.height / config_.dofDownscale;
imageCreateInfo.extent.depth = 1;
imageCreateInfo.mipLevels = 1;
imageCreateInfo.arrayLayers = 1;
@ -426,8 +426,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
framebufferInfo.renderPass = dofPass_->getRenderPass();
framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = &target->nearFieldImageViews[i];
framebufferInfo.width = target->extent.width / dofFramebufferDownscaleFactor;
framebufferInfo.height = target->extent.height / dofFramebufferDownscaleFactor;
framebufferInfo.width = target->extent.width / config_.dofDownscale;
framebufferInfo.height = target->extent.height / config_.dofDownscale;
framebufferInfo.layers = 1;
vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->nearFieldFramebuffers[i]);
@ -439,8 +439,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 / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
imageCreateInfo.extent.width = target->extent.width / config_.dofDownscale;
imageCreateInfo.extent.height = target->extent.height / config_.dofDownscale;
imageCreateInfo.extent.depth = 1;
imageCreateInfo.mipLevels = 1;
imageCreateInfo.arrayLayers = 1;
@ -483,8 +483,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
framebufferInfo.renderPass = dofPass_->getRenderPass();
framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = &target->farFieldImageViews[i];
framebufferInfo.width = target->extent.width / dofFramebufferDownscaleFactor;
framebufferInfo.height = target->extent.height / dofFramebufferDownscaleFactor;
framebufferInfo.width = target->extent.width / config_.dofDownscale;
framebufferInfo.height = target->extent.height / config_.dofDownscale;
framebufferInfo.layers = 1;
vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->farFieldFramebuffers[i]);