2020-08-11 12:07:21 -04:00
|
|
|
#include "dofpass.hpp"
|
|
|
|
|
|
|
|
#include "renderer.hpp"
|
|
|
|
#include "gfx.hpp"
|
|
|
|
#include "gfx_commandbuffer.hpp"
|
|
|
|
#include "engine.hpp"
|
2020-09-20 23:31:03 -04:00
|
|
|
#include "asset.hpp"
|
2020-08-11 12:07:21 -04:00
|
|
|
|
|
|
|
AssetPtr<Texture> aperture_texture;
|
|
|
|
|
|
|
|
DoFPass::DoFPass(GFX* gfx, Renderer* renderer) : renderer(renderer) {
|
|
|
|
aperture_texture = assetm->get<Texture>(file::app_domain / "textures/aperture.png");
|
|
|
|
|
2020-09-22 21:47:11 -04:00
|
|
|
GFXRenderPassCreateInfo renderPassInfo = {};
|
|
|
|
renderPassInfo.attachments.push_back(GFXPixelFormat::RGBA_32F);
|
|
|
|
|
|
|
|
renderpass = gfx->create_render_pass(renderPassInfo);
|
|
|
|
|
2020-08-11 12:07:21 -04:00
|
|
|
const auto extent = renderer->get_render_extent();
|
|
|
|
|
|
|
|
GFXShaderConstant width_constant = {};
|
|
|
|
width_constant.value = extent.width;
|
|
|
|
|
|
|
|
GFXShaderConstant height_constant = {};
|
|
|
|
height_constant.index = 1;
|
|
|
|
height_constant.value = extent.height;
|
|
|
|
|
|
|
|
GFXGraphicsPipelineCreateInfo create_info = {};
|
|
|
|
create_info.shaders.vertex_path = "dof.vert";
|
|
|
|
create_info.shaders.vertex_constants = {width_constant, height_constant};
|
|
|
|
create_info.shaders.fragment_path = "dof.frag";
|
2020-09-22 21:47:11 -04:00
|
|
|
|
|
|
|
create_info.shader_input.bindings = {
|
|
|
|
{2, GFXBindingType::PushConstant}
|
|
|
|
};
|
|
|
|
|
|
|
|
create_info.render_pass = renderpass;
|
|
|
|
|
2020-08-11 12:07:21 -04:00
|
|
|
create_info.blending.enable_blending = true;
|
2020-09-22 21:47:11 -04:00
|
|
|
create_info.blending.src_rgb = GFXBlendFactor::SrcColor;
|
|
|
|
create_info.blending.dst_rgb = GFXBlendFactor::One;
|
2020-08-11 12:07:21 -04:00
|
|
|
create_info.blending.src_alpha = GFXBlendFactor::SrcAlpha;
|
2020-09-22 21:47:11 -04:00
|
|
|
create_info.blending.dst_alpha = GFXBlendFactor::One;
|
2020-08-11 12:07:21 -04:00
|
|
|
|
|
|
|
pipeline = gfx->create_graphics_pipeline(create_info);
|
2020-09-22 21:47:11 -04:00
|
|
|
|
|
|
|
GFXTextureCreateInfo textureInfo = {};
|
|
|
|
textureInfo.width = extent.width;
|
|
|
|
textureInfo.height = extent.height;
|
|
|
|
textureInfo.format = GFXPixelFormat::RGBA_32F;
|
|
|
|
textureInfo.usage = GFXTextureUsage::Attachment | GFXTextureUsage::Sampled;
|
|
|
|
textureInfo.samplingMode = SamplingMode::ClampToEdge;
|
|
|
|
|
|
|
|
normal_field = gfx->create_texture(textureInfo);
|
|
|
|
far_field = gfx->create_texture(textureInfo);
|
|
|
|
|
|
|
|
GFXFramebufferCreateInfo framebufferInfo = {};
|
|
|
|
framebufferInfo.render_pass = renderpass;
|
|
|
|
framebufferInfo.attachments = { normal_field };
|
|
|
|
|
|
|
|
normal_framebuffer = gfx->create_framebuffer(framebufferInfo);
|
|
|
|
|
|
|
|
framebufferInfo.attachments = { far_field };
|
|
|
|
|
|
|
|
far_framebuffer = gfx->create_framebuffer(framebufferInfo);
|
2020-08-11 12:07:21 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void DoFPass::render(GFXCommandBuffer* command_buffer, Scene&) {
|
2020-09-22 21:47:11 -04:00
|
|
|
const auto render_extent = renderer->get_render_extent();
|
|
|
|
|
|
|
|
// render far field
|
|
|
|
GFXRenderPassBeginInfo beginInfo = {};
|
|
|
|
beginInfo.framebuffer = far_framebuffer;
|
|
|
|
beginInfo.render_pass = renderpass;
|
|
|
|
|
|
|
|
command_buffer->set_render_pass(beginInfo);
|
|
|
|
|
|
|
|
Viewport viewport = {};
|
|
|
|
viewport.width = render_extent.width;
|
|
|
|
viewport.height = render_extent.height;
|
|
|
|
|
|
|
|
command_buffer->set_viewport(viewport);
|
|
|
|
|
2020-09-22 16:09:25 -04:00
|
|
|
command_buffer->set_graphics_pipeline(pipeline);
|
2020-08-11 12:07:21 -04:00
|
|
|
|
|
|
|
command_buffer->bind_texture(renderer->offscreenColorTexture, 0);
|
|
|
|
command_buffer->bind_texture(renderer->offscreenDepthTexture, 1);
|
|
|
|
command_buffer->bind_texture(aperture_texture->handle, 2);
|
|
|
|
|
|
|
|
const auto extent = renderer->get_render_extent();
|
|
|
|
|
2020-09-22 21:47:11 -04:00
|
|
|
Vector4 params(render_options.depth_of_field_strength, 0.0, 0.0, 0.0);
|
|
|
|
|
|
|
|
command_buffer->set_push_constant(¶ms, sizeof(Vector4));
|
|
|
|
|
|
|
|
command_buffer->draw(0, 4, 0, extent.width * extent.height);
|
|
|
|
|
|
|
|
// render normal field
|
|
|
|
beginInfo.framebuffer = normal_framebuffer;
|
|
|
|
|
|
|
|
command_buffer->set_render_pass(beginInfo);
|
|
|
|
|
|
|
|
command_buffer->set_graphics_pipeline(pipeline);
|
|
|
|
|
|
|
|
command_buffer->bind_texture(renderer->offscreenColorTexture, 0);
|
|
|
|
command_buffer->bind_texture(renderer->offscreenDepthTexture, 1);
|
|
|
|
command_buffer->bind_texture(aperture_texture->handle, 2);
|
|
|
|
|
|
|
|
params.y = 1;
|
|
|
|
|
|
|
|
command_buffer->set_push_constant(¶ms, sizeof(Vector4));
|
|
|
|
|
2020-08-11 12:07:21 -04:00
|
|
|
command_buffer->draw(0, 4, 0, extent.width * extent.height);
|
|
|
|
}
|