mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 13:36:14 +03:00
252 lines
6.9 KiB
C++
252 lines
6.9 KiB
C++
#pragma once
|
|
#include "render_functions.h"
|
|
#include "fsr2_context.h"
|
|
|
|
namespace engine
|
|
{
|
|
struct SSSRResource
|
|
{
|
|
PoolImageSharedRef rt_ssrPrevRadiance = nullptr;
|
|
PoolImageSharedRef rt_ssrPrevVariance = nullptr;
|
|
PoolImageSharedRef rt_ssrPrevRoughness = nullptr; // history roughness, from ssr.
|
|
PoolImageSharedRef rt_ssrPrevSampleCount = nullptr; //
|
|
|
|
PoolImageSharedRef rt_ssrRadiance = nullptr;
|
|
PoolImageSharedRef rt_ssrVariance = nullptr;
|
|
PoolImageSharedRef rt_ssrRoughness = nullptr; //
|
|
PoolImageSharedRef rt_ssrSampleCount = nullptr; //
|
|
|
|
PoolImageSharedRef rt_ssrReproject = nullptr; //
|
|
PoolImageSharedRef rt_ssrAverageRadiance = nullptr; //
|
|
|
|
std::vector<VkDescriptorSet> sets = {};
|
|
};
|
|
|
|
struct RenderHistoryInfo
|
|
{
|
|
PoolImageSharedRef averageLum = nullptr;
|
|
PoolImageSharedRef historyUpscale = nullptr;
|
|
|
|
PoolImageSharedRef prevDepth = nullptr;
|
|
PoolImageSharedRef prevGBufferB = nullptr;
|
|
PoolImageSharedRef prevNormalVertex = nullptr;
|
|
PoolImageSharedRef prevHdrBeforeAA = nullptr;
|
|
PoolImageSharedRef prevGBufferID = nullptr;
|
|
|
|
PoolImageSharedRef ssgiHistory = nullptr;
|
|
PoolImageSharedRef ssgiMomentHistory = nullptr;
|
|
SSSRResource sssrResources = {};
|
|
|
|
PoolImageSharedRef cloudReconstruction = nullptr;
|
|
PoolImageSharedRef cloudReconstructionDepth = nullptr;
|
|
|
|
PoolImageSharedRef cloudShadowDepthHistory = nullptr;
|
|
PoolImageSharedRef cloudShadowDepthLowBlurHistory = nullptr;
|
|
|
|
PoolImageSharedRef volumetricFogScatterIntensity = nullptr;
|
|
PoolImageSharedRef prevHZBFurthest = nullptr;
|
|
PoolImageSharedRef prevHZBClosest = nullptr;
|
|
|
|
PoolImageSharedRef gtaoHistory = nullptr;
|
|
};
|
|
|
|
|
|
// Deferred realtime renderer, used for viewport editor.
|
|
class DeferredRenderer : NonCopyable
|
|
{
|
|
public:
|
|
static constexpr auto kMinRenderDim = 64U;
|
|
static constexpr auto kMaxRenderDim = 4096U;
|
|
|
|
class DimensionConfig
|
|
{
|
|
public:
|
|
DimensionConfig();
|
|
|
|
uint32_t getRenderWidth() const { return m_renderDim.x; }
|
|
uint32_t getRenderHeight() const { return m_renderDim.y; }
|
|
|
|
uint32_t getPostWidth() const { return m_postDim.x; }
|
|
uint32_t getPostHeight() const { return m_postDim.y; }
|
|
|
|
uint32_t getOutputWidth() const { return m_outputDim.x; }
|
|
uint32_t getOutputHeight() const { return m_outputDim.y; }
|
|
|
|
bool updateDimension(
|
|
uint32_t outputWidth,
|
|
uint32_t outputHeight,
|
|
float renderScaleToPost,
|
|
float postScaleToOutput);
|
|
|
|
auto operator<=>(const DimensionConfig&) const = default;
|
|
|
|
private:
|
|
// Dimension which render depth, gbuffer, lighting and pre-post effect.
|
|
math::uvec2 m_renderDim;
|
|
|
|
// Dimension which render Upscale, post-effect.
|
|
math::uvec2 m_postDim;
|
|
|
|
// Dimension which do final upscale to the viewport.
|
|
math::uvec2 m_outputDim;
|
|
|
|
|
|
float m_renderScaleToPost;
|
|
};
|
|
|
|
public:
|
|
void adaptiveExposure(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
const RuntimeModuleTickData& tickData);
|
|
|
|
void renderGrid(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
BufferParameterHandle perFrameGPU);
|
|
|
|
void getPickPixelObject(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU);
|
|
|
|
void renderSelectionOutline(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
BufferParameterHandle perFrameGPU,
|
|
RenderScene* scene);
|
|
|
|
void renderSSSR(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
PoolImageSharedRef inHiz,
|
|
PoolImageSharedRef inSSAOBentNormal,
|
|
const SkyLightRenderContext& inSky,
|
|
ReflectionProbeContext& reflectionProbeContext);
|
|
|
|
void postprocessing(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
BufferParameterHandle perFrameGPU,
|
|
RenderScene* scene,
|
|
PoolImageSharedRef bloomTex,
|
|
PoolImageSharedRef debugTex);
|
|
|
|
void temporalAntiAliasUpscale(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
BufferParameterHandle perFrameGPU,
|
|
RenderScene* scene);
|
|
|
|
PoolImageSharedRef renderSSAO(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
PoolImageSharedRef inHiz);
|
|
|
|
PoolImageSharedRef renderSSGI(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
PoolImageSharedRef inHiz,
|
|
const SkyLightRenderContext& inSky,
|
|
ReflectionProbeContext& reflectionProbeContext);
|
|
|
|
void renderDebugLine(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU);
|
|
|
|
void renderVolumetricCloud(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
AtmosphereTextures& inAtmosphere,
|
|
const PerFrameData& perframe,
|
|
const SkyLightRenderContext& skyContext,
|
|
const SDSMInfos& sunSDSMInfos);
|
|
|
|
void renderVolumetricFog(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
AtmosphereTextures& inAtmosphere,
|
|
const PerFrameData& perframe,
|
|
const SkyLightRenderContext& skyContext,
|
|
const SDSMInfos& sunSDSMInfos);
|
|
|
|
void renderVolumetricCloudShadowDepth(
|
|
VkCommandBuffer cmd,
|
|
GBufferTextures* inGBuffers,
|
|
RenderScene* scene,
|
|
BufferParameterHandle perFrameGPU,
|
|
AtmosphereTextures& inAtmosphere,
|
|
const PerFrameData& perframe,
|
|
const SkyLightRenderContext& skyContext);
|
|
|
|
public:
|
|
explicit DeferredRenderer();
|
|
virtual ~DeferredRenderer();
|
|
|
|
void tick(
|
|
const RuntimeModuleTickData& tickData,
|
|
VkCommandBuffer graphicsCmd,
|
|
CameraInterface* camera);
|
|
|
|
PoolImageSharedRef getOutput();
|
|
VulkanImage& getOutputVulkanImage();
|
|
|
|
const DimensionConfig& getDimensions() const { return m_dimensionConfig; }
|
|
const auto& getTimingValues() { return m_timeStamps; }
|
|
|
|
// Update dimension, return if change or not for each render/post/output dimension.
|
|
bool updateDimension(
|
|
uint32_t outputWidth,
|
|
uint32_t outputHeight,
|
|
float renderScaleToPost,
|
|
float postScaleToOutput);
|
|
|
|
void markCurrentFramePick(math::ivec2 pos, std::function<void(uint32_t pickCallback)>&& callback);
|
|
|
|
FSR2Context* getFSR2();
|
|
|
|
protected:
|
|
void clearHistoryResources(bool bClearOutput);
|
|
BufferParameterHandle preparePerframe(const RuntimeModuleTickData& tickData, CameraInterface* camera);
|
|
|
|
protected:
|
|
// GPU timer.
|
|
GPUTimestamps m_gpuTimer;
|
|
std::vector<GPUTimestamps::TimeStamp> m_timeStamps;
|
|
|
|
// Renderer tick counter.
|
|
uint32_t m_tickCount = 0;
|
|
|
|
// Renderer render indexing which reset to zero when equal to backbuffer count.
|
|
uint32_t m_renderIndex = 0;
|
|
|
|
DimensionConfig m_dimensionConfig = {};
|
|
|
|
// Renderer final display output, same with swapchain back buffer format.
|
|
PoolImageSharedRef m_outputImage;
|
|
|
|
PerFrameData m_perframe = { };
|
|
|
|
RenderHistoryInfo m_history = {};
|
|
PickPixelContext m_pickContext = {};
|
|
DebugLineDrawContext m_debugLine = {};
|
|
|
|
std::unique_ptr<FSR2Context> m_fsr2 = nullptr;
|
|
bool m_bCameraCut = true;
|
|
};
|
|
} |