|
@@ -334,6 +334,10 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
|
|
|
const GeometryInstanceSurfaceDataCache *surf = p_params->elements[i];
|
|
|
const RenderElementInfo &element_info = p_params->element_info[i];
|
|
|
|
|
|
+ if ((p_pass_mode == PASS_MODE_COLOR || p_pass_mode == PASS_MODE_COLOR_SPECULAR) && !(surf->flags & GeometryInstanceSurfaceDataCache::FLAG_PASS_OPAQUE)) {
|
|
|
+ continue; // Objects with "Depth-prepass" transparency are included in both render lists, but should only be rendered in the transparent pass
|
|
|
+ }
|
|
|
+
|
|
|
if (surf->owner->instance_count == 0) {
|
|
|
continue;
|
|
|
}
|
|
@@ -958,20 +962,20 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
|
|
|
bool uses_gi = false;
|
|
|
float fade_alpha = 1.0;
|
|
|
|
|
|
- if (p_render_list == RENDER_LIST_OPAQUE) {
|
|
|
- if (inst->fade_near || inst->fade_far) {
|
|
|
- float fade_dist = inst->transform.origin.distance_to(p_render_data->cam_transform.origin);
|
|
|
- if (inst->fade_far && fade_dist > inst->fade_far_begin) {
|
|
|
- fade_alpha = MAX(0.0, 1.0 - (fade_dist - inst->fade_far_begin) / (inst->fade_far_end - inst->fade_far_begin));
|
|
|
- } else if (inst->fade_near && fade_dist < inst->fade_near_end) {
|
|
|
- fade_alpha = MAX(0.0, (fade_dist - inst->fade_near_begin) / (inst->fade_near_end - inst->fade_near_begin));
|
|
|
- }
|
|
|
+ if (inst->fade_near || inst->fade_far) {
|
|
|
+ float fade_dist = inst->transform.origin.distance_to(p_render_data->cam_transform.origin);
|
|
|
+ if (inst->fade_far && fade_dist > inst->fade_far_begin) {
|
|
|
+ fade_alpha = MAX(0.0, 1.0 - (fade_dist - inst->fade_far_begin) / (inst->fade_far_end - inst->fade_far_begin));
|
|
|
+ } else if (inst->fade_near && fade_dist < inst->fade_near_end) {
|
|
|
+ fade_alpha = MAX(0.0, (fade_dist - inst->fade_near_begin) / (inst->fade_near_end - inst->fade_near_begin));
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- fade_alpha *= inst->force_alpha * inst->parent_fade_alpha;
|
|
|
+ fade_alpha *= inst->force_alpha * inst->parent_fade_alpha;
|
|
|
|
|
|
- flags = (flags & ~INSTANCE_DATA_FLAGS_FADE_MASK) | (uint32_t(fade_alpha * 255.0) << INSTANCE_DATA_FLAGS_FADE_SHIFT);
|
|
|
+ flags = (flags & ~INSTANCE_DATA_FLAGS_FADE_MASK) | (uint32_t(fade_alpha * 255.0) << INSTANCE_DATA_FLAGS_FADE_SHIFT);
|
|
|
|
|
|
+ if (p_render_list == RENDER_LIST_OPAQUE) {
|
|
|
// Setup GI
|
|
|
if (inst->lightmap_instance.is_valid()) {
|
|
|
int32_t lightmap_cull_index = -1;
|
|
@@ -1206,6 +1210,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
scene_state.ubo.viewport_size[0] = vp_he.x;
|
|
|
scene_state.ubo.viewport_size[1] = vp_he.y;
|
|
|
scene_state.ubo.directional_light_count = 0;
|
|
|
+ scene_state.ubo.opaque_prepass_threshold = 0.99f;
|
|
|
|
|
|
Size2i screen_size;
|
|
|
RID opaque_framebuffer;
|
|
@@ -1449,6 +1454,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
RD::get_singleton()->draw_command_begin_label("Render Opaque Pass");
|
|
|
|
|
|
scene_state.ubo.directional_light_count = p_render_data->directional_light_count;
|
|
|
+ scene_state.ubo.opaque_prepass_threshold = 0.0f;
|
|
|
|
|
|
_setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, p_render_data->render_buffers.is_valid());
|
|
|
|
|
@@ -1632,6 +1638,7 @@ void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const Page
|
|
|
render_data.render_info = p_render_info;
|
|
|
|
|
|
scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1;
|
|
|
+ scene_state.ubo.opaque_prepass_threshold = 0.1f;
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), !p_flip_y, Color(), false, p_use_pancake, shadow_pass_index);
|
|
|
|
|
@@ -1718,6 +1725,7 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con
|
|
|
|
|
|
_update_render_base_uniform_set();
|
|
|
scene_state.ubo.dual_paraboloid_side = 0;
|
|
|
+ scene_state.ubo.opaque_prepass_threshold = 0.0;
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false);
|
|
|
|
|
@@ -1755,6 +1763,7 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform
|
|
|
|
|
|
scene_state.ubo.dual_paraboloid_side = 0;
|
|
|
scene_state.ubo.material_uv2_mode = false;
|
|
|
+ scene_state.ubo.opaque_prepass_threshold = 0.0f;
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|
|
@@ -1798,6 +1807,7 @@ void RenderForwardClustered::_render_uv2(const PagedArray<GeometryInstance *> &p
|
|
|
|
|
|
scene_state.ubo.dual_paraboloid_side = 0;
|
|
|
scene_state.ubo.material_uv2_mode = true;
|
|
|
+ scene_state.ubo.opaque_prepass_threshold = 0.0;
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|