mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 16:16:16 +03:00
81 lines
3.1 KiB
C++
81 lines
3.1 KiB
C++
#include "../deferred_renderer.h"
|
|
#include "../render_scene.h"
|
|
#include "../renderer.h"
|
|
#include "../scene_textures.h"
|
|
|
|
namespace engine
|
|
{
|
|
class PostprocessingPass : public PassInterface
|
|
{
|
|
public:
|
|
std::unique_ptr<ComputePipeResources> pipeTonemapper;
|
|
|
|
public:
|
|
virtual void onInit() override
|
|
{
|
|
VkDescriptorSetLayout setLayoutTonemapper = VK_NULL_HANDLE;
|
|
getContext()->descriptorFactoryBegin()
|
|
.bindNoInfo(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0)
|
|
.bindNoInfo(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1)
|
|
.bindNoInfo(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2)
|
|
.bindNoInfo(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 3)
|
|
.bindNoInfo(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 4)
|
|
.bindNoInfo(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 5)
|
|
.buildNoInfoPush(setLayoutTonemapper);
|
|
|
|
std::vector<VkDescriptorSetLayout> setLayoutsTone =
|
|
{
|
|
setLayoutTonemapper,
|
|
getContext()->getSamplerCache().getCommonDescriptorSetLayout(),
|
|
getRenderer()->getBlueNoise().spp_1_buffer.setLayouts
|
|
};
|
|
|
|
pipeTonemapper = std::make_unique<ComputePipeResources>("shader/post_tonemapper.glsl", 0, setLayoutsTone);
|
|
}
|
|
|
|
virtual void release() override
|
|
{
|
|
pipeTonemapper.reset();
|
|
}
|
|
};
|
|
|
|
|
|
void DeferredRenderer::postprocessing(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
BufferParameterHandle perFrameGPU,
|
|
RenderScene* scene,
|
|
PoolImageSharedRef bloomTex,
|
|
PoolImageSharedRef debugTex)
|
|
{
|
|
auto* pass = getContext()->getPasses().get<PostprocessingPass>();
|
|
|
|
auto& hdrSceneColor = debugTex ? debugTex->getImage() : inGBuffers->hdrSceneColorUpscale->getImage();
|
|
auto& ldrSceneColor = getOutput()->getImage();
|
|
|
|
hdrSceneColor.transitionLayout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, buildBasicImageSubresource());
|
|
ldrSceneColor.transitionLayout(cmd, VK_IMAGE_LAYOUT_GENERAL, buildBasicImageSubresource());
|
|
{
|
|
ScopePerframeMarker marker(cmd, "Tonemapper", { 1.0f, 1.0f, 0.0f, 1.0f }, &m_gpuTimer);
|
|
pass->pipeTonemapper->bind(cmd);
|
|
|
|
PushSetBuilder(cmd)
|
|
.addBuffer(perFrameGPU)
|
|
.addSRV(hdrSceneColor)
|
|
.addUAV(ldrSceneColor)
|
|
.addSRV(m_history.averageLum)
|
|
.addSRV(bloomTex)
|
|
.addBuffer(inGBuffers->lensBuffer != nullptr ?
|
|
*inGBuffers->lensBuffer->getBuffer() :
|
|
*getRenderer()->getSharedTextures().zeroBuffer, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
|
|
.push(pass->pipeTonemapper.get());
|
|
|
|
pass->pipeTonemapper->bindSet(cmd, std::vector<VkDescriptorSet>{
|
|
getContext()->getSamplerCache().getCommonDescriptorSet(),
|
|
getRenderer()->getBlueNoise().spp_1_buffer.set
|
|
}, 1);
|
|
|
|
vkCmdDispatch(cmd, getGroupCount(ldrSceneColor.getExtent().width, 8), getGroupCount(ldrSceneColor.getExtent().height, 8), 1);
|
|
}
|
|
}
|
|
} |