summaryrefslogtreecommitdiffstats
path: root/servers/rendering/renderer_scene_cull.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'servers/rendering/renderer_scene_cull.cpp')
-rw-r--r--servers/rendering/renderer_scene_cull.cpp49
1 files changed, 29 insertions, 20 deletions
diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp
index 45bbcf51c4..cf7355945b 100644
--- a/servers/rendering/renderer_scene_cull.cpp
+++ b/servers/rendering/renderer_scene_cull.cpp
@@ -37,6 +37,21 @@
#include <new>
+/* HALTON SEQUENCE */
+
+#ifndef _3D_DISABLED
+static float get_halton_value(int p_index, int p_base) {
+ float f = 1;
+ float r = 0;
+ while (p_index > 0) {
+ f = f / static_cast<float>(p_base);
+ r = r + f * (p_index % p_base);
+ p_index = p_index / p_base;
+ }
+ return r * 2.0f - 1.0f;
+}
+#endif // _3D_DISABLED
+
/* CAMERA API */
RID RendererSceneCull::camera_allocate() {
@@ -2498,15 +2513,26 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
return animated_material_found;
}
-void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, bool p_use_taa, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RenderInfo *r_render_info) {
+void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, uint32_t p_jitter_phase_count, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RenderInfo *r_render_info) {
#ifndef _3D_DISABLED
Camera *camera = camera_owner.get_or_null(p_camera);
ERR_FAIL_COND(!camera);
Vector2 jitter;
- if (p_use_taa) {
- jitter = taa_jitter_array[RSG::rasterizer->get_frame_number() % TAA_JITTER_COUNT] / p_viewport_size;
+ if (p_jitter_phase_count > 0) {
+ uint32_t current_jitter_count = camera_jitter_array.size();
+ if (p_jitter_phase_count != current_jitter_count) {
+ // Resize the jitter array and fill it with the pre-computed Halton sequence.
+ camera_jitter_array.resize(p_jitter_phase_count);
+
+ for (uint32_t i = current_jitter_count; i < p_jitter_phase_count; i++) {
+ camera_jitter_array[i].x = get_halton_value(i, 2);
+ camera_jitter_array[i].y = get_halton_value(i, 3);
+ }
+ }
+
+ jitter = camera_jitter_array[RSG::rasterizer->get_frame_number() % p_jitter_phase_count] / p_viewport_size;
}
RendererSceneRender::CameraData camera_data;
@@ -4113,17 +4139,6 @@ void RendererSceneCull::set_scene_render(RendererSceneRender *p_scene_render) {
geometry_instance_pair_mask = scene_render->geometry_instance_get_pair_mask();
}
-float get_halton_value(int index, int base) {
- float f = 1;
- float r = 0;
- while (index > 0) {
- f = f / static_cast<float>(base);
- r = r + f * (index % base);
- index = index / base;
- }
- return r * 2.0f - 1.0f;
-};
-
RendererSceneCull::RendererSceneCull() {
render_pass = 1;
singleton = this;
@@ -4148,12 +4163,6 @@ RendererSceneCull::RendererSceneCull() {
thread_cull_threshold = GLOBAL_GET("rendering/limits/spatial_indexer/threaded_cull_minimum_instances");
thread_cull_threshold = MAX(thread_cull_threshold, (uint32_t)WorkerThreadPool::get_singleton()->get_thread_count()); //make sure there is at least one thread per CPU
- taa_jitter_array.resize(TAA_JITTER_COUNT);
- for (int i = 0; i < TAA_JITTER_COUNT; i++) {
- taa_jitter_array[i].x = get_halton_value(i, 2);
- taa_jitter_array[i].y = get_halton_value(i, 3);
- }
-
dummy_occlusion_culling = memnew(RendererSceneOcclusionCull);
}