diff options
Diffstat (limited to 'servers/rendering')
18 files changed, 215 insertions, 146 deletions
diff --git a/servers/rendering/rasterizer.h b/servers/rendering/rasterizer.h index 84c04f34b6..e64c517a0b 100644 --- a/servers/rendering/rasterizer.h +++ b/servers/rendering/rasterizer.h @@ -84,7 +84,7 @@ public:  	virtual void environment_set_camera_feed_id(RID p_env, int p_camera_feed_id) = 0;  #endif -	virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap) = 0; +	virtual void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap) = 0;  	virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0;  	virtual void environment_glow_set_use_high_quality(bool p_enable) = 0; @@ -111,7 +111,7 @@ public:  	virtual void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, RID p_ramp) = 0; -	virtual void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density) = 0; +	virtual void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) = 0;  	virtual Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) = 0; diff --git a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp index 71acd4ceb6..0a3a863ee7 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp @@ -389,14 +389,14 @@ void RasterizerEffectsRD::gaussian_blur(RID p_source_rd_texture, RID p_texture,  	RD::get_singleton()->compute_list_end();  } -void RasterizerEffectsRD::gaussian_glow(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Size2i &p_size, float p_strength, bool p_high_quality, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_treshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_grey) { +void RasterizerEffectsRD::gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength, bool p_high_quality, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_treshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_grey) {  	zeromem(©.push_constant, sizeof(CopyPushConstant));  	CopyMode copy_mode = p_first_pass && p_auto_exposure.is_valid() ? COPY_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE : COPY_MODE_GAUSSIAN_GLOW;  	uint32_t base_flags = 0; -	int32_t x_groups = (p_size.width - 1) / 8 + 1; -	int32_t y_groups = (p_size.height - 1) / 8 + 1; +	int32_t x_groups = (p_size.width + 7) / 8; +	int32_t y_groups = (p_size.height + 7) / 8;  	copy.push_constant.section[2] = p_size.x;  	copy.push_constant.section[3] = p_size.y; @@ -411,29 +411,15 @@ void RasterizerEffectsRD::gaussian_glow(RID p_source_rd_texture, RID p_texture,  	copy.push_constant.glow_auto_exposure_grey = p_auto_exposure_grey; //unused also -	//HORIZONTAL  	RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();  	RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[copy_mode]);  	RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); -	RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_texture), 3); +	RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_back_texture), 3);  	if (p_auto_exposure.is_valid() && p_first_pass) {  		RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_auto_exposure), 1);  	} -	copy.push_constant.flags = base_flags | COPY_FLAG_HORIZONTAL | (p_first_pass ? COPY_FLAG_GLOW_FIRST_PASS : 0) | (p_high_quality ? COPY_FLAG_HIGH_QUALITY_GLOW : 0); -	RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); - -	RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); -	RD::get_singleton()->compute_list_add_barrier(compute_list); - -	copy_mode = COPY_MODE_GAUSSIAN_GLOW; - -	//VERTICAL -	RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[copy_mode]); -	RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_texture), 0); -	RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_back_texture), 3); - -	copy.push_constant.flags = base_flags; +	copy.push_constant.flags = base_flags | (p_first_pass ? COPY_FLAG_GLOW_FIRST_PASS : 0) | (p_high_quality ? COPY_FLAG_HIGH_QUALITY_GLOW : 0);  	RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant));  	RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); @@ -692,7 +678,13 @@ void RasterizerEffectsRD::tonemapper(RID p_source_color, RID p_dst_framebuffer,  	tonemap.push_constant.use_glow = p_settings.use_glow;  	tonemap.push_constant.glow_intensity = p_settings.glow_intensity; -	tonemap.push_constant.glow_level_flags = p_settings.glow_level_flags; +	tonemap.push_constant.glow_levels[0] = p_settings.glow_levels[0]; // clean this up to just pass by pointer or something +	tonemap.push_constant.glow_levels[1] = p_settings.glow_levels[1]; +	tonemap.push_constant.glow_levels[2] = p_settings.glow_levels[2]; +	tonemap.push_constant.glow_levels[3] = p_settings.glow_levels[3]; +	tonemap.push_constant.glow_levels[4] = p_settings.glow_levels[4]; +	tonemap.push_constant.glow_levels[5] = p_settings.glow_levels[5]; +	tonemap.push_constant.glow_levels[6] = p_settings.glow_levels[6];  	tonemap.push_constant.glow_texture_size[0] = p_settings.glow_texture_size.x;  	tonemap.push_constant.glow_texture_size[1] = p_settings.glow_texture_size.y;  	tonemap.push_constant.glow_mode = p_settings.glow_mode; diff --git a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h index e434bbc372..8607a6ee67 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h @@ -175,14 +175,16 @@ class RasterizerEffectsRD {  		uint32_t tonemapper;  		uint32_t glow_texture_size[2]; -  		float glow_intensity; -		uint32_t glow_level_flags; +		uint32_t pad3; +  		uint32_t glow_mode; +		float glow_levels[7];  		float exposure;  		float white;  		float auto_exposure_grey; +		uint32_t pad2;  		float pixel_size[2];  		uint32_t use_fxaa; @@ -607,7 +609,7 @@ public:  	void copy_depth_to_rect_and_linearize(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y, float p_z_near, float p_z_far);  	void copy_to_atlas_fb(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_uv_rect, RD::DrawListID p_draw_list, bool p_flip_y = false, bool p_panorama = false);  	void gaussian_blur(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Rect2i &p_region, bool p_8bit_dst = false); -	void gaussian_glow(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Size2i &p_size, float p_strength = 1.0, bool p_high_quality = false, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_treshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_grey = 1.0); +	void gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength = 1.0, bool p_high_quality = false, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_treshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_grey = 1.0);  	void cubemap_roughness(RID p_source_rd_texture, RID p_dest_framebuffer, uint32_t p_face_id, uint32_t p_sample_count, float p_roughness, float p_size);  	void make_mipmap(RID p_source_rd_texture, RID p_dest_texture, const Size2i &p_size); @@ -627,7 +629,7 @@ public:  		GlowMode glow_mode = GLOW_MODE_ADD;  		float glow_intensity = 1.0; -		uint32_t glow_level_flags = 0; +		float glow_levels[7] = { 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0 };  		Vector2i glow_texture_size;  		bool glow_use_bicubic_upscale = false;  		RID glow_texture; diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp index ac028e93f1..35b0591289 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp @@ -1335,6 +1335,7 @@ void RasterizerSceneHighEndRD::_setup_environment(RID p_environment, RID p_rende  		if (scene_state.ubo.fog_height_density >= 0.0001) {  			scene_state.ubo.fog_height_density = 1.0 / scene_state.ubo.fog_height_density;  		} +		scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_environment);  		Color fog_color = environment_get_fog_light_color(p_environment).to_linear();  		float fog_energy = environment_get_fog_light_energy(p_environment); @@ -2761,6 +2762,9 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag  		actions.renames["NORMAL_ROUGHNESS_TEXTURE"] = "normal_roughness_buffer";  		actions.renames["DEPTH"] = "gl_FragDepth";  		actions.renames["OUTPUT_IS_SRGB"] = "true"; +		actions.renames["FOG"] = "custom_fog"; +		actions.renames["RADIANCE"] = "custom_radiance"; +		actions.renames["IRRADIANCE"] = "custom_irradiance";  		//for light  		actions.renames["VIEW"] = "view"; @@ -2798,6 +2802,10 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag  		actions.usage_defines["DIFFUSE_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";  		actions.usage_defines["SPECULAR_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n"; +		actions.usage_defines["FOG"] = "#define CUSTOM_FOG_USED\n"; +		actions.usage_defines["RADIANCE"] = "#define CUSTOM_RADIANCE_USED\n"; +		actions.usage_defines["IRRADIANCE"] = "#define CUSTOM_IRRADIANCE_USED\n"; +  		actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";  		actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";  		actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n"; diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h index 4c89928c95..566022ae5b 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h @@ -308,12 +308,6 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD {  			float viewport_size[2];  			float screen_pixel_size[2]; -			float time; -			float reflection_multiplier; - -			uint32_t pancake_shadows; -			uint32_t pad; -  			float directional_penumbra_shadow_kernel[128]; //32 vec4s  			float directional_soft_shadow_kernel[128];  			float penumbra_shadow_kernel[128]; @@ -366,7 +360,6 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD {  			uint32_t volumetric_fog_pad;  			// Fog -  			uint32_t fog_enabled;  			float fog_density;  			float fog_height; @@ -374,6 +367,13 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD {  			float fog_light_color[3];  			float fog_sun_scatter; + +			float fog_aerial_perspective; + +			float time; +			float reflection_multiplier; + +			uint32_t pancake_shadows;  		};  		UBO ubo; diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp index 934330cc9b..9e6225a97a 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp @@ -2322,6 +2322,7 @@ void RasterizerSceneRD::_setup_sky(RID p_environment, RID p_render_buffers, cons  	sky_scene_state.ubo.z_far = p_projection.get_z_far();  	sky_scene_state.ubo.fog_enabled = environment_is_fog_enabled(p_environment);  	sky_scene_state.ubo.fog_density = environment_get_fog_density(p_environment); +	sky_scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_environment);  	Color fog_color = environment_get_fog_light_color(p_environment).to_linear();  	float fog_energy = environment_get_fog_light_energy(p_environment);  	sky_scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; @@ -2932,11 +2933,12 @@ void RasterizerSceneRD::environment_set_tonemap(RID p_env, RS::EnvironmentToneMa  	env->auto_exp_scale = p_auto_exp_scale;  } -void RasterizerSceneRD::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap) { +void RasterizerSceneRD::environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap) {  	Environment *env = environment_owner.getornull(p_env);  	ERR_FAIL_COND(!env); +	ERR_FAIL_COND_MSG(p_levels.size() != 7, "Size of array of glow levels must be 7");  	env->glow_enabled = p_enable; -	env->glow_levels = p_level_flags; +	env->glow_levels = p_levels;  	env->glow_intensity = p_intensity;  	env->glow_strength = p_strength;  	env->glow_mix = p_mix; @@ -2971,7 +2973,7 @@ void RasterizerSceneRD::environment_set_sdfgi(RID p_env, bool p_enable, RS::Envi  	env->sdfgi_y_scale = p_y_scale;  } -void RasterizerSceneRD::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density) { +void RasterizerSceneRD::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_fog_aerial_perspective) {  	Environment *env = environment_owner.getornull(p_env);  	ERR_FAIL_COND(!env); @@ -2982,6 +2984,7 @@ void RasterizerSceneRD::environment_set_fog(RID p_env, bool p_enable, const Colo  	env->fog_density = p_density;  	env->fog_height = p_height;  	env->fog_height_density = p_height_density; +	env->fog_aerial_perspective = p_fog_aerial_perspective;  }  bool RasterizerSceneRD::environment_is_fog_enabled(RID p_env) const { @@ -3022,6 +3025,12 @@ float RasterizerSceneRD::environment_get_fog_height_density(RID p_env) const {  	return env->fog_height_density;  } +float RasterizerSceneRD::environment_get_fog_aerial_perspective(RID p_env) const { +	const Environment *env = environment_owner.getornull(p_env); +	ERR_FAIL_COND_V(!env, 0); +	return env->fog_aerial_perspective; +} +  void RasterizerSceneRD::environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_light, float p_light_energy, float p_length, float p_detail_spread, float p_gi_inject, RenderingServer::EnvVolumetricFogShadowFilter p_shadow_filter) {  	Environment *env = environment_owner.getornull(p_env);  	ERR_FAIL_COND(!env); @@ -5237,25 +5246,21 @@ void RasterizerSceneRD::_render_buffers_post_process_and_tonemap(RID p_render_bu  	}  	int max_glow_level = -1; -	int glow_mask = 0;  	if (can_use_effects && env && env->glow_enabled) {  		/* see that blur textures are allocated */ -		if (rb->blur[0].texture.is_null()) { +		if (rb->blur[1].texture.is_null()) {  			_allocate_blur_textures(rb);  			_render_buffers_uniform_set_changed(p_render_buffers);  		}  		for (int i = 0; i < RS::MAX_GLOW_LEVELS; i++) { -			if (env->glow_levels & (1 << i)) { +			if (env->glow_levels[i] > 0.0) {  				if (i >= rb->blur[1].mipmaps.size()) {  					max_glow_level = rb->blur[1].mipmaps.size() - 1; -					glow_mask |= 1 << max_glow_level; -  				} else {  					max_glow_level = i; -					glow_mask |= (1 << i);  				}  			}  		} @@ -5269,9 +5274,9 @@ void RasterizerSceneRD::_render_buffers_post_process_and_tonemap(RID p_render_bu  				if (env->auto_exposure && rb->luminance.current.is_valid()) {  					luminance_texture = rb->luminance.current;  				} -				storage->get_effects()->gaussian_glow(rb->texture, rb->blur[0].mipmaps[i + 1].texture, rb->blur[1].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality, true, env->glow_hdr_luminance_cap, env->exposure, env->glow_bloom, env->glow_hdr_bleed_threshold, env->glow_hdr_bleed_scale, luminance_texture, env->auto_exp_scale); +				storage->get_effects()->gaussian_glow(rb->texture, rb->blur[1].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality, true, env->glow_hdr_luminance_cap, env->exposure, env->glow_bloom, env->glow_hdr_bleed_threshold, env->glow_hdr_bleed_scale, luminance_texture, env->auto_exp_scale);  			} else { -				storage->get_effects()->gaussian_glow(rb->blur[1].mipmaps[i - 1].texture, rb->blur[0].mipmaps[i + 1].texture, rb->blur[1].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality); +				storage->get_effects()->gaussian_glow(rb->blur[1].mipmaps[i - 1].texture, rb->blur[1].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality);  			}  		}  	} @@ -5294,7 +5299,9 @@ void RasterizerSceneRD::_render_buffers_post_process_and_tonemap(RID p_render_bu  			tonemap.use_glow = true;  			tonemap.glow_mode = RasterizerEffectsRD::TonemapSettings::GlowMode(env->glow_blend_mode);  			tonemap.glow_intensity = env->glow_blend_mode == RS::ENV_GLOW_BLEND_MODE_MIX ? env->glow_mix : env->glow_intensity; -			tonemap.glow_level_flags = glow_mask; +			for (int i = 0; i < RS::MAX_GLOW_LEVELS; i++) { +				tonemap.glow_levels[i] = env->glow_levels[i]; +			}  			tonemap.glow_texture_size.x = rb->blur[1].mipmaps[0].width;  			tonemap.glow_texture_size.y = rb->blur[1].mipmaps[0].height;  			tonemap.glow_use_bicubic_upscale = glow_bicubic_upscale; @@ -7992,6 +7999,7 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) {  		actions.renames["HALF_RES_COLOR"] = "half_res_color";  		actions.renames["QUARTER_RES_COLOR"] = "quarter_res_color";  		actions.renames["RADIANCE"] = "radiance"; +		actions.renames["FOG"] = "custom_fog";  		actions.renames["LIGHT0_ENABLED"] = "directional_lights.data[0].enabled";  		actions.renames["LIGHT0_DIRECTION"] = "directional_lights.data[0].direction_energy.xyz";  		actions.renames["LIGHT0_ENERGY"] = "directional_lights.data[0].direction_energy.w"; diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h index 0e7e56716b..8a14598250 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h @@ -67,7 +67,8 @@ protected:  			uint32_t volumetric_fog_enabled;  			float volumetric_fog_inv_length;  			float volumetric_fog_detail_spread; -			uint32_t volumetric_fog_pad; + +			float fog_aerial_perspective;  			float fog_light_color[3];  			float fog_sun_scatter; @@ -706,6 +707,7 @@ private:  		float fog_density = 0.001;  		float fog_height = 0.0;  		float fog_height_density = 0.0; //can be negative to invert effect +		float fog_aerial_perspective = 0.0;  		/// Volumetric Fog  		/// @@ -721,7 +723,7 @@ private:  		/// Glow  		bool glow_enabled = false; -		int glow_levels = (1 << 2) | (1 << 4); +		Vector<float> glow_levels;  		float glow_intensity = 0.8;  		float glow_strength = 1.0;  		float glow_bloom = 0.0; @@ -1530,11 +1532,11 @@ public:  	bool is_environment(RID p_env) const; -	void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap); +	void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap);  	void environment_glow_set_use_bicubic_upscale(bool p_enable);  	void environment_glow_set_use_high_quality(bool p_enable); -	void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density); +	void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective);  	bool environment_is_fog_enabled(RID p_env) const;  	Color environment_get_fog_light_color(RID p_env) const;  	float environment_get_fog_light_energy(RID p_env) const; @@ -1542,6 +1544,7 @@ public:  	float environment_get_fog_density(RID p_env) const;  	float environment_get_fog_height(RID p_env) const;  	float environment_get_fog_height_density(RID p_env) const; +	float environment_get_fog_aerial_perspective(RID p_env) const;  	void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_light, float p_light_energy, float p_length, float p_detail_spread, float p_gi_inject, RS::EnvVolumetricFogShadowFilter p_shadow_filter); diff --git a/servers/rendering/rasterizer_rd/shaders/copy.glsl b/servers/rendering/rasterizer_rd/shaders/copy.glsl index e565bd8e3d..355a2b9d75 100644 --- a/servers/rendering/rasterizer_rd/shaders/copy.glsl +++ b/servers/rendering/rasterizer_rd/shaders/copy.glsl @@ -58,12 +58,20 @@ layout(rgba8, set = 3, binding = 0) uniform restrict writeonly image2D dest_buff  layout(rgba32f, set = 3, binding = 0) uniform restrict writeonly image2D dest_buffer;  #endif +#ifdef MODE_GAUSSIAN_GLOW +shared vec4 local_cache[256]; +shared vec4 temp_cache[128]; +#endif +  void main() {  	// Pixel being shaded  	ivec2 pos = ivec2(gl_GlobalInvocationID.xy); + +#ifndef MODE_GAUSSIAN_GLOW // Glow needs the extra threads  	if (any(greaterThanEqual(pos, params.section.zw))) { //too large, do nothing  		return;  	} +#endif  #ifdef MODE_MIPMAP @@ -104,70 +112,69 @@ void main() {  #ifdef MODE_GAUSSIAN_GLOW -	//Glow uses larger sigma 1 for a more rounded blur effect +	// First pass copy texture into 16x16 local memory for every 8x8 thread block +	vec2 quad_center_uv = clamp(vec2(gl_GlobalInvocationID.xy + gl_LocalInvocationID.xy - 3.5) / params.section.zw, vec2(0.5 / params.section.zw), vec2(1.0 - 1.5 / params.section.zw)); +	uint dest_index = gl_LocalInvocationID.x * 2 + gl_LocalInvocationID.y * 2 * 16; + +	if (bool(params.flags & FLAG_HIGH_QUALITY_GLOW)) { +		vec2 quad_offset_uv = clamp((vec2(gl_GlobalInvocationID.xy + gl_LocalInvocationID.xy - 3.0)) / params.section.zw, vec2(0.5 / params.section.zw), vec2(1.0 - 1.5 / params.section.zw)); -#define GLOW_ADD(m_ofs, m_mult)                                                             \ -	{                                                                                       \ -		ivec2 ofs = base_pos + m_ofs;                                                       \ -		if (all(greaterThanEqual(ofs, section_begin)) && all(lessThan(ofs, section_end))) { \ -			color += texelFetch(source_color, ofs, 0) * m_mult;                             \ -		}                                                                                   \ +		local_cache[dest_index] = (textureLod(source_color, quad_center_uv, 0) + textureLod(source_color, quad_offset_uv, 0)) * 0.5; +		local_cache[dest_index + 1] = (textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.z, 0.0), 0) + textureLod(source_color, quad_offset_uv + vec2(1.0 / params.section.z, 0.0), 0)) * 0.5; +		local_cache[dest_index + 16] = (textureLod(source_color, quad_center_uv + vec2(0.0, 1.0 / params.section.w), 0) + textureLod(source_color, quad_offset_uv + vec2(0.0, 1.0 / params.section.w), 0)) * 0.5; +		local_cache[dest_index + 16 + 1] = (textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.zw), 0) + textureLod(source_color, quad_offset_uv + vec2(1.0 / params.section.zw), 0)) * 0.5; +	} else { +		local_cache[dest_index] = textureLod(source_color, quad_center_uv, 0); +		local_cache[dest_index + 1] = textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.z, 0.0), 0); +		local_cache[dest_index + 16] = textureLod(source_color, quad_center_uv + vec2(0.0, 1.0 / params.section.w), 0); +		local_cache[dest_index + 16 + 1] = textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.zw), 0);  	} +	memoryBarrierShared(); +	barrier(); + +	// Horizontal pass. Needs to copy into 8x16 chunk of local memory so vertical pass has full resolution +	uint read_index = gl_LocalInvocationID.x + gl_LocalInvocationID.y * 32 + 4; +	vec4 color_top = vec4(0.0); +	color_top += local_cache[read_index] * 0.174938; +	color_top += local_cache[read_index + 1] * 0.165569; +	color_top += local_cache[read_index + 2] * 0.140367; +	color_top += local_cache[read_index + 3] * 0.106595; +	color_top += local_cache[read_index - 1] * 0.165569; +	color_top += local_cache[read_index - 2] * 0.140367; +	color_top += local_cache[read_index - 3] * 0.106595; + +	vec4 color_bottom = vec4(0.0); +	color_bottom += local_cache[read_index + 16] * 0.174938; +	color_bottom += local_cache[read_index + 1 + 16] * 0.165569; +	color_bottom += local_cache[read_index + 2 + 16] * 0.140367; +	color_bottom += local_cache[read_index + 3 + 16] * 0.106595; +	color_bottom += local_cache[read_index - 1 + 16] * 0.165569; +	color_bottom += local_cache[read_index - 2 + 16] * 0.140367; +	color_bottom += local_cache[read_index - 3 + 16] * 0.106595; + +	// rotate samples to take advantage of cache coherency +	uint write_index = gl_LocalInvocationID.y * 2 + gl_LocalInvocationID.x * 16; + +	temp_cache[write_index] = color_top; +	temp_cache[write_index + 1] = color_bottom; + +	memoryBarrierShared(); +	barrier(); + +	// Vertical pass +	uint index = gl_LocalInvocationID.y + gl_LocalInvocationID.x * 16 + 4;  	vec4 color = vec4(0.0); -	if (bool(params.flags & FLAG_HORIZONTAL)) { -		ivec2 base_pos = ((pos + params.section.xy) << 1) + ivec2(1); -		ivec2 section_begin = params.section.xy << 1; -		ivec2 section_end = section_begin + (params.section.zw << 1); - -		if (bool(params.flags & FLAG_HIGH_QUALITY_GLOW)) { -			//Sample from two lines to capture single pixel features -			GLOW_ADD(ivec2(0, 0), 0.152781); -			GLOW_ADD(ivec2(1, 0), 0.144599); -			GLOW_ADD(ivec2(2, 0), 0.122589); -			GLOW_ADD(ivec2(3, 0), 0.093095); -			GLOW_ADD(ivec2(4, 0), 0.063327); -			GLOW_ADD(ivec2(-1, 0), 0.144599); -			GLOW_ADD(ivec2(-2, 0), 0.122589); -			GLOW_ADD(ivec2(-3, 0), 0.093095); -			GLOW_ADD(ivec2(-4, 0), 0.063327); - -			GLOW_ADD(ivec2(0, 1), 0.152781); -			GLOW_ADD(ivec2(1, 1), 0.144599); -			GLOW_ADD(ivec2(2, 1), 0.122589); -			GLOW_ADD(ivec2(3, 1), 0.093095); -			GLOW_ADD(ivec2(4, 1), 0.063327); -			GLOW_ADD(ivec2(-1, 1), 0.144599); -			GLOW_ADD(ivec2(-2, 1), 0.122589); -			GLOW_ADD(ivec2(-3, 1), 0.093095); -			GLOW_ADD(ivec2(-4, 1), 0.063327); -			color *= 0.5; -		} else { -			GLOW_ADD(ivec2(0, 0), 0.174938); -			GLOW_ADD(ivec2(1, 0), 0.165569); -			GLOW_ADD(ivec2(2, 0), 0.140367); -			GLOW_ADD(ivec2(3, 0), 0.106595); -			GLOW_ADD(ivec2(-1, 0), 0.165569); -			GLOW_ADD(ivec2(-2, 0), 0.140367); -			GLOW_ADD(ivec2(-3, 0), 0.106595); -		} - -		color *= params.glow_strength; -	} else { -		ivec2 base_pos = pos + params.section.xy; -		ivec2 section_begin = params.section.xy; -		ivec2 section_end = section_begin + params.section.zw; - -		GLOW_ADD(ivec2(0, 0), 0.288713); -		GLOW_ADD(ivec2(0, 1), 0.233062); -		GLOW_ADD(ivec2(0, 2), 0.122581); -		GLOW_ADD(ivec2(0, -1), 0.233062); -		GLOW_ADD(ivec2(0, -2), 0.122581); -		color *= params.glow_strength; -	} +	color += temp_cache[index] * 0.174938; +	color += temp_cache[index + 1] * 0.165569; +	color += temp_cache[index + 2] * 0.140367; +	color += temp_cache[index + 3] * 0.106595; +	color += temp_cache[index - 1] * 0.165569; +	color += temp_cache[index - 2] * 0.140367; +	color += temp_cache[index - 3] * 0.106595; -#undef GLOW_ADD +	color *= params.glow_strength;  	if (bool(params.flags & FLAG_GLOW_FIRST_PASS)) {  #ifdef GLOW_USE_AUTO_EXPOSURE diff --git a/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl b/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl index be34473892..455a3d4a3a 100644 --- a/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl +++ b/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl @@ -1621,6 +1621,22 @@ vec4 volumetric_fog_process(vec2 screen_uv, float z) {  vec4 fog_process(vec3 vertex) {  	vec3 fog_color = scene_data.fog_light_color; +	if (scene_data.fog_aerial_perspective > 0.0) { +		vec3 sky_fog_color = vec3(0.0); +		vec3 cube_view = scene_data.radiance_inverse_xform * vertex; +		// mip_level always reads from the second mipmap and higher so the fog is always slightly blurred +		float mip_level = mix(1.0 / MAX_ROUGHNESS_LOD, 1.0, 1.0 - (abs(vertex.z) - scene_data.z_near) / (scene_data.z_far - scene_data.z_near)); +#ifdef USE_RADIANCE_CUBEMAP_ARRAY +		float lod, blend; +		blend = modf(mip_level * MAX_ROUGHNESS_LOD, lod); +		sky_fog_color = texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(cube_view, lod)).rgb; +		sky_fog_color = mix(sky_fog_color, texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(cube_view, lod + 1)).rgb, blend); +#else +		sky_fog_color = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), cube_view, mip_level * MAX_ROUGHNESS_LOD).rgb; +#endif //USE_RADIANCE_CUBEMAP_ARRAY +		fog_color = mix(fog_color, sky_fog_color, scene_data.fog_aerial_perspective); +	} +  	if (scene_data.fog_sun_scatter > 0.001) {  		vec4 sun_scatter = vec4(0.0);  		float sun_total = 0.0; @@ -1676,6 +1692,15 @@ void main() {  	float clearcoat_gloss = 0.0;  	float anisotropy = 0.0;  	vec2 anisotropy_flow = vec2(1.0, 0.0); +#if defined(CUSTOM_FOG_USED) +	vec4 custom_fog = vec4(0.0); +#endif +#if defined(CUSTOM_RADIANCE_USED) +	vec4 custom_radiance = vec4(0.0); +#endif +#if defined(CUSTOM_IRRADIANCE_USED) +	vec4 custom_irradiance = vec4(0.0); +#endif  #if defined(AO_USED)  	float ao = 1.0; @@ -1893,6 +1918,10 @@ FRAGMENT_SHADER_CODE  		specular_light *= scene_data.ambient_light_color_energy.a;  	} +#if defined(CUSTOM_RADIANCE_USED) +	specular_light = mix(specular_light, custom_radiance.rgb, custom_radiance.a); +#endif +  #ifndef USE_LIGHTMAP  	//lightmap overrides everything  	if (scene_data.use_ambient_light) { @@ -1910,7 +1939,9 @@ FRAGMENT_SHADER_CODE  		}  	}  #endif // USE_LIGHTMAP - +#if defined(CUSTOM_IRRADIANCE_USED) +	ambient_light = mix(specular_light, custom_irradiance.rgb, custom_irradiance.a); +#endif  #endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)  	//radiance @@ -2739,6 +2770,11 @@ FRAGMENT_SHADER_CODE  		specular_buffer.rgb = mix(specular_buffer.rgb, vec3(0.0), fog.a);  	} +#if defined(CUSTOM_FOG_USED) +	diffuse_buffer.rgb = mix(diffuse_buffer.rgb, custom_fog.rgb, custom_fog.a); +	specular_buffer.rgb = mix(specular_buffer.rgb, vec3(0.0), custom_fog.a); +#endif //CUSTOM_FOG_USED +  #else //MODE_MULTIPLE_RENDER_TARGETS  #ifdef MODE_UNSHADED @@ -2759,6 +2795,10 @@ FRAGMENT_SHADER_CODE  		frag_color.rgb = mix(frag_color.rgb, fog.rgb, fog.a);  	} +#if defined(CUSTOM_FOG_USED) +	frag_color.rgb = mix(frag_color.rgb, custom_fog.rgb, custom_fog.a); +#endif //CUSTOM_FOG_USED +  #endif //MODE_MULTIPLE_RENDER_TARGETS  #endif //MODE_RENDER_DEPTH diff --git a/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl b/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl index 0cc2b90c53..e29a490ca1 100644 --- a/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl +++ b/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl @@ -43,12 +43,6 @@ layout(set = 0, binding = 3, std140) uniform SceneData {  	vec2 viewport_size;  	vec2 screen_pixel_size; -	float time; -	float reflection_multiplier; // one normally, zero when rendering reflections - -	bool pancake_shadows; -	uint pad; -  	//use vec4s because std140 doesnt play nice with vec2s, z and w are wasted  	vec4 directional_penumbra_shadow_kernel[32];  	vec4 directional_soft_shadow_kernel[32]; @@ -108,6 +102,13 @@ layout(set = 0, binding = 3, std140) uniform SceneData {  	vec3 fog_light_color;  	float fog_sun_scatter; + +	float fog_aerial_perspective; + +	float time; +	float reflection_multiplier; // one normally, zero when rendering reflections + +	bool pancake_shadows;  }  scene_data; diff --git a/servers/rendering/rasterizer_rd/shaders/screen_space_reflection.glsl b/servers/rendering/rasterizer_rd/shaders/screen_space_reflection.glsl index a8ee33a664..06dc4b13de 100644 --- a/servers/rendering/rasterizer_rd/shaders/screen_space_reflection.glsl +++ b/servers/rendering/rasterizer_rd/shaders/screen_space_reflection.glsl @@ -155,18 +155,14 @@ void main() {  		depth = imageLoad(source_depth, ivec2(pos - 0.5)).r; -		if (-depth >= params.camera_z_far) { //went beyond camera -			break; -		} -  		z_from = z_to;  		z_to = z / w;  		if (depth > z_to) {  			// if depth was surpassed -			if (depth <= max(z_to, z_from) + params.depth_tolerance) { -				// check the depth tolerance -				//check that normal is valid +			if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far) { +				// check the depth tolerance and far clip +				// check that normal is valid  				found = true;  			}  			break; diff --git a/servers/rendering/rasterizer_rd/shaders/sky.glsl b/servers/rendering/rasterizer_rd/shaders/sky.glsl index 7711f683ae..6c985e1f5c 100644 --- a/servers/rendering/rasterizer_rd/shaders/sky.glsl +++ b/servers/rendering/rasterizer_rd/shaders/sky.glsl @@ -62,7 +62,8 @@ layout(set = 0, binding = 2, std140) uniform SceneData {  	bool volumetric_fog_enabled;  	float volumetric_fog_inv_length;  	float volumetric_fog_detail_spread; -	uint volumetric_fog_pad; + +	float fog_aerial_perspective;  	vec3 fog_light_color;  	float fog_sun_scatter; @@ -140,8 +141,8 @@ vec4 volumetric_fog_process(vec2 screen_uv) {  	return texture(sampler3D(volumetric_fog_texture, material_samplers[SAMPLER_LINEAR_CLAMP]), fog_pos);  } -vec4 fog_process(vec3 view) { -	vec3 fog_color = scene_data.fog_light_color; +vec4 fog_process(vec3 view, vec3 sky_color) { +	vec3 fog_color = mix(scene_data.fog_light_color, sky_color, scene_data.fog_aerial_perspective);  	if (scene_data.fog_sun_scatter > 0.001) {  		vec4 sun_scatter = vec4(0.0); @@ -181,6 +182,7 @@ void main() {  	float alpha = 1.0; // Only available to subpasses  	vec4 half_res_color = vec4(1.0);  	vec4 quarter_res_color = vec4(1.0); +	vec4 custom_fog = vec4(0.0);  #ifdef USE_CUBEMAP_PASS  	vec3 inverted_cube_normal = cube_normal; @@ -225,7 +227,7 @@ FRAGMENT_SHADER_CODE  	// Draw "fixed" fog before volumetric fog to ensure volumetric fog can appear in front of the sky.  	if (scene_data.fog_enabled) { -		vec4 fog = fog_process(cube_normal); +		vec4 fog = fog_process(cube_normal, frag_color.rgb);  		frag_color.rgb = mix(frag_color.rgb, fog.rgb, fog.a);  	} @@ -234,6 +236,10 @@ FRAGMENT_SHADER_CODE  		frag_color.rgb = mix(frag_color.rgb, fog.rgb, fog.a);  	} +	if (custom_fog.a > 0.0) { +		frag_color.rgb = mix(frag_color.rgb, custom_fog.rgb, custom_fog.a); +	} +  #endif // DISABLE_FOG  	// Blending is disabled for Sky, so alpha doesn't blend diff --git a/servers/rendering/rasterizer_rd/shaders/tonemap.glsl b/servers/rendering/rasterizer_rd/shaders/tonemap.glsl index b7c46a7d0e..74449496f6 100644 --- a/servers/rendering/rasterizer_rd/shaders/tonemap.glsl +++ b/servers/rendering/rasterizer_rd/shaders/tonemap.glsl @@ -37,12 +37,14 @@ layout(push_constant, binding = 1, std430) uniform Params {  	uvec2 glow_texture_size;  	float glow_intensity; -	uint glow_level_flags; +	uint pad3;  	uint glow_mode; +	float glow_levels[7];  	float exposure;  	float white;  	float auto_exposure_grey; +	uint pad2;  	vec2 pixel_size;  	bool use_fxaa; @@ -186,32 +188,32 @@ vec3 apply_tonemapping(vec3 color, float white) { // inputs are LINEAR, always o  vec3 gather_glow(sampler2D tex, vec2 uv) { // sample all selected glow levels  	vec3 glow = vec3(0.0f); -	if (bool(params.glow_level_flags & (1 << 0))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 0).rgb; +	if (params.glow_levels[0] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 0).rgb * params.glow_levels[0];  	} -	if (bool(params.glow_level_flags & (1 << 1))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 1).rgb; +	if (params.glow_levels[1] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 1).rgb * params.glow_levels[1];  	} -	if (bool(params.glow_level_flags & (1 << 2))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 2).rgb; +	if (params.glow_levels[2] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 2).rgb * params.glow_levels[2];  	} -	if (bool(params.glow_level_flags & (1 << 3))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 3).rgb; +	if (params.glow_levels[3] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 3).rgb * params.glow_levels[3];  	} -	if (bool(params.glow_level_flags & (1 << 4))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 4).rgb; +	if (params.glow_levels[4] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 4).rgb * params.glow_levels[4];  	} -	if (bool(params.glow_level_flags & (1 << 5))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 5).rgb; +	if (params.glow_levels[5] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 5).rgb * params.glow_levels[5];  	} -	if (bool(params.glow_level_flags & (1 << 6))) { -		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 6).rgb; +	if (params.glow_levels[6] > 0.0001) { +		glow += GLOW_TEXTURE_SAMPLE(tex, uv, 6).rgb * params.glow_levels[6];  	}  	return glow; diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 83cbfb85bd..1259b161bd 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -29,7 +29,7 @@  /*************************************************************************/  #include "rendering_device.h" -#include "core/method_bind_ext.gen.inc" +  #include "rendering_device_binds.h"  RenderingDevice *RenderingDevice::singleton = nullptr; diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 72afc7c621..6df66e7b20 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -31,7 +31,7 @@  #ifndef RENDERING_DEVICE_H  #define RENDERING_DEVICE_H -#include "core/object.h" +#include "core/class_db.h"  #include "core/typed_array.h"  #include "servers/display_server.h" diff --git a/servers/rendering/rendering_server_raster.h b/servers/rendering/rendering_server_raster.h index afb3d6f46f..fb3baeca95 100644 --- a/servers/rendering/rendering_server_raster.h +++ b/servers/rendering/rendering_server_raster.h @@ -581,7 +581,7 @@ public:  	BIND9(environment_set_ssao, RID, bool, float, float, float, float, float, EnvironmentSSAOBlur, float)  	BIND2(environment_set_ssao_quality, EnvironmentSSAOQuality, bool) -	BIND11(environment_set_glow, RID, bool, int, float, float, float, float, EnvironmentGlowBlendMode, float, float, float) +	BIND11(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, EnvironmentGlowBlendMode, float, float, float)  	BIND1(environment_glow_set_use_bicubic_upscale, bool)  	BIND1(environment_glow_set_use_high_quality, bool) @@ -589,7 +589,7 @@ public:  	BIND6(environment_set_adjustment, RID, bool, float, float, float, RID) -	BIND8(environment_set_fog, RID, bool, const Color &, float, float, float, float, float) +	BIND9(environment_set_fog, RID, bool, const Color &, float, float, float, float, float, float)  	BIND9(environment_set_volumetric_fog, RID, bool, float, const Color &, float, float, float, float, EnvVolumetricFogShadowFilter)  	BIND2(environment_set_volumetric_fog_volume_size, int, int) diff --git a/servers/rendering/rendering_server_wrap_mt.h b/servers/rendering/rendering_server_wrap_mt.h index 910acd74cb..305a3aaee7 100644 --- a/servers/rendering/rendering_server_wrap_mt.h +++ b/servers/rendering/rendering_server_wrap_mt.h @@ -492,7 +492,7 @@ public:  	FUNC1(environment_set_sdfgi_ray_count, EnvironmentSDFGIRayCount)  	FUNC1(environment_set_sdfgi_frames_to_converge, EnvironmentSDFGIFramesToConverge) -	FUNC11(environment_set_glow, RID, bool, int, float, float, float, float, EnvironmentGlowBlendMode, float, float, float) +	FUNC11(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, EnvironmentGlowBlendMode, float, float, float)  	FUNC1(environment_glow_set_use_bicubic_upscale, bool)  	FUNC1(environment_glow_set_use_high_quality, bool) @@ -500,7 +500,7 @@ public:  	FUNC6(environment_set_adjustment, RID, bool, float, float, float, RID) -	FUNC8(environment_set_fog, RID, bool, const Color &, float, float, float, float, float) +	FUNC9(environment_set_fog, RID, bool, const Color &, float, float, float, float, float, float)  	FUNC9(environment_set_volumetric_fog, RID, bool, float, const Color &, float, float, float, float, EnvVolumetricFogShadowFilter) diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp index f1209d9d6d..48eaf1dd13 100644 --- a/servers/rendering/shader_types.cpp +++ b/servers/rendering/shader_types.cpp @@ -129,6 +129,9 @@ ShaderTypes::ShaderTypes() {  	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["PROJECTION_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);  	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["INV_PROJECTION_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);  	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["VIEWPORT_SIZE"] = constt(ShaderLanguage::TYPE_VEC2); +	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["FOG"] = ShaderLanguage::TYPE_VEC4; // TODO consider adding to light shader +	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["RADIANCE"] = ShaderLanguage::TYPE_VEC4; +	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["IRRADIANCE"] = ShaderLanguage::TYPE_VEC4;  	shader_modes[RS::SHADER_SPATIAL].functions["fragment"].can_discard = true;  	shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["WORLD_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4); @@ -353,6 +356,7 @@ ShaderTypes::ShaderTypes() {  	shader_modes[RS::SHADER_SKY].functions["fragment"].built_ins["SKY_COORDS"] = constt(ShaderLanguage::TYPE_VEC2);  	shader_modes[RS::SHADER_SKY].functions["fragment"].built_ins["HALF_RES_COLOR"] = constt(ShaderLanguage::TYPE_VEC4);  	shader_modes[RS::SHADER_SKY].functions["fragment"].built_ins["QUARTER_RES_COLOR"] = constt(ShaderLanguage::TYPE_VEC4); +	shader_modes[RS::SHADER_SKY].functions["fragment"].built_ins["FOG"] = ShaderLanguage::TYPE_VEC4;  	shader_modes[RS::SHADER_SKY].modes.push_back("use_half_res_pass");  	shader_modes[RS::SHADER_SKY].modes.push_back("use_quarter_res_pass");  |