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 | |