Path: blob/master/servers/rendering/renderer_rd/effects/ss_effects.h
21277 views
/**************************************************************************/1/* ss_effects.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "servers/rendering/renderer_rd/pipeline_deferred_rd.h"33#include "servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl.gen.h"34#include "servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_downsample.glsl.gen.h"35#include "servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_filter.glsl.gen.h"36#include "servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_hiz.glsl.gen.h"37#include "servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_resolve.glsl.gen.h"38#include "servers/rendering/renderer_rd/shaders/effects/ss_effects_downsample.glsl.gen.h"39#include "servers/rendering/renderer_rd/shaders/effects/ssao.glsl.gen.h"40#include "servers/rendering/renderer_rd/shaders/effects/ssao_blur.glsl.gen.h"41#include "servers/rendering/renderer_rd/shaders/effects/ssao_importance_map.glsl.gen.h"42#include "servers/rendering/renderer_rd/shaders/effects/ssao_interleave.glsl.gen.h"43#include "servers/rendering/renderer_rd/shaders/effects/ssil.glsl.gen.h"44#include "servers/rendering/renderer_rd/shaders/effects/ssil_blur.glsl.gen.h"45#include "servers/rendering/renderer_rd/shaders/effects/ssil_importance_map.glsl.gen.h"46#include "servers/rendering/renderer_rd/shaders/effects/ssil_interleave.glsl.gen.h"47#include "servers/rendering/renderer_rd/shaders/effects/subsurface_scattering.glsl.gen.h"48#include "servers/rendering/rendering_server.h"4950#define RB_SCOPE_SSLF SNAME("rb_sslf")51#define RB_SCOPE_SSDS SNAME("rb_ssds")52#define RB_SCOPE_SSIL SNAME("rb_ssil")53#define RB_SCOPE_SSAO SNAME("rb_ssao")54#define RB_SCOPE_SSR SNAME("rb_ssr")5556#define RB_LINEAR_DEPTH SNAME("linear_depth")57#define RB_FINAL SNAME("final")58#define RB_LAST_FRAME SNAME("last_frame")59#define RB_DEINTERLEAVED SNAME("deinterleaved")60#define RB_DEINTERLEAVED_PONG SNAME("deinterleaved_pong")61#define RB_EDGES SNAME("edges")62#define RB_IMPORTANCE_MAP SNAME("importance_map")63#define RB_IMPORTANCE_PONG SNAME("importance_pong")6465#define RB_NORMAL_ROUGHNESS SNAME("normal_roughness")66#define RB_HIZ SNAME("hiz")67#define RB_SSR SNAME("ssr")68#define RB_MIP_LEVEL SNAME("mip_level")6970class RenderSceneBuffersRD;7172namespace RendererRD {7374class CopyEffects;7576class SSEffects {77private:78static SSEffects *singleton;7980public:81static SSEffects *get_singleton() { return singleton; }8283SSEffects();84~SSEffects();8586/* Last Frame */8788void allocate_last_frame_buffer(Ref<RenderSceneBuffersRD> p_render_buffers, bool p_use_ssil, bool p_use_ssr);89void copy_internal_texture_to_last_frame(Ref<RenderSceneBuffersRD> p_render_buffers, CopyEffects &p_copy_effects);9091/* SS Downsampler */9293void downsample_depth(Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_view, const Projection &p_projection);9495/* SSIL */96void ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to);9798struct SSILRenderBuffers {99bool half_size = false;100int buffer_width;101int buffer_height;102int half_buffer_width;103int half_buffer_height;104};105106struct SSILSettings {107float radius = 1.0;108float intensity = 2.0;109float sharpness = 0.98;110float normal_rejection = 1.0;111112Size2i full_screen_size;113};114115void ssil_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings);116void screen_space_indirect_lighting(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings);117118/* SSAO */119void ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to);120121struct SSAORenderBuffers {122bool half_size = false;123int buffer_width;124int buffer_height;125int half_buffer_width;126int half_buffer_height;127};128129struct SSAOSettings {130float radius = 1.0;131float intensity = 2.0;132float power = 1.5;133float detail = 0.5;134float horizon = 0.06;135float sharpness = 0.98;136137Size2i full_screen_size;138};139140void ssao_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings);141void generate_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings);142143/* Screen Space Reflection */144void ssr_set_half_size(bool p_half_size);145146struct SSRRenderBuffers {147Size2i size;148uint32_t mipmaps = 1;149bool half_size = false;150};151152void ssr_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RD::DataFormat p_color_format);153void screen_space_reflection(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RID *p_normal_roughness_slices, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const Projection *p_projections, const Projection *p_reprojections, const Vector3 *p_eye_offsets, RendererRD::CopyEffects &p_copy_effects);154155/* subsurface scattering */156void sss_set_quality(RS::SubSurfaceScatteringQuality p_quality);157RS::SubSurfaceScatteringQuality sss_get_quality() const;158void sss_set_scale(float p_scale, float p_depth_scale);159160void sub_surface_scattering(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_diffuse, RID p_depth, const Projection &p_camera, const Size2i &p_screen_size);161162private:163/* Settings */164165RS::EnvironmentSSAOQuality ssao_quality = RS::ENV_SSAO_QUALITY_MEDIUM;166bool ssao_half_size = false;167float ssao_adaptive_target = 0.5;168int ssao_blur_passes = 2;169float ssao_fadeout_from = 50.0;170float ssao_fadeout_to = 300.0;171172RS::EnvironmentSSILQuality ssil_quality = RS::ENV_SSIL_QUALITY_MEDIUM;173bool ssil_half_size = false;174float ssil_adaptive_target = 0.5;175int ssil_blur_passes = 4;176float ssil_fadeout_from = 50.0;177float ssil_fadeout_to = 300.0;178179bool ssr_half_size = false;180181RS::SubSurfaceScatteringQuality sss_quality = RS::SUB_SURFACE_SCATTERING_QUALITY_MEDIUM;182float sss_scale = 0.05;183float sss_depth_scale = 0.01;184185/* SS Downsampler */186187struct SSEffectsDownsamplePushConstant {188float pixel_size[2];189float z_far;190float z_near;191uint32_t orthogonal;192float radius_sq;193uint32_t pad[2];194};195196enum SSEffectsMode {197SS_EFFECTS_DOWNSAMPLE,198SS_EFFECTS_DOWNSAMPLE_HALF_RES,199SS_EFFECTS_DOWNSAMPLE_MIPMAP,200SS_EFFECTS_DOWNSAMPLE_MIPMAP_HALF_RES,201SS_EFFECTS_DOWNSAMPLE_HALF,202SS_EFFECTS_DOWNSAMPLE_HALF_RES_HALF,203SS_EFFECTS_DOWNSAMPLE_FULL_MIPS,204SS_EFFECTS_MAX205};206207struct SSEffectsGatherConstants {208float rotation_matrices[80]; //5 vec4s * 4209};210211struct SSEffectsShader {212SSEffectsDownsamplePushConstant downsample_push_constant;213SsEffectsDownsampleShaderRD downsample_shader;214RID downsample_shader_version;215bool used_half_size_last_frame = false;216bool used_mips_last_frame = false;217bool used_full_mips_last_frame = false;218219RID gather_constants_buffer;220221RID mirror_sampler;222223PipelineDeferredRD pipelines[SS_EFFECTS_MAX];224} ss_effects;225226/* SSIL */227228enum SSILMode {229SSIL_GATHER,230SSIL_GATHER_BASE,231SSIL_GATHER_ADAPTIVE,232SSIL_GENERATE_IMPORTANCE_MAP,233SSIL_PROCESS_IMPORTANCE_MAPA,234SSIL_PROCESS_IMPORTANCE_MAPB,235SSIL_BLUR_PASS,236SSIL_BLUR_PASS_SMART,237SSIL_BLUR_PASS_WIDE,238SSIL_INTERLEAVE,239SSIL_INTERLEAVE_SMART,240SSIL_INTERLEAVE_HALF,241SSIL_MAX242};243244struct SSILGatherPushConstant {245int32_t screen_size[2];246int pass;247int quality;248249float half_screen_pixel_size[2];250float half_screen_pixel_size_x025[2];251252float NDC_to_view_mul[2];253float NDC_to_view_add[2];254255float pad2[2];256float z_near;257float z_far;258259float radius;260float intensity;261int size_multiplier;262int pad;263264float fade_out_mul;265float fade_out_add;266float normal_rejection_amount;267float inv_radius_near_limit;268269uint32_t is_orthogonal;270float neg_inv_radius;271float load_counter_avg_div;272float adaptive_sample_limit;273274int32_t pass_coord_offset[2];275float pass_uv_offset[2];276};277278struct SSILImportanceMapPushConstant {279float half_screen_pixel_size[2];280float intensity;281float pad;282};283284struct SSILBlurPushConstant {285float edge_sharpness;286float pad;287float half_screen_pixel_size[2];288};289290struct SSILInterleavePushConstant {291float inv_sharpness;292uint32_t size_modifier;293float pixel_size[2];294};295296struct SSILProjectionUniforms {297float inv_last_frame_projection_matrix[16];298};299300struct SSIL {301SSILGatherPushConstant gather_push_constant;302SsilShaderRD gather_shader;303RID gather_shader_version;304RID projection_uniform_buffer;305306SSILImportanceMapPushConstant importance_map_push_constant;307SsilImportanceMapShaderRD importance_map_shader;308RID importance_map_shader_version;309RID importance_map_load_counter;310RID counter_uniform_set;311312SSILBlurPushConstant blur_push_constant;313SsilBlurShaderRD blur_shader;314RID blur_shader_version;315316SSILInterleavePushConstant interleave_push_constant;317SsilInterleaveShaderRD interleave_shader;318RID interleave_shader_version;319320PipelineDeferredRD pipelines[SSIL_MAX];321} ssil;322323void gather_ssil(RD::ComputeListID p_compute_list, const RID *p_ssil_slices, const RID *p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set);324325/* SSAO */326327enum SSAOMode {328SSAO_GATHER,329SSAO_GATHER_BASE,330SSAO_GATHER_ADAPTIVE,331SSAO_GENERATE_IMPORTANCE_MAP,332SSAO_PROCESS_IMPORTANCE_MAPA,333SSAO_PROCESS_IMPORTANCE_MAPB,334SSAO_BLUR_PASS,335SSAO_BLUR_PASS_SMART,336SSAO_BLUR_PASS_WIDE,337SSAO_INTERLEAVE,338SSAO_INTERLEAVE_SMART,339SSAO_INTERLEAVE_HALF,340SSAO_MAX341};342343struct SSAOGatherPushConstant {344int32_t screen_size[2];345int pass;346int quality;347348float half_screen_pixel_size[2];349int size_multiplier;350float detail_intensity;351352float NDC_to_view_mul[2];353float NDC_to_view_add[2];354355float pad[2];356float half_screen_pixel_size_x025[2];357358float radius;359float intensity;360float shadow_power;361float shadow_clamp;362363float fade_out_mul;364float fade_out_add;365float horizon_angle_threshold;366float inv_radius_near_limit;367368uint32_t is_orthogonal;369float neg_inv_radius;370float load_counter_avg_div;371float adaptive_sample_limit;372373int32_t pass_coord_offset[2];374float pass_uv_offset[2];375};376377struct SSAOImportanceMapPushConstant {378float half_screen_pixel_size[2];379float intensity;380float power;381};382383struct SSAOBlurPushConstant {384float edge_sharpness;385float pad;386float half_screen_pixel_size[2];387};388389struct SSAOInterleavePushConstant {390float inv_sharpness;391uint32_t size_modifier;392float pixel_size[2];393};394395struct SSAO {396SSAOGatherPushConstant gather_push_constant;397SsaoShaderRD gather_shader;398RID gather_shader_version;399400SSAOImportanceMapPushConstant importance_map_push_constant;401SsaoImportanceMapShaderRD importance_map_shader;402RID importance_map_shader_version;403RID importance_map_load_counter;404RID counter_uniform_set;405406SSAOBlurPushConstant blur_push_constant;407SsaoBlurShaderRD blur_shader;408RID blur_shader_version;409410SSAOInterleavePushConstant interleave_push_constant;411SsaoInterleaveShaderRD interleave_shader;412RID interleave_shader_version;413414PipelineDeferredRD pipelines[SSAO_MAX];415} ssao;416417void gather_ssao(RD::ComputeListID p_compute_list, const RID *p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set);418419/* Screen Space Reflection */420421enum ScreenSpaceReflectionDownsampleMode {422SCREEN_SPACE_REFLECTION_DOWNSAMPLE_DEFAULT,423SCREEN_SPACE_REFLECTION_DOWNSAMPLE_ODD_WIDTH,424SCREEN_SPACE_REFLECTION_DOWNSAMPLE_ODD_HEIGHT,425SCREEN_SPACE_REFLECTION_DOWNSAMPLE_ODD_WIDTH_AND_HEIGHT,426SCREEN_SPACE_REFLECTION_DOWNSAMPLE_MAX427};428429struct ScreenSpaceReflectionDownsamplePushConstant {430int32_t screen_size[2];431int32_t pad[2];432};433434enum ScreenSpaceReflectionHizMode {435SCREEN_SPACE_REFLECTION_HIZ_DEFAULT,436SCREEN_SPACE_REFLECTION_HIZ_ODD_WIDTH,437SCREEN_SPACE_REFLECTION_HIZ_ODD_HEIGHT,438SCREEN_SPACE_REFLECTION_HIZ_ODD_WIDTH_AND_HEIGHT,439SCREEN_SPACE_REFLECTION_HIZ_MAX440};441442struct ScreenSpaceReflectionHizPushConstant {443int32_t screen_size[2];444int32_t pad[2];445};446447struct ScreenSpaceReflectionSceneData {448float projection[2][16];449float inv_projection[2][16];450float reprojection[2][16];451float eye_offset[2][4];452};453454struct ScreenSpaceReflectionPushConstant {455int32_t screen_size[2];456int32_t mipmaps;457int32_t num_steps;458float distance_fade;459float curve_fade_in;460float depth_tolerance;461int32_t orthogonal;462uint32_t view_index;463int32_t pad[3];464};465466struct ScreenSpaceReflectionFilterPushConstant {467int32_t screen_size[2];468uint32_t mip_level;469int32_t pad;470};471472struct ScreenSpaceReflectionResolvePushConstant {473int32_t screen_size[2];474int32_t pad[2];475};476477struct ScreenSpaceReflection {478ScreenSpaceReflectionDownsampleShaderRD downsample_shader;479RID downsample_shader_version;480PipelineDeferredRD downsample_pipelines[SCREEN_SPACE_REFLECTION_DOWNSAMPLE_MAX];481482ScreenSpaceReflectionHizShaderRD hiz_shader;483RID hiz_shader_version;484PipelineDeferredRD hiz_pipelines[SCREEN_SPACE_REFLECTION_HIZ_MAX];485486ScreenSpaceReflectionShaderRD ssr_shader;487RID ssr_shader_version;488PipelineDeferredRD ssr_pipeline;489RID ubo;490491ScreenSpaceReflectionFilterShaderRD filter_shader;492RID filter_shader_version;493PipelineDeferredRD filter_pipeline;494495ScreenSpaceReflectionResolveShaderRD resolve_shader;496RID resolve_shader_version;497PipelineDeferredRD resolve_pipeline;498} ssr;499500/* Subsurface scattering */501502enum SSSMode {503SUBSURFACE_SCATTERING_MODE_LOW_QUALITY,504SUBSURFACE_SCATTERING_MODE_MEDIUM_QUALITY,505SUBSURFACE_SCATTERING_MODE_HIGH_QUALITY,506SUBSURFACE_SCATTERING_MODE_MAX507};508509struct SubSurfaceScatteringPushConstant {510int32_t screen_size[2];511float camera_z_far;512float camera_z_near;513514uint32_t vertical;515uint32_t orthogonal;516float unit_size;517float scale;518519float depth_scale;520uint32_t pad[3];521};522523struct SubSurfaceScattering {524SubSurfaceScatteringPushConstant push_constant;525SubsurfaceScatteringShaderRD shader;526RID shader_version;527PipelineDeferredRD pipelines[SUBSURFACE_SCATTERING_MODE_MAX];528} sss;529};530531} // namespace RendererRD532533534