|
@@ -1672,6 +1672,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
RID color_framebuffer;
|
|
RID color_framebuffer;
|
|
RID color_only_framebuffer;
|
|
RID color_only_framebuffer;
|
|
RID depth_framebuffer;
|
|
RID depth_framebuffer;
|
|
|
|
+ RendererRD::MaterialStorage::Samplers samplers;
|
|
|
|
|
|
PassMode depth_pass_mode = PASS_MODE_DEPTH;
|
|
PassMode depth_pass_mode = PASS_MODE_DEPTH;
|
|
uint32_t color_pass_flags = 0;
|
|
uint32_t color_pass_flags = 0;
|
|
@@ -1698,6 +1699,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
}
|
|
}
|
|
|
|
|
|
reverse_cull = true; // for some reason our views are inverted
|
|
reverse_cull = true; // for some reason our views are inverted
|
|
|
|
+ samplers = RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default();
|
|
} else {
|
|
} else {
|
|
screen_size = rb->get_internal_size();
|
|
screen_size = rb->get_internal_size();
|
|
|
|
|
|
@@ -1729,6 +1731,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
|
|
|
color_framebuffer = rb_data->get_color_pass_fb(color_pass_flags);
|
|
color_framebuffer = rb_data->get_color_pass_fb(color_pass_flags);
|
|
color_only_framebuffer = rb_data->get_color_only_fb();
|
|
color_only_framebuffer = rb_data->get_color_only_fb();
|
|
|
|
+ samplers = rb->get_samplers();
|
|
}
|
|
}
|
|
|
|
|
|
p_render_data->scene_data->emissive_exposure_normalization = -1.0;
|
|
p_render_data->scene_data->emissive_exposure_normalization = -1.0;
|
|
@@ -1740,11 +1743,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, false);
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, false);
|
|
|
|
|
|
// May have changed due to the above (light buffer enlarged, as an example).
|
|
// May have changed due to the above (light buffer enlarged, as an example).
|
|
- if (is_reflection_probe) {
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
- } else {
|
|
|
|
- _update_render_base_uniform_set(rb->get_samplers(), BASE_UNIFORM_SET_CACHE_VIEWPORT);
|
|
|
|
- }
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
_fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, using_sdfgi, using_sdfgi || using_voxelgi, using_motion_pass);
|
|
_fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, using_sdfgi, using_sdfgi || using_voxelgi, using_motion_pass);
|
|
render_list[RENDER_LIST_OPAQUE].sort_by_key();
|
|
render_list[RENDER_LIST_OPAQUE].sort_by_key();
|
|
@@ -1928,7 +1927,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
|
|
|
RD::get_singleton()->draw_command_begin_label("Render Depth Pre-Pass");
|
|
RD::get_singleton()->draw_command_begin_label("Render Depth Pre-Pass");
|
|
|
|
|
|
- RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, nullptr, RID());
|
|
|
|
|
|
+ RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, nullptr, RID(), samplers);
|
|
|
|
|
|
bool finish_depth = using_ssao || using_ssil || using_sdfgi || using_voxelgi;
|
|
bool finish_depth = using_ssao || using_ssil || using_sdfgi || using_voxelgi;
|
|
RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, depth_pass_mode, 0, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count);
|
|
RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, depth_pass_mode, 0, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count);
|
|
@@ -1975,17 +1974,13 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
p_render_data->scene_data->opaque_prepass_threshold = 0.0f;
|
|
p_render_data->scene_data->opaque_prepass_threshold = 0.0f;
|
|
|
|
|
|
// Shadow pass can change the base uniform set samplers.
|
|
// Shadow pass can change the base uniform set samplers.
|
|
- if (is_reflection_probe) {
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
- } else {
|
|
|
|
- _update_render_base_uniform_set(rb->get_samplers(), BASE_UNIFORM_SET_CACHE_VIEWPORT);
|
|
|
|
- }
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, true, using_motion_pass);
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, true, using_motion_pass);
|
|
|
|
|
|
RENDER_TIMESTAMP("Render Opaque Pass");
|
|
RENDER_TIMESTAMP("Render Opaque Pass");
|
|
|
|
|
|
- RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, p_render_data, radiance_texture, true);
|
|
|
|
|
|
+ RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, p_render_data, radiance_texture, samplers, true);
|
|
bool can_continue_color = !scene_state.used_screen_texture && !using_ssr && !using_sss;
|
|
bool can_continue_color = !scene_state.used_screen_texture && !using_ssr && !using_sss;
|
|
bool can_continue_depth = !(scene_state.used_depth_texture || scene_state.used_normal_texture) && !using_ssr && !using_sss;
|
|
bool can_continue_depth = !(scene_state.used_depth_texture || scene_state.used_normal_texture) && !using_ssr && !using_sss;
|
|
|
|
|
|
@@ -2032,7 +2027,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
|
|
|
RENDER_TIMESTAMP("Render Motion Pass");
|
|
RENDER_TIMESTAMP("Render Motion Pass");
|
|
|
|
|
|
- rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_MOTION, p_render_data, radiance_texture, true);
|
|
|
|
|
|
+ rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_MOTION, p_render_data, radiance_texture, samplers, true);
|
|
|
|
|
|
RenderListParameters render_list_params(render_list[RENDER_LIST_MOTION].elements.ptr(), render_list[RENDER_LIST_MOTION].element_info.ptr(), render_list[RENDER_LIST_MOTION].elements.size(), reverse_cull, PASS_MODE_COLOR, color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count);
|
|
RenderListParameters render_list_params(render_list[RENDER_LIST_MOTION].elements.ptr(), render_list[RENDER_LIST_MOTION].element_info.ptr(), render_list[RENDER_LIST_MOTION].elements.size(), reverse_cull, PASS_MODE_COLOR, color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count);
|
|
_render_list_with_threads(&render_list_params, color_framebuffer, RD::INITIAL_ACTION_CONTINUE, final_color_action, RD::INITIAL_ACTION_CONTINUE, final_depth_action);
|
|
_render_list_with_threads(&render_list_params, color_framebuffer, RD::INITIAL_ACTION_CONTINUE, final_color_action, RD::INITIAL_ACTION_CONTINUE, final_depth_action);
|
|
@@ -2175,7 +2170,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
|
|
|
RD::get_singleton()->draw_command_begin_label("Render 3D Transparent Pass");
|
|
RD::get_singleton()->draw_command_begin_label("Render 3D Transparent Pass");
|
|
|
|
|
|
- rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_ALPHA, p_render_data, radiance_texture, true);
|
|
|
|
|
|
+ rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_ALPHA, p_render_data, radiance_texture, samplers, true);
|
|
|
|
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, false);
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, false);
|
|
|
|
|
|
@@ -2504,7 +2499,7 @@ void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas
|
|
void RenderForwardClustered::_render_shadow_begin() {
|
|
void RenderForwardClustered::_render_shadow_begin() {
|
|
scene_state.shadow_passes.clear();
|
|
scene_state.shadow_passes.clear();
|
|
RD::get_singleton()->draw_command_begin_label("Shadow Setup");
|
|
RD::get_singleton()->draw_command_begin_label("Shadow Setup");
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
render_list[RENDER_LIST_SECONDARY].clear();
|
|
render_list[RENDER_LIST_SECONDARY].clear();
|
|
scene_state.instance_data[RENDER_LIST_SECONDARY].clear();
|
|
scene_state.instance_data[RENDER_LIST_SECONDARY].clear();
|
|
@@ -2587,7 +2582,7 @@ void RenderForwardClustered::_render_shadow_process() {
|
|
for (uint32_t i = 0; i < scene_state.shadow_passes.size(); i++) {
|
|
for (uint32_t i = 0; i < scene_state.shadow_passes.size(); i++) {
|
|
//render passes need to be configured after instance buffer is done, since they need the latest version
|
|
//render passes need to be configured after instance buffer is done, since they need the latest version
|
|
SceneState::ShadowPass &shadow_pass = scene_state.shadow_passes[i];
|
|
SceneState::ShadowPass &shadow_pass = scene_state.shadow_passes[i];
|
|
- shadow_pass.rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID(), false, i);
|
|
|
|
|
|
+ shadow_pass.rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID(), RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), false, i);
|
|
}
|
|
}
|
|
|
|
|
|
RD::get_singleton()->draw_command_end_label();
|
|
RD::get_singleton()->draw_command_end_label();
|
|
@@ -2628,7 +2623,7 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con
|
|
render_data.cluster_max_elements = 32;
|
|
render_data.cluster_max_elements = 32;
|
|
render_data.instances = &p_instances;
|
|
render_data.instances = &p_instances;
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false, false);
|
|
_setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false, false);
|
|
|
|
|
|
@@ -2638,7 +2633,7 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con
|
|
render_list[RENDER_LIST_SECONDARY].sort_by_key();
|
|
render_list[RENDER_LIST_SECONDARY].sort_by_key();
|
|
_fill_instance_data(RENDER_LIST_SECONDARY);
|
|
_fill_instance_data(RENDER_LIST_SECONDARY);
|
|
|
|
|
|
- RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID());
|
|
|
|
|
|
+ RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID(), RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
|
|
|
RENDER_TIMESTAMP("Render Collider Heightfield");
|
|
RENDER_TIMESTAMP("Render Collider Heightfield");
|
|
|
|
|
|
@@ -2674,7 +2669,7 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform
|
|
|
|
|
|
scene_shader.enable_advanced_shader_group();
|
|
scene_shader.enable_advanced_shader_group();
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|
|
|
@@ -2683,7 +2678,7 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform
|
|
render_list[RENDER_LIST_SECONDARY].sort_by_key();
|
|
render_list[RENDER_LIST_SECONDARY].sort_by_key();
|
|
_fill_instance_data(RENDER_LIST_SECONDARY);
|
|
_fill_instance_data(RENDER_LIST_SECONDARY);
|
|
|
|
|
|
- RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID());
|
|
|
|
|
|
+ RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID(), RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
|
|
|
RENDER_TIMESTAMP("Render 3D Material");
|
|
RENDER_TIMESTAMP("Render 3D Material");
|
|
|
|
|
|
@@ -2725,7 +2720,7 @@ void RenderForwardClustered::_render_uv2(const PagedArray<RenderGeometryInstance
|
|
|
|
|
|
scene_shader.enable_advanced_shader_group();
|
|
scene_shader.enable_advanced_shader_group();
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|
|
|
@@ -2734,7 +2729,7 @@ void RenderForwardClustered::_render_uv2(const PagedArray<RenderGeometryInstance
|
|
render_list[RENDER_LIST_SECONDARY].sort_by_key();
|
|
render_list[RENDER_LIST_SECONDARY].sort_by_key();
|
|
_fill_instance_data(RENDER_LIST_SECONDARY);
|
|
_fill_instance_data(RENDER_LIST_SECONDARY);
|
|
|
|
|
|
- RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID());
|
|
|
|
|
|
+ RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_SECONDARY, nullptr, RID(), RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
|
|
|
RENDER_TIMESTAMP("Render 3D Material");
|
|
RENDER_TIMESTAMP("Render 3D Material");
|
|
|
|
|
|
@@ -2794,7 +2789,7 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu
|
|
render_data.cluster_max_elements = 32;
|
|
render_data.cluster_max_elements = 32;
|
|
render_data.instances = &p_instances;
|
|
render_data.instances = &p_instances;
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
+ _update_render_base_uniform_set();
|
|
|
|
|
|
PassMode pass_mode = PASS_MODE_SDF;
|
|
PassMode pass_mode = PASS_MODE_SDF;
|
|
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
|
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
|
@@ -2852,7 +2847,7 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu
|
|
scene_data.emissive_exposure_normalization = p_exposure_normalization;
|
|
scene_data.emissive_exposure_normalization = p_exposure_normalization;
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|
|
|
- RID rp_uniform_set = _setup_sdfgi_render_pass_uniform_set(p_albedo_texture, p_emission_texture, p_emission_aniso_texture, p_geom_facing_texture);
|
|
|
|
|
|
+ RID rp_uniform_set = _setup_sdfgi_render_pass_uniform_set(p_albedo_texture, p_emission_texture, p_emission_aniso_texture, p_geom_facing_texture, RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
|
|
|
HashMap<Size2i, RID>::Iterator E = sdfgi_framebuffer_size_cache.find(fb_size);
|
|
HashMap<Size2i, RID>::Iterator E = sdfgi_framebuffer_size_cache.find(fb_size);
|
|
if (!E) {
|
|
if (!E) {
|
|
@@ -2868,23 +2863,21 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu
|
|
}
|
|
}
|
|
|
|
|
|
void RenderForwardClustered::base_uniforms_changed() {
|
|
void RenderForwardClustered::base_uniforms_changed() {
|
|
- for (int i = 0; i < BASE_UNIFORM_SET_CACHE_MAX; i++) {
|
|
|
|
- if (!render_base_uniform_set_cache[i].is_null() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set_cache[i])) {
|
|
|
|
- RD::get_singleton()->free(render_base_uniform_set_cache[i]);
|
|
|
|
- }
|
|
|
|
- render_base_uniform_set_cache[i] = RID();
|
|
|
|
|
|
+ if (!render_base_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) {
|
|
|
|
+ RD::get_singleton()->free(render_base_uniform_set);
|
|
}
|
|
}
|
|
|
|
+ render_base_uniform_set = RID();
|
|
}
|
|
}
|
|
|
|
|
|
-void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::MaterialStorage::Samplers &p_samplers, BaseUniformSetCache p_cache_index) {
|
|
|
|
|
|
+void RenderForwardClustered::_update_render_base_uniform_set() {
|
|
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
|
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
|
|
|
|
|
- if (render_base_uniform_set_cache[p_cache_index].is_null() || !RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set_cache[p_cache_index]) || (lightmap_texture_array_version_cache[p_cache_index] != light_storage->lightmap_array_get_version())) {
|
|
|
|
- if (render_base_uniform_set_cache[p_cache_index].is_valid() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set_cache[p_cache_index])) {
|
|
|
|
- RD::get_singleton()->free(render_base_uniform_set_cache[p_cache_index]);
|
|
|
|
|
|
+ if (render_base_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set) || (lightmap_texture_array_version != light_storage->lightmap_array_get_version())) {
|
|
|
|
+ if (render_base_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) {
|
|
|
|
+ RD::get_singleton()->free(render_base_uniform_set);
|
|
}
|
|
}
|
|
|
|
|
|
- lightmap_texture_array_version_cache[p_cache_index] = light_storage->lightmap_array_get_version();
|
|
|
|
|
|
+ lightmap_texture_array_version = light_storage->lightmap_array_get_version();
|
|
|
|
|
|
Vector<RD::Uniform> uniforms;
|
|
Vector<RD::Uniform> uniforms;
|
|
|
|
|
|
@@ -2899,73 +2892,13 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.binding = 3;
|
|
u.binding = 3;
|
|
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
|
|
|
|
- RID sampler;
|
|
|
|
- switch (decals_get_filter()) {
|
|
|
|
- case RS::DECAL_FILTER_NEAREST: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::DECAL_FILTER_LINEAR: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::DECAL_FILTER_NEAREST_MIPMAPS: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::DECAL_FILTER_LINEAR_MIPMAPS: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::DECAL_FILTER_NEAREST_MIPMAPS_ANISOTROPIC: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::DECAL_FILTER_LINEAR_MIPMAPS_ANISOTROPIC: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- u.append_id(sampler);
|
|
|
|
- uniforms.push_back(u);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- {
|
|
|
|
- RD::Uniform u;
|
|
|
|
- u.binding = 4;
|
|
|
|
- u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
|
|
|
|
- RID sampler;
|
|
|
|
- switch (light_projectors_get_filter()) {
|
|
|
|
- case RS::LIGHT_PROJECTOR_FILTER_NEAREST: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::LIGHT_PROJECTOR_FILTER_LINEAR: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::LIGHT_PROJECTOR_FILTER_NEAREST_MIPMAPS: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::LIGHT_PROJECTOR_FILTER_NEAREST_MIPMAPS_ANISOTROPIC: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- case RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS_ANISOTROPIC: {
|
|
|
|
- sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
- } break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- u.append_id(sampler);
|
|
|
|
- uniforms.push_back(u);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- {
|
|
|
|
- RD::Uniform u;
|
|
|
|
- u.binding = 5;
|
|
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_omni_light_buffer());
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_omni_light_buffer());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 6;
|
|
|
|
|
|
+ u.binding = 4;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_spot_light_buffer());
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_spot_light_buffer());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
@@ -2973,35 +2906,35 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
|
|
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 7;
|
|
|
|
|
|
+ u.binding = 5;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_reflection_probe_buffer());
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_reflection_probe_buffer());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 8;
|
|
|
|
|
|
+ u.binding = 6;
|
|
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_directional_light_buffer());
|
|
u.append_id(RendererRD::LightStorage::get_singleton()->get_directional_light_buffer());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 9;
|
|
|
|
|
|
+ u.binding = 7;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.append_id(scene_state.lightmap_buffer);
|
|
u.append_id(scene_state.lightmap_buffer);
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 10;
|
|
|
|
|
|
+ u.binding = 8;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.append_id(scene_state.lightmap_capture_buffer);
|
|
u.append_id(scene_state.lightmap_capture_buffer);
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 11;
|
|
|
|
|
|
+ u.binding = 9;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID decal_atlas = RendererRD::TextureStorage::get_singleton()->decal_atlas_get_texture();
|
|
RID decal_atlas = RendererRD::TextureStorage::get_singleton()->decal_atlas_get_texture();
|
|
u.append_id(decal_atlas);
|
|
u.append_id(decal_atlas);
|
|
@@ -3009,7 +2942,7 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 12;
|
|
|
|
|
|
+ u.binding = 10;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID decal_atlas = RendererRD::TextureStorage::get_singleton()->decal_atlas_get_texture_srgb();
|
|
RID decal_atlas = RendererRD::TextureStorage::get_singleton()->decal_atlas_get_texture_srgb();
|
|
u.append_id(decal_atlas);
|
|
u.append_id(decal_atlas);
|
|
@@ -3017,7 +2950,7 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 13;
|
|
|
|
|
|
+ u.binding = 11;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.append_id(RendererRD::TextureStorage::get_singleton()->get_decal_buffer());
|
|
u.append_id(RendererRD::TextureStorage::get_singleton()->get_decal_buffer());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
@@ -3026,7 +2959,7 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
|
- u.binding = 14;
|
|
|
|
|
|
+ u.binding = 12;
|
|
u.append_id(RendererRD::MaterialStorage::get_singleton()->global_shader_uniforms_get_storage_buffer());
|
|
u.append_id(RendererRD::MaterialStorage::get_singleton()->global_shader_uniforms_get_storage_buffer());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
@@ -3034,19 +2967,18 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
- u.binding = 15;
|
|
|
|
|
|
+ u.binding = 13;
|
|
u.append_id(sdfgi_get_ubo());
|
|
u.append_id(sdfgi_get_ubo());
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
|
|
|
|
- uniforms.append_array(p_samplers.get_uniforms(SAMPLERS_BINDING_FIRST_INDEX));
|
|
|
|
|
|
+ uniforms.append_array(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default().get_uniforms(14));
|
|
|
|
|
|
- render_base_uniform_set_cache[p_cache_index] = RD::get_singleton()->uniform_set_create(uniforms, scene_shader.default_shader_rd, SCENE_UNIFORM_SET);
|
|
|
|
|
|
+ render_base_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, scene_shader.default_shader_rd, SCENE_UNIFORM_SET);
|
|
}
|
|
}
|
|
- render_base_uniform_set = render_base_uniform_set_cache[p_cache_index];
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_render_list, const RenderDataRD *p_render_data, RID p_radiance_texture, bool p_use_directional_shadow_atlas, int p_index) {
|
|
|
|
|
|
+RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_render_list, const RenderDataRD *p_render_data, RID p_radiance_texture, const RendererRD::MaterialStorage::Samplers &p_samplers, bool p_use_directional_shadow_atlas, int p_index) {
|
|
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
|
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
|
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
|
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
|
|
|
|
|
@@ -3194,6 +3126,68 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.binding = 10;
|
|
u.binding = 10;
|
|
|
|
+ u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
|
|
|
|
+ RID sampler;
|
|
|
|
+ switch (decals_get_filter()) {
|
|
|
|
+ case RS::DECAL_FILTER_NEAREST: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_LINEAR: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_NEAREST_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_LINEAR_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_NEAREST_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_LINEAR_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ u.append_id(sampler);
|
|
|
|
+ uniforms.push_back(u);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ RD::Uniform u;
|
|
|
|
+ u.binding = 11;
|
|
|
|
+ u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
|
|
|
|
+ RID sampler;
|
|
|
|
+ switch (light_projectors_get_filter()) {
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_NEAREST: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_LINEAR: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_NEAREST_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_NEAREST_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ u.append_id(sampler);
|
|
|
|
+ uniforms.push_back(u);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uniforms.append_array(p_samplers.get_uniforms(12));
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ RD::Uniform u;
|
|
|
|
+ u.binding = 24;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID texture;
|
|
RID texture;
|
|
if (rb.is_valid() && rb->has_texture(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH)) {
|
|
if (rb.is_valid() && rb->has_texture(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH)) {
|
|
@@ -3206,7 +3200,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 11;
|
|
|
|
|
|
+ u.binding = 25;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID bbt = rb_data.is_valid() ? rb->get_back_buffer_texture() : RID();
|
|
RID bbt = rb_data.is_valid() ? rb->get_back_buffer_texture() : RID();
|
|
RID texture = bbt.is_valid() ? bbt : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
RID texture = bbt.is_valid() ? bbt : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
@@ -3216,7 +3210,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
|
|
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 12;
|
|
|
|
|
|
+ u.binding = 26;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID texture = rb_data.is_valid() && rb_data->has_normal_roughness() ? rb_data->get_normal_roughness() : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_NORMAL : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_NORMAL);
|
|
RID texture = rb_data.is_valid() && rb_data->has_normal_roughness() ? rb_data->get_normal_roughness() : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_NORMAL : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_NORMAL);
|
|
u.append_id(texture);
|
|
u.append_id(texture);
|
|
@@ -3225,7 +3219,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
|
|
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 13;
|
|
|
|
|
|
+ u.binding = 27;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID aot = rb.is_valid() && rb->has_texture(RB_SCOPE_SSAO, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSAO, RB_FINAL) : RID();
|
|
RID aot = rb.is_valid() && rb->has_texture(RB_SCOPE_SSAO, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSAO, RB_FINAL) : RID();
|
|
RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
@@ -3235,7 +3229,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
|
|
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 14;
|
|
|
|
|
|
+ u.binding = 28;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
u.append_id(texture);
|
|
u.append_id(texture);
|
|
@@ -3244,7 +3238,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
|
|
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 15;
|
|
|
|
|
|
+ u.binding = 29;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
u.append_id(texture);
|
|
u.append_id(texture);
|
|
@@ -3252,7 +3246,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 16;
|
|
|
|
|
|
+ u.binding = 30;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID t;
|
|
RID t;
|
|
if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) {
|
|
if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) {
|
|
@@ -3267,7 +3261,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 17;
|
|
|
|
|
|
+ u.binding = 31;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID t;
|
|
RID t;
|
|
if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) {
|
|
if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) {
|
|
@@ -3282,7 +3276,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 18;
|
|
|
|
|
|
+ u.binding = 32;
|
|
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
RID voxel_gi;
|
|
RID voxel_gi;
|
|
if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_GI)) {
|
|
if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_GI)) {
|
|
@@ -3294,7 +3288,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 19;
|
|
|
|
|
|
+ u.binding = 33;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID vfog;
|
|
RID vfog;
|
|
if (rb_data.is_valid() && rb->has_custom_data(RB_SCOPE_FOG)) {
|
|
if (rb_data.is_valid() && rb->has_custom_data(RB_SCOPE_FOG)) {
|
|
@@ -3311,7 +3305,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
- u.binding = 20;
|
|
|
|
|
|
+ u.binding = 34;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
RID ssil = rb.is_valid() && rb->has_texture(RB_SCOPE_SSIL, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSIL, RB_FINAL) : RID();
|
|
RID ssil = rb.is_valid() && rb->has_texture(RB_SCOPE_SSIL, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSIL, RB_FINAL) : RID();
|
|
RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(is_multiview ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
|
@@ -3322,7 +3316,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
|
|
return UniformSetCacheRD::get_singleton()->get_cache_vec(scene_shader.default_shader_rd, RENDER_PASS_UNIFORM_SET, uniforms);
|
|
return UniformSetCacheRD::get_singleton()->get_cache_vec(scene_shader.default_shader_rd, RENDER_PASS_UNIFORM_SET, uniforms);
|
|
}
|
|
}
|
|
|
|
|
|
-RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_texture, RID p_emission_texture, RID p_emission_aniso_texture, RID p_geom_facing_texture) {
|
|
|
|
|
|
+RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_texture, RID p_emission_texture, RID p_emission_aniso_texture, RID p_geom_facing_texture, const RendererRD::MaterialStorage::Samplers &p_samplers) {
|
|
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
|
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
|
Vector<RD::Uniform> uniforms;
|
|
Vector<RD::Uniform> uniforms;
|
|
|
|
|
|
@@ -3428,33 +3422,95 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ {
|
|
|
|
+ RD::Uniform u;
|
|
|
|
+ u.binding = 10;
|
|
|
|
+ u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
|
|
|
|
+ RID sampler;
|
|
|
|
+ switch (decals_get_filter()) {
|
|
|
|
+ case RS::DECAL_FILTER_NEAREST: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_LINEAR: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_NEAREST_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_LINEAR_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_NEAREST_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::DECAL_FILTER_LINEAR_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ u.append_id(sampler);
|
|
|
|
+ uniforms.push_back(u);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ RD::Uniform u;
|
|
|
|
+ u.binding = 11;
|
|
|
|
+ u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
|
|
|
|
+ RID sampler;
|
|
|
|
+ switch (light_projectors_get_filter()) {
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_NEAREST: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_LINEAR: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_NEAREST_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_NEAREST_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ case RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS_ANISOTROPIC: {
|
|
|
|
+ sampler = p_samplers.get_sampler(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
|
+ } break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ u.append_id(sampler);
|
|
|
|
+ uniforms.push_back(u);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uniforms.append_array(p_samplers.get_uniforms(12));
|
|
|
|
+
|
|
// actual sdfgi stuff
|
|
// actual sdfgi stuff
|
|
|
|
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
- u.binding = 10;
|
|
|
|
|
|
+ u.binding = 24;
|
|
u.append_id(p_albedo_texture);
|
|
u.append_id(p_albedo_texture);
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
- u.binding = 11;
|
|
|
|
|
|
+ u.binding = 25;
|
|
u.append_id(p_emission_texture);
|
|
u.append_id(p_emission_texture);
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
- u.binding = 12;
|
|
|
|
|
|
+ u.binding = 26;
|
|
u.append_id(p_emission_aniso_texture);
|
|
u.append_id(p_emission_aniso_texture);
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
{
|
|
{
|
|
RD::Uniform u;
|
|
RD::Uniform u;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
- u.binding = 13;
|
|
|
|
|
|
+ u.binding = 27;
|
|
u.append_id(p_geom_facing_texture);
|
|
u.append_id(p_geom_facing_texture);
|
|
uniforms.push_back(u);
|
|
uniforms.push_back(u);
|
|
}
|
|
}
|
|
@@ -4148,7 +4204,6 @@ RenderForwardClustered::RenderForwardClustered() {
|
|
}
|
|
}
|
|
{
|
|
{
|
|
defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n";
|
|
defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n";
|
|
- defines += "\n#define SAMPLERS_BINDING_FIRST_INDEX " + itos(SAMPLERS_BINDING_FIRST_INDEX) + "\n";
|
|
|
|
}
|
|
}
|
|
#ifdef REAL_T_IS_DOUBLE
|
|
#ifdef REAL_T_IS_DOUBLE
|
|
{
|
|
{
|