| 1 | /**************************************************************************/ |
| 2 | /* renderer_scene_render_rd.h */ |
| 3 | /**************************************************************************/ |
| 4 | /* This file is part of: */ |
| 5 | /* GODOT ENGINE */ |
| 6 | /* https://godotengine.org */ |
| 7 | /**************************************************************************/ |
| 8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
| 9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
| 10 | /* */ |
| 11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
| 12 | /* a copy of this software and associated documentation files (the */ |
| 13 | /* "Software"), to deal in the Software without restriction, including */ |
| 14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
| 15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
| 16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
| 17 | /* the following conditions: */ |
| 18 | /* */ |
| 19 | /* The above copyright notice and this permission notice shall be */ |
| 20 | /* included in all copies or substantial portions of the Software. */ |
| 21 | /* */ |
| 22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
| 23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
| 24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
| 25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
| 26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
| 27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
| 28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| 29 | /**************************************************************************/ |
| 30 | |
| 31 | #ifndef RENDERER_SCENE_RENDER_RD_H |
| 32 | #define RENDERER_SCENE_RENDER_RD_H |
| 33 | |
| 34 | #include "core/templates/local_vector.h" |
| 35 | #include "core/templates/rid_owner.h" |
| 36 | #include "servers/rendering/renderer_compositor.h" |
| 37 | #include "servers/rendering/renderer_rd/cluster_builder_rd.h" |
| 38 | #include "servers/rendering/renderer_rd/effects/bokeh_dof.h" |
| 39 | #include "servers/rendering/renderer_rd/effects/copy_effects.h" |
| 40 | #include "servers/rendering/renderer_rd/effects/debug_effects.h" |
| 41 | #include "servers/rendering/renderer_rd/effects/fsr.h" |
| 42 | #include "servers/rendering/renderer_rd/effects/luminance.h" |
| 43 | #include "servers/rendering/renderer_rd/effects/tone_mapper.h" |
| 44 | #include "servers/rendering/renderer_rd/effects/vrs.h" |
| 45 | #include "servers/rendering/renderer_rd/environment/fog.h" |
| 46 | #include "servers/rendering/renderer_rd/environment/gi.h" |
| 47 | #include "servers/rendering/renderer_rd/environment/sky.h" |
| 48 | #include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" |
| 49 | #include "servers/rendering/renderer_rd/storage_rd/light_storage.h" |
| 50 | #include "servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h" |
| 51 | #include "servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h" |
| 52 | #include "servers/rendering/renderer_scene_render.h" |
| 53 | #include "servers/rendering/rendering_device.h" |
| 54 | #include "servers/rendering/rendering_method.h" |
| 55 | |
| 56 | // For RenderDataRD, possibly inherited from RefCounted and add proper getters for our implementation classes |
| 57 | |
| 58 | struct RenderDataRD { |
| 59 | Ref<RenderSceneBuffersRD> render_buffers; |
| 60 | RenderSceneDataRD *scene_data; |
| 61 | |
| 62 | const PagedArray<RenderGeometryInstance *> *instances = nullptr; |
| 63 | const PagedArray<RID> *lights = nullptr; |
| 64 | const PagedArray<RID> *reflection_probes = nullptr; |
| 65 | const PagedArray<RID> *voxel_gi_instances = nullptr; |
| 66 | const PagedArray<RID> *decals = nullptr; |
| 67 | const PagedArray<RID> *lightmaps = nullptr; |
| 68 | const PagedArray<RID> *fog_volumes = nullptr; |
| 69 | RID environment; |
| 70 | RID camera_attributes; |
| 71 | RID shadow_atlas; |
| 72 | RID occluder_debug_tex; |
| 73 | RID reflection_atlas; |
| 74 | RID reflection_probe; |
| 75 | int reflection_probe_pass = 0; |
| 76 | |
| 77 | RID cluster_buffer; |
| 78 | uint32_t cluster_size = 0; |
| 79 | uint32_t cluster_max_elements = 0; |
| 80 | |
| 81 | uint32_t directional_light_count = 0; |
| 82 | bool directional_light_soft_shadows = false; |
| 83 | |
| 84 | RenderingMethod::RenderInfo *render_info = nullptr; |
| 85 | |
| 86 | /* Shadow data */ |
| 87 | const RendererSceneRender::RenderShadowData *render_shadows = nullptr; |
| 88 | int render_shadow_count = 0; |
| 89 | |
| 90 | LocalVector<int> cube_shadows; |
| 91 | LocalVector<int> shadows; |
| 92 | LocalVector<int> directional_shadows; |
| 93 | |
| 94 | /* GI info */ |
| 95 | const RendererSceneRender::RenderSDFGIData *render_sdfgi_regions = nullptr; |
| 96 | int render_sdfgi_region_count = 0; |
| 97 | const RendererSceneRender::RenderSDFGIUpdateData *sdfgi_update_data = nullptr; |
| 98 | |
| 99 | uint32_t voxel_gi_count = 0; |
| 100 | }; |
| 101 | |
| 102 | class RendererSceneRenderRD : public RendererSceneRender { |
| 103 | friend RendererRD::SkyRD; |
| 104 | friend RendererRD::GI; |
| 105 | |
| 106 | protected: |
| 107 | RendererRD::ForwardIDStorage *forward_id_storage = nullptr; |
| 108 | RendererRD::BokehDOF *bokeh_dof = nullptr; |
| 109 | RendererRD::CopyEffects *copy_effects = nullptr; |
| 110 | RendererRD::DebugEffects *debug_effects = nullptr; |
| 111 | RendererRD::Luminance *luminance = nullptr; |
| 112 | RendererRD::ToneMapper *tone_mapper = nullptr; |
| 113 | RendererRD::FSR *fsr = nullptr; |
| 114 | RendererRD::VRS *vrs = nullptr; |
| 115 | double time = 0.0; |
| 116 | double time_step = 0.0; |
| 117 | |
| 118 | /* ENVIRONMENT */ |
| 119 | |
| 120 | bool glow_bicubic_upscale = false; |
| 121 | |
| 122 | bool use_physical_light_units = false; |
| 123 | |
| 124 | //////////////////////////////// |
| 125 | |
| 126 | virtual RendererRD::ForwardIDStorage *create_forward_id_storage() { return memnew(RendererRD::ForwardIDStorage); }; |
| 127 | |
| 128 | void _update_vrs(Ref<RenderSceneBuffersRD> p_render_buffers); |
| 129 | |
| 130 | virtual void setup_render_buffer_data(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; |
| 131 | |
| 132 | virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_color) = 0; |
| 133 | virtual void _render_buffers_debug_draw(const RenderDataRD *p_render_data); |
| 134 | |
| 135 | virtual void _render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region, float p_exposure_normalization) = 0; |
| 136 | virtual void _render_uv2(const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) = 0; |
| 137 | virtual void _render_sdfgi(Ref<RenderSceneBuffersRD> p_render_buffers, const Vector3i &p_from, const Vector3i &p_size, const AABB &p_bounds, const PagedArray<RenderGeometryInstance *> &p_instances, const RID &p_albedo_texture, const RID &p_emission_texture, const RID &p_emission_aniso_texture, const RID &p_geom_facing_texture, float p_exposure_normalization) = 0; |
| 138 | virtual void _render_particle_collider_heightfield(RID p_fb, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const PagedArray<RenderGeometryInstance *> &p_instances) = 0; |
| 139 | |
| 140 | void _debug_sdfgi_probes(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_framebuffer, uint32_t p_view_count, const Projection *p_camera_with_transforms, bool p_will_continue_color, bool p_will_continue_depth); |
| 141 | |
| 142 | virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; |
| 143 | virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; |
| 144 | |
| 145 | bool _needs_post_prepass_render(RenderDataRD *p_render_data, bool p_use_gi); |
| 146 | void _post_prepass_render(RenderDataRD *p_render_data, bool p_use_gi); |
| 147 | void _pre_resolve_render(RenderDataRD *p_render_data, bool p_use_gi); |
| 148 | |
| 149 | void _render_buffers_copy_screen_texture(const RenderDataRD *p_render_data); |
| 150 | void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data); |
| 151 | void _render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data); |
| 152 | void _post_process_subpass(RID p_source_texture, RID p_framebuffer, const RenderDataRD *p_render_data); |
| 153 | void _disable_clear_request(const RenderDataRD *p_render_data); |
| 154 | |
| 155 | // needed for a single argument calls (material and uv2) |
| 156 | PagedArrayPool<RenderGeometryInstance *> cull_argument_pool; |
| 157 | PagedArray<RenderGeometryInstance *> cull_argument; //need this to exist |
| 158 | |
| 159 | RendererRD::SkyRD sky; |
| 160 | RendererRD::GI gi; |
| 161 | |
| 162 | virtual void _update_shader_quality_settings() {} |
| 163 | |
| 164 | private: |
| 165 | RS::ViewportDebugDraw debug_draw = RS::VIEWPORT_DEBUG_DRAW_DISABLED; |
| 166 | static RendererSceneRenderRD *singleton; |
| 167 | |
| 168 | /* Shadow atlas */ |
| 169 | RS::ShadowQuality shadows_quality = RS::SHADOW_QUALITY_MAX; //So it always updates when first set |
| 170 | RS::ShadowQuality directional_shadow_quality = RS::SHADOW_QUALITY_MAX; |
| 171 | float shadows_quality_radius = 1.0; |
| 172 | float directional_shadow_quality_radius = 1.0; |
| 173 | |
| 174 | float *directional_penumbra_shadow_kernel = nullptr; |
| 175 | float *directional_soft_shadow_kernel = nullptr; |
| 176 | float *penumbra_shadow_kernel = nullptr; |
| 177 | float *soft_shadow_kernel = nullptr; |
| 178 | int directional_penumbra_shadow_samples = 0; |
| 179 | int directional_soft_shadow_samples = 0; |
| 180 | int penumbra_shadow_samples = 0; |
| 181 | int soft_shadow_samples = 0; |
| 182 | RS::DecalFilter decals_filter = RS::DECAL_FILTER_LINEAR_MIPMAPS; |
| 183 | RS::LightProjectorFilter light_projectors_filter = RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS; |
| 184 | |
| 185 | /* RENDER BUFFERS */ |
| 186 | |
| 187 | /* GI */ |
| 188 | bool screen_space_roughness_limiter = false; |
| 189 | float screen_space_roughness_limiter_amount = 0.25; |
| 190 | float screen_space_roughness_limiter_limit = 0.18; |
| 191 | |
| 192 | /* Light data */ |
| 193 | |
| 194 | uint64_t scene_pass = 0; |
| 195 | |
| 196 | uint32_t max_cluster_elements = 512; |
| 197 | |
| 198 | /* Volumetric Fog */ |
| 199 | |
| 200 | uint32_t volumetric_fog_size = 128; |
| 201 | uint32_t volumetric_fog_depth = 128; |
| 202 | bool volumetric_fog_filter_active = true; |
| 203 | |
| 204 | public: |
| 205 | static RendererSceneRenderRD *get_singleton() { return singleton; } |
| 206 | |
| 207 | /* LIGHTING */ |
| 208 | |
| 209 | virtual void setup_added_reflection_probe(const Transform3D &p_transform, const Vector3 &p_half_size){}; |
| 210 | virtual void setup_added_light(const RS::LightType p_type, const Transform3D &p_transform, float p_radius, float p_spot_aperture){}; |
| 211 | virtual void setup_added_decal(const Transform3D &p_transform, const Vector3 &p_half_size){}; |
| 212 | |
| 213 | /* GI */ |
| 214 | |
| 215 | RendererRD::GI *get_gi() { return &gi; } |
| 216 | |
| 217 | /* SKY */ |
| 218 | |
| 219 | RendererRD::SkyRD *get_sky() { return &sky; } |
| 220 | |
| 221 | /* SKY API */ |
| 222 | |
| 223 | virtual RID sky_allocate() override; |
| 224 | virtual void sky_initialize(RID p_rid) override; |
| 225 | |
| 226 | virtual void sky_set_radiance_size(RID p_sky, int p_radiance_size) override; |
| 227 | virtual void sky_set_mode(RID p_sky, RS::SkyMode p_mode) override; |
| 228 | virtual void sky_set_material(RID p_sky, RID p_material) override; |
| 229 | virtual Ref<Image> sky_bake_panorama(RID p_sky, float p_energy, bool p_bake_irradiance, const Size2i &p_size) override; |
| 230 | |
| 231 | /* ENVIRONMENT API */ |
| 232 | |
| 233 | virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) override; |
| 234 | |
| 235 | virtual void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override; |
| 236 | virtual void environment_set_volumetric_fog_filter_active(bool p_enable) override; |
| 237 | |
| 238 | virtual void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) override; |
| 239 | virtual void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) override; |
| 240 | virtual void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) override; |
| 241 | |
| 242 | virtual Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) override; |
| 243 | |
| 244 | _FORCE_INLINE_ bool is_using_physical_light_units() { |
| 245 | return use_physical_light_units; |
| 246 | } |
| 247 | |
| 248 | /* REFLECTION PROBE */ |
| 249 | |
| 250 | virtual RID reflection_probe_create_framebuffer(RID p_color, RID p_depth); |
| 251 | |
| 252 | /* FOG VOLUMES */ |
| 253 | |
| 254 | uint32_t get_volumetric_fog_size() const { return volumetric_fog_size; } |
| 255 | uint32_t get_volumetric_fog_depth() const { return volumetric_fog_depth; } |
| 256 | bool get_volumetric_fog_filter_active() const { return volumetric_fog_filter_active; } |
| 257 | |
| 258 | virtual RID fog_volume_instance_create(RID p_fog_volume) override; |
| 259 | virtual void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) override; |
| 260 | virtual void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) override; |
| 261 | virtual RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const override; |
| 262 | virtual Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const override; |
| 263 | |
| 264 | /* gi light probes */ |
| 265 | |
| 266 | virtual RID voxel_gi_instance_create(RID p_base) override; |
| 267 | virtual void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) override; |
| 268 | virtual bool voxel_gi_needs_update(RID p_probe) const override; |
| 269 | virtual void voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects) override; |
| 270 | virtual void voxel_gi_set_quality(RS::VoxelGIQuality p_quality) override { gi.voxel_gi_quality = p_quality; } |
| 271 | |
| 272 | /* render buffers */ |
| 273 | |
| 274 | virtual float _render_buffers_get_luminance_multiplier(); |
| 275 | virtual RD::DataFormat _render_buffers_get_color_format(); |
| 276 | virtual bool _render_buffers_can_be_storage(); |
| 277 | virtual Ref<RenderSceneBuffers> render_buffers_create() override; |
| 278 | virtual void gi_set_use_half_resolution(bool p_enable) override; |
| 279 | |
| 280 | RID render_buffers_get_default_voxel_gi_buffer(); |
| 281 | |
| 282 | virtual void base_uniforms_changed() = 0; |
| 283 | virtual void update_uniform_sets(){}; |
| 284 | |
| 285 | virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) override; |
| 286 | |
| 287 | virtual void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; |
| 288 | |
| 289 | virtual void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) override; |
| 290 | |
| 291 | virtual void set_scene_pass(uint64_t p_pass) override { |
| 292 | scene_pass = p_pass; |
| 293 | } |
| 294 | _FORCE_INLINE_ uint64_t get_scene_pass() { |
| 295 | return scene_pass; |
| 296 | } |
| 297 | |
| 298 | virtual void screen_space_roughness_limiter_set_active(bool p_enable, float p_amount, float p_limit) override; |
| 299 | virtual bool screen_space_roughness_limiter_is_active() const override; |
| 300 | virtual float screen_space_roughness_limiter_get_amount() const; |
| 301 | virtual float screen_space_roughness_limiter_get_limit() const; |
| 302 | |
| 303 | virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; |
| 304 | virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; |
| 305 | |
| 306 | virtual void decals_set_filter(RS::DecalFilter p_filter) override; |
| 307 | virtual void light_projectors_set_filter(RS::LightProjectorFilter p_filter) override; |
| 308 | |
| 309 | _FORCE_INLINE_ RS::ShadowQuality shadows_quality_get() const { |
| 310 | return shadows_quality; |
| 311 | } |
| 312 | _FORCE_INLINE_ RS::ShadowQuality directional_shadow_quality_get() const { |
| 313 | return directional_shadow_quality; |
| 314 | } |
| 315 | _FORCE_INLINE_ float shadows_quality_radius_get() const { |
| 316 | return shadows_quality_radius; |
| 317 | } |
| 318 | _FORCE_INLINE_ float directional_shadow_quality_radius_get() const { |
| 319 | return directional_shadow_quality_radius; |
| 320 | } |
| 321 | |
| 322 | _FORCE_INLINE_ float *directional_penumbra_shadow_kernel_get() { |
| 323 | return directional_penumbra_shadow_kernel; |
| 324 | } |
| 325 | _FORCE_INLINE_ float *directional_soft_shadow_kernel_get() { |
| 326 | return directional_soft_shadow_kernel; |
| 327 | } |
| 328 | _FORCE_INLINE_ float *penumbra_shadow_kernel_get() { |
| 329 | return penumbra_shadow_kernel; |
| 330 | } |
| 331 | _FORCE_INLINE_ float *soft_shadow_kernel_get() { |
| 332 | return soft_shadow_kernel; |
| 333 | } |
| 334 | |
| 335 | _FORCE_INLINE_ int directional_penumbra_shadow_samples_get() const { |
| 336 | return directional_penumbra_shadow_samples; |
| 337 | } |
| 338 | _FORCE_INLINE_ int directional_soft_shadow_samples_get() const { |
| 339 | return directional_soft_shadow_samples; |
| 340 | } |
| 341 | _FORCE_INLINE_ int penumbra_shadow_samples_get() const { |
| 342 | return penumbra_shadow_samples; |
| 343 | } |
| 344 | _FORCE_INLINE_ int soft_shadow_samples_get() const { |
| 345 | return soft_shadow_samples; |
| 346 | } |
| 347 | |
| 348 | _FORCE_INLINE_ RS::LightProjectorFilter light_projectors_get_filter() const { |
| 349 | return light_projectors_filter; |
| 350 | } |
| 351 | _FORCE_INLINE_ RS::DecalFilter decals_get_filter() const { |
| 352 | return decals_filter; |
| 353 | } |
| 354 | |
| 355 | int get_roughness_layers() const; |
| 356 | bool is_using_radiance_cubemap_array() const; |
| 357 | |
| 358 | virtual TypedArray<Image> bake_render_uv2(RID p_base, const TypedArray<RID> &p_material_overrides, const Size2i &p_image_size) override; |
| 359 | |
| 360 | virtual bool free(RID p_rid) override; |
| 361 | |
| 362 | virtual void update() override; |
| 363 | |
| 364 | virtual void set_debug_draw_mode(RS::ViewportDebugDraw p_debug_draw) override; |
| 365 | _FORCE_INLINE_ RS::ViewportDebugDraw get_debug_draw_mode() const { |
| 366 | return debug_draw; |
| 367 | } |
| 368 | |
| 369 | virtual void set_time(double p_time, double p_step) override; |
| 370 | |
| 371 | virtual void sdfgi_set_debug_probe_select(const Vector3 &p_position, const Vector3 &p_dir) override; |
| 372 | |
| 373 | virtual bool is_vrs_supported() const; |
| 374 | virtual bool is_dynamic_gi_supported() const; |
| 375 | virtual bool is_volumetric_supported() const; |
| 376 | virtual uint32_t get_max_elements() const; |
| 377 | |
| 378 | void init(); |
| 379 | |
| 380 | RendererSceneRenderRD(); |
| 381 | ~RendererSceneRenderRD(); |
| 382 | }; |
| 383 | |
| 384 | #endif // RENDERER_SCENE_RENDER_RD_H |
| 385 | |