You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Initial TAA implementation
Initial TAA support based on the implementation in Spartan Engine. Motion vectors are correctly generated for camera and mesh movement, but there is no support for other things like particles or skeleton deformations.
This commit is contained in:
@@ -2433,12 +2433,17 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
||||
return animated_material_found;
|
||||
}
|
||||
|
||||
void RendererSceneCull::render_camera(RID p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RenderInfo *r_render_info) {
|
||||
void RendererSceneCull::render_camera(RID 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) {
|
||||
#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;
|
||||
}
|
||||
|
||||
RendererSceneRender::CameraData camera_data;
|
||||
|
||||
// Setup Camera(s)
|
||||
@@ -2479,7 +2484,7 @@ void RendererSceneCull::render_camera(RID p_render_buffers, RID p_camera, RID p_
|
||||
} break;
|
||||
}
|
||||
|
||||
camera_data.set_camera(transform, projection, is_orthogonal, vaspect);
|
||||
camera_data.set_camera(transform, projection, is_orthogonal, vaspect, jitter);
|
||||
} else {
|
||||
// Setup our camera for our XR interface.
|
||||
// We can support multiple views here each with their own camera
|
||||
@@ -2501,7 +2506,7 @@ void RendererSceneCull::render_camera(RID p_render_buffers, RID p_camera, RID p_
|
||||
}
|
||||
|
||||
if (view_count == 1) {
|
||||
camera_data.set_camera(transforms[0], projections[0], false, camera->vaspect);
|
||||
camera_data.set_camera(transforms[0], projections[0], false, camera->vaspect, jitter);
|
||||
} else if (view_count == 2) {
|
||||
camera_data.set_multiview_camera(view_count, transforms, projections, false, camera->vaspect);
|
||||
} else {
|
||||
@@ -3216,12 +3221,18 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
|
||||
/* PROCESS GEOMETRY AND DRAW SCENE */
|
||||
|
||||
RID occluders_tex;
|
||||
const RendererSceneRender::CameraData *prev_camera_data = p_camera_data;
|
||||
if (p_viewport.is_valid()) {
|
||||
occluders_tex = RSG::viewport->viewport_get_occluder_debug_texture(p_viewport);
|
||||
prev_camera_data = RSG::viewport->viewport_get_prev_camera_data(p_viewport);
|
||||
}
|
||||
|
||||
RENDER_TIMESTAMP("Render 3D Scene");
|
||||
scene_render->render_scene(p_render_buffers, p_camera_data, scene_cull_result.geometry_instances, scene_cull_result.light_instances, scene_cull_result.reflections, scene_cull_result.voxel_gi_instances, scene_cull_result.decals, scene_cull_result.lightmaps, scene_cull_result.fog_volumes, p_environment, camera_effects, p_shadow_atlas, occluders_tex, p_reflection_probe.is_valid() ? RID() : scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass, p_screen_mesh_lod_threshold, render_shadow_data, max_shadows_used, render_sdfgi_data, cull.sdfgi.region_count, &sdfgi_update_data, r_render_info);
|
||||
scene_render->render_scene(p_render_buffers, p_camera_data, prev_camera_data, scene_cull_result.geometry_instances, scene_cull_result.light_instances, scene_cull_result.reflections, scene_cull_result.voxel_gi_instances, scene_cull_result.decals, scene_cull_result.lightmaps, scene_cull_result.fog_volumes, p_environment, camera_effects, p_shadow_atlas, occluders_tex, p_reflection_probe.is_valid() ? RID() : scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass, p_screen_mesh_lod_threshold, render_shadow_data, max_shadows_used, render_sdfgi_data, cull.sdfgi.region_count, &sdfgi_update_data, r_render_info);
|
||||
|
||||
if (p_viewport.is_valid()) {
|
||||
RSG::viewport->viewport_set_prev_camera_data(p_viewport, p_camera_data);
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < max_shadows_used; i++) {
|
||||
render_shadow_data[i].instances.clear();
|
||||
@@ -3271,7 +3282,7 @@ void RendererSceneCull::render_empty_scene(RID p_render_buffers, RID p_scenario,
|
||||
RendererSceneRender::CameraData camera_data;
|
||||
camera_data.set_camera(Transform3D(), CameraMatrix(), true, false);
|
||||
|
||||
scene_render->render_scene(p_render_buffers, &camera_data, PagedArray<RendererSceneRender::GeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), RID(), RID(), p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr);
|
||||
scene_render->render_scene(p_render_buffers, &camera_data, nullptr, PagedArray<RendererSceneRender::GeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), RID(), RID(), p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -3993,6 +4004,17 @@ 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;
|
||||
@@ -4017,6 +4039,12 @@ RendererSceneCull::RendererSceneCull() {
|
||||
thread_cull_threshold = GLOBAL_GET("rendering/limits/spatial_indexer/threaded_cull_minimum_instances");
|
||||
thread_cull_threshold = MAX(thread_cull_threshold, (uint32_t)RendererThreadPool::singleton->thread_work_pool.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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user