Merge pull request #114194 from blueskythlikesclouds/consistent-screen-and-viewport-sizes
Pass consistent viewport and screen sizes to fix point size emulation.
This commit is contained in:
@@ -686,7 +686,7 @@ void RenderForwardClustered::_render_list_with_draw_list(RenderListParameters *p
|
||||
RD::get_singleton()->draw_list_end();
|
||||
}
|
||||
|
||||
void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_apply_alpha_multiplier, bool p_pancake_shadows, int p_index) {
|
||||
void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Size2 &p_viewport_size, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_apply_alpha_multiplier, bool p_pancake_shadows, int p_index) {
|
||||
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
||||
|
||||
Ref<RenderSceneBuffersRD> rd = p_render_data->render_buffers;
|
||||
@@ -704,7 +704,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
|
||||
|
||||
float luminance_multiplier = rd.is_valid() ? rd->get_luminance_multiplier() : 1.0;
|
||||
|
||||
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_default_bg_color, luminance_multiplier, p_opaque_render_buffers, p_apply_alpha_multiplier);
|
||||
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_viewport_size, p_default_bg_color, luminance_multiplier, p_opaque_render_buffers, p_apply_alpha_multiplier);
|
||||
|
||||
// now do implementation UBO
|
||||
|
||||
@@ -1873,7 +1873,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
||||
|
||||
_setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->scene_data->cam_transform);
|
||||
_setup_voxelgis(*p_render_data->voxel_gi_instances);
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, p_default_bg_color, false);
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, screen_size, p_default_bg_color, false);
|
||||
|
||||
// May have changed due to the above (light buffer enlarged, as an example).
|
||||
_update_render_base_uniform_set();
|
||||
@@ -2159,7 +2159,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
||||
// Shadow pass can change the base uniform set samplers.
|
||||
_update_render_base_uniform_set();
|
||||
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, p_default_bg_color, true, using_motion_pass);
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, screen_size, p_default_bg_color, true, using_motion_pass);
|
||||
|
||||
RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, p_render_data, radiance_texture, samplers, true);
|
||||
|
||||
@@ -2378,7 +2378,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
||||
|
||||
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, p_default_bg_color, false);
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, screen_size, p_default_bg_color, false);
|
||||
|
||||
{
|
||||
uint32_t transparent_color_pass_flags = (color_pass_flags | uint32_t(COLOR_PASS_FLAG_TRANSPARENT)) & ~uint32_t(COLOR_PASS_FLAG_SEPARATE_SPECULAR);
|
||||
@@ -2780,7 +2780,12 @@ void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const Page
|
||||
render_data.instances = &p_instances;
|
||||
render_data.render_info = p_render_info;
|
||||
|
||||
_setup_environment(&render_data, true, p_viewport_size, Color(), false, false, p_use_pancake, shadow_pass_index);
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_framebuffer);
|
||||
Size2i viewport_size = p_rect.size;
|
||||
if (viewport_size == Size2()) {
|
||||
viewport_size = screen_size;
|
||||
}
|
||||
_setup_environment(&render_data, true, screen_size, viewport_size, Color(), false, false, p_use_pancake, shadow_pass_index);
|
||||
|
||||
if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) {
|
||||
scene_data.screen_mesh_lod_threshold = 0.0;
|
||||
@@ -2878,7 +2883,8 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con
|
||||
|
||||
_update_render_base_uniform_set();
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color(), false, false, false);
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_fb);
|
||||
_setup_environment(&render_data, true, screen_size, screen_size, Color(), false, false, false);
|
||||
|
||||
PassMode pass_mode = PASS_MODE_SHADOW;
|
||||
|
||||
@@ -2925,7 +2931,12 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform
|
||||
|
||||
_update_render_base_uniform_set();
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color());
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_framebuffer);
|
||||
Size2i viewport_size = p_region.size;
|
||||
if (viewport_size == Size2()) {
|
||||
viewport_size = screen_size;
|
||||
}
|
||||
_setup_environment(&render_data, true, screen_size, viewport_size, Color());
|
||||
|
||||
PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL;
|
||||
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
||||
@@ -2976,7 +2987,12 @@ void RenderForwardClustered::_render_uv2(const PagedArray<RenderGeometryInstance
|
||||
|
||||
_update_render_base_uniform_set();
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color());
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_framebuffer);
|
||||
Size2i viewport_size = p_region.size;
|
||||
if (viewport_size == Size2()) {
|
||||
viewport_size = screen_size;
|
||||
}
|
||||
_setup_environment(&render_data, true, screen_size, viewport_size, Color());
|
||||
|
||||
PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL;
|
||||
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
||||
@@ -3095,7 +3111,7 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu
|
||||
RendererRD::MaterialStorage::store_transform(to_bounds.affine_inverse() * scene_data.cam_transform, scene_state.ubo.sdf_to_bounds);
|
||||
|
||||
scene_data.emissive_exposure_normalization = p_exposure_normalization;
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color());
|
||||
_setup_environment(&render_data, true, fb_size, fb_size, 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, RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
||||
|
||||
|
||||
@@ -438,7 +438,7 @@ private:
|
||||
|
||||
static RenderForwardClustered *singleton;
|
||||
|
||||
void _setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Color &p_default_bg_color, bool p_opaque_render_buffers = false, bool p_apply_alpha_multiplier = false, bool p_pancake_shadows = false, int p_index = 0);
|
||||
void _setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Size2 &p_viewport_size, const Color &p_default_bg_color, bool p_opaque_render_buffers = false, bool p_apply_alpha_multiplier = false, bool p_pancake_shadows = false, int p_index = 0);
|
||||
void _setup_voxelgis(const PagedArray<RID> &p_voxelgis);
|
||||
void _setup_lightmaps(const RenderDataRD *p_render_data, const PagedArray<RID> &p_lightmaps, const Transform3D &p_cam_transform);
|
||||
|
||||
|
||||
@@ -1013,7 +1013,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
||||
|
||||
RD::get_singleton()->draw_command_begin_label("Render Setup");
|
||||
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, p_default_bg_color, false);
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, screen_size, p_default_bg_color, false);
|
||||
|
||||
// May have changed due to the above (light buffer enlarged, as an example).
|
||||
_update_render_base_uniform_set();
|
||||
@@ -1185,7 +1185,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
||||
// Shadow pass can change the base uniform set samplers.
|
||||
_update_render_base_uniform_set();
|
||||
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, p_default_bg_color, p_render_data->render_buffers.is_valid());
|
||||
_setup_environment(p_render_data, is_reflection_probe, screen_size, screen_size, p_default_bg_color, p_render_data->render_buffers.is_valid());
|
||||
|
||||
if (merge_transparent_pass && using_subpass_post_process) {
|
||||
RENDER_TIMESTAMP("Render Opaque + Transparent + Tonemap");
|
||||
@@ -1325,7 +1325,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
||||
rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_ALPHA, p_render_data, radiance_texture, samplers, true);
|
||||
|
||||
// this may be needed if we re-introduced steps that change info, not sure which do so in the previous implementation
|
||||
//_setup_environment(p_render_data, is_reflection_probe, screen_size, p_default_bg_color, false);
|
||||
//_setup_environment(p_render_data, is_reflection_probe, screen_size, screen_size, p_default_bg_color, false);
|
||||
|
||||
RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, base_specialization, 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_params.framebuffer_format = fb_format;
|
||||
@@ -1576,7 +1576,12 @@ void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedAr
|
||||
render_data.instances = &p_instances;
|
||||
render_data.render_info = p_render_info;
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color(), false, p_use_pancake);
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_framebuffer);
|
||||
Size2i viewport_size = p_rect.size;
|
||||
if (viewport_size == Size2()) {
|
||||
viewport_size = screen_size;
|
||||
}
|
||||
_setup_environment(&render_data, true, screen_size, viewport_size, Color(), false, p_use_pancake);
|
||||
|
||||
if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) {
|
||||
scene_data.screen_mesh_lod_threshold = 0.0;
|
||||
@@ -1669,7 +1674,12 @@ void RenderForwardMobile::_render_material(const Transform3D &p_cam_transform, c
|
||||
render_data.scene_data = &scene_data;
|
||||
render_data.instances = &p_instances;
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color());
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_framebuffer);
|
||||
Size2i viewport_size = p_region.size;
|
||||
if (viewport_size == Size2()) {
|
||||
viewport_size = screen_size;
|
||||
}
|
||||
_setup_environment(&render_data, true, screen_size, viewport_size, Color());
|
||||
|
||||
PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL;
|
||||
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
||||
@@ -1714,7 +1724,12 @@ void RenderForwardMobile::_render_uv2(const PagedArray<RenderGeometryInstance *>
|
||||
render_data.scene_data = &scene_data;
|
||||
render_data.instances = &p_instances;
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color());
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_framebuffer);
|
||||
Size2i viewport_size = p_region.size;
|
||||
if (viewport_size == Size2()) {
|
||||
viewport_size = screen_size;
|
||||
}
|
||||
_setup_environment(&render_data, true, screen_size, viewport_size, Color());
|
||||
|
||||
PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL;
|
||||
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
||||
@@ -1796,7 +1811,8 @@ void RenderForwardMobile::_render_particle_collider_heightfield(RID p_fb, const
|
||||
render_data.scene_data = &scene_data;
|
||||
render_data.instances = &p_instances;
|
||||
|
||||
_setup_environment(&render_data, true, Vector2(1, 1), Color(), false, false);
|
||||
Size2i screen_size = RD::get_singleton()->framebuffer_get_size(p_fb);
|
||||
_setup_environment(&render_data, true, screen_size, screen_size, Color(), false, false);
|
||||
|
||||
PassMode pass_mode = PASS_MODE_SHADOW;
|
||||
|
||||
@@ -2233,7 +2249,7 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const
|
||||
}
|
||||
}
|
||||
|
||||
void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_pancake_shadows) {
|
||||
void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Size2 &p_viewport_size, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_pancake_shadows) {
|
||||
RID env = is_environment(p_render_data->environment) ? p_render_data->environment : RID();
|
||||
RID reflection_probe_instance = p_render_data->reflection_probe.is_valid() ? RendererRD::LightStorage::get_singleton()->reflection_probe_instance_get_probe(p_render_data->reflection_probe) : RID();
|
||||
|
||||
@@ -2246,7 +2262,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
|
||||
|
||||
// Start a new setup.
|
||||
scene_state.uniform_buffers.prepare_for_upload();
|
||||
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers.get_for_upload(0u), get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_default_bg_color, luminance_multiplier, p_opaque_render_buffers, false);
|
||||
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers.get_for_upload(0u), get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_viewport_size, p_default_bg_color, luminance_multiplier, p_opaque_render_buffers, false);
|
||||
}
|
||||
|
||||
/// RENDERING ///
|
||||
|
||||
@@ -172,7 +172,7 @@ private:
|
||||
void _fill_instance_data(RenderListType p_render_list, uint32_t p_offset = 0, int32_t p_max_elements = -1, bool p_update_buffer = true);
|
||||
void _fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, bool p_append = false);
|
||||
|
||||
void _setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Color &p_default_bg_color, bool p_opaque_render_buffers = false, bool p_pancake_shadows = false);
|
||||
void _setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, const Size2 &p_viewport_size, const Color &p_default_bg_color, bool p_opaque_render_buffers = false, bool p_pancake_shadows = false);
|
||||
void _setup_lightmaps(const RenderDataRD *p_render_data, const PagedArray<RID> &p_lightmaps, const Transform3D &p_cam_transform);
|
||||
|
||||
RID render_base_uniform_set;
|
||||
|
||||
@@ -709,7 +709,7 @@ void vertex_shader(vec3 vertex_input,
|
||||
vec2(1, 1));
|
||||
|
||||
vec2 point_coord = point_coords[gl_VertexIndex % 6];
|
||||
gl_Position.xy += (point_coord * 2.0 - 1.0) * point_size * scene_data.screen_pixel_size * gl_Position.w;
|
||||
gl_Position.xy += (point_coord * 2.0 - 1.0) * (point_size / scene_data.viewport_size) * gl_Position.w;
|
||||
|
||||
#ifdef POINT_COORD_USED
|
||||
point_coord_interp = point_coord;
|
||||
|
||||
@@ -678,7 +678,7 @@ void vertex_shader(in vec3 vertex,
|
||||
vec2(1, 1));
|
||||
|
||||
vec2 point_coord = point_coords[gl_VertexIndex % 6];
|
||||
gl_Position.xy += (point_coord * 2.0 - 1.0) * point_size * scene_data.screen_pixel_size * gl_Position.w;
|
||||
gl_Position.xy += (point_coord * 2.0 - 1.0) * (point_size / scene_data.viewport_size) * gl_Position.w;
|
||||
|
||||
#ifdef POINT_COORD_USED
|
||||
point_coord_interp = point_coord;
|
||||
|
||||
@@ -69,7 +69,7 @@ RID RenderSceneDataRD::create_uniform_buffer() {
|
||||
return RD::get_singleton()->uniform_buffer_create(sizeof(UBODATA));
|
||||
}
|
||||
|
||||
void RenderSceneDataRD::update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers, bool p_apply_alpha_multiplier) {
|
||||
void RenderSceneDataRD::update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_pancake_shadows, const Size2i &p_screen_size, const Size2 &p_viewport_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers, bool p_apply_alpha_multiplier) {
|
||||
RendererSceneRenderRD *render_scene_render = RendererSceneRenderRD::get_singleton();
|
||||
|
||||
UBODATA ubo_data;
|
||||
@@ -127,8 +127,8 @@ void RenderSceneDataRD::update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p
|
||||
ubo.camera_visible_layers = camera_visible_layers;
|
||||
ubo.pass_alpha_multiplier = p_opaque_render_buffers && p_apply_alpha_multiplier ? 0.0f : 1.0f;
|
||||
|
||||
ubo.viewport_size[0] = p_screen_size.x;
|
||||
ubo.viewport_size[1] = p_screen_size.y;
|
||||
ubo.viewport_size[0] = p_viewport_size.x;
|
||||
ubo.viewport_size[1] = p_viewport_size.y;
|
||||
|
||||
Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size);
|
||||
ubo.screen_pixel_size[0] = screen_pixel_size.x;
|
||||
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
virtual Projection get_view_projection(uint32_t p_view) const override;
|
||||
|
||||
RID create_uniform_buffer();
|
||||
void update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers, bool p_apply_alpha_multiplier);
|
||||
void update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_pancake_shadows, const Size2i &p_screen_size, const Size2 &p_viewport_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers, bool p_apply_alpha_multiplier);
|
||||
virtual RID get_uniform_buffer() const override;
|
||||
|
||||
static uint32_t get_uniform_buffer_size_bytes() { return sizeof(UBODATA); }
|
||||
|
||||
Reference in New Issue
Block a user