add support for glow maps
This commit is contained in:
parent
eacde082a5
commit
90652b1755
|
@ -154,6 +154,13 @@
|
|||
<member name="glow_levels/7" type="float" setter="set_glow_level" getter="get_glow_level" default="0.0">
|
||||
The intensity of the 7th level of glow. This is the most "global" level (blurriest).
|
||||
</member>
|
||||
<member name="glow_map" type="Texture" setter="set_glow_map" getter="get_glow_map">
|
||||
The texture that should be used as a glow map to [i]multiply[/i] the resulting glow color according to [member glow_map_strength]. This can be used to create a "lens dirt" effect. The texture's RGB color channels are used for modulation, but the alpha channel is ignored.
|
||||
[b]Note:[/b] The texture will be stretched to fit the screen. Therefore, it's recommended to use a texture with an aspect ratio that matches your project's base aspect ratio (typically 16:9).
|
||||
</member>
|
||||
<member name="glow_map_strength" type="float" setter="set_glow_map_strength" getter="get_glow_map_strength" default="0.8">
|
||||
How strong of an impact the [member glow_map] should have on the overall glow effect. A strength of [code]0.0[/code] means the glow map has no effect on the overall glow effect. A strength of [code]1.0[/code] means the glow has a full effect on the overall glow effect (and can turn off glow entirely in specific areas of the screen if the glow map has black areas).
|
||||
</member>
|
||||
<member name="glow_mix" type="float" setter="set_glow_mix" getter="get_glow_mix" default="0.05">
|
||||
</member>
|
||||
<member name="glow_normalized" type="bool" setter="set_glow_normalized" getter="is_glow_normalized" default="false">
|
||||
|
|
|
@ -994,6 +994,8 @@
|
|||
<argument index="8" name="hdr_bleed_threshold" type="float" />
|
||||
<argument index="9" name="hdr_bleed_scale" type="float" />
|
||||
<argument index="10" name="hdr_luminance_cap" type="float" />
|
||||
<argument index="11" name="glow_map_strength" type="float" />
|
||||
<argument index="12" name="glow_map" type="RID" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
|
|
|
@ -208,7 +208,7 @@ void RasterizerSceneGLES3::environment_set_canvas_max_layer(RID p_env, int p_max
|
|||
void RasterizerSceneGLES3::environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::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 RasterizerSceneGLES3::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, float p_glow_map_strength, RID p_glow_map) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_glow_set_use_bicubic_upscale(bool p_enable) {
|
||||
|
|
|
@ -115,7 +115,7 @@ public:
|
|||
void environment_set_canvas_max_layer(RID p_env, int p_max_layer) override;
|
||||
void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) override;
|
||||
|
||||
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) override;
|
||||
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, float p_glow_map_strength, RID p_glow_map) override;
|
||||
void environment_glow_set_use_bicubic_upscale(bool p_enable) override;
|
||||
void environment_glow_set_use_high_quality(bool p_enable) override;
|
||||
|
||||
|
|
|
@ -728,6 +728,24 @@ float Environment::get_glow_hdr_luminance_cap() const {
|
|||
return glow_hdr_luminance_cap;
|
||||
}
|
||||
|
||||
void Environment::set_glow_map_strength(float p_strength) {
|
||||
glow_map_strength = p_strength;
|
||||
_update_glow();
|
||||
}
|
||||
|
||||
float Environment::get_glow_map_strength() const {
|
||||
return glow_map_strength;
|
||||
}
|
||||
|
||||
void Environment::set_glow_map(Ref<Texture> p_glow_map) {
|
||||
glow_map = p_glow_map;
|
||||
_update_glow();
|
||||
}
|
||||
|
||||
Ref<Texture> Environment::get_glow_map() const {
|
||||
return glow_map;
|
||||
}
|
||||
|
||||
void Environment::_update_glow() {
|
||||
Vector<float> normalized_levels;
|
||||
if (glow_normalize_levels) {
|
||||
|
@ -743,6 +761,15 @@ void Environment::_update_glow() {
|
|||
normalized_levels = glow_levels;
|
||||
}
|
||||
|
||||
float _glow_map_strength = 0.0f;
|
||||
RID glow_map_rid;
|
||||
if (glow_map.is_valid()) {
|
||||
glow_map_rid = glow_map->get_rid();
|
||||
_glow_map_strength = glow_map_strength;
|
||||
} else {
|
||||
glow_map_rid = RID();
|
||||
}
|
||||
|
||||
RS::get_singleton()->environment_set_glow(
|
||||
environment,
|
||||
glow_enabled,
|
||||
|
@ -754,7 +781,9 @@ void Environment::_update_glow() {
|
|||
RS::EnvironmentGlowBlendMode(glow_blend_mode),
|
||||
glow_hdr_bleed_threshold,
|
||||
glow_hdr_bleed_scale,
|
||||
glow_hdr_luminance_cap);
|
||||
glow_hdr_luminance_cap,
|
||||
_glow_map_strength,
|
||||
glow_map_rid);
|
||||
}
|
||||
|
||||
// Fog
|
||||
|
@ -1332,6 +1361,10 @@ void Environment::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_scale"), &Environment::get_glow_hdr_bleed_scale);
|
||||
ClassDB::bind_method(D_METHOD("set_glow_hdr_luminance_cap", "amount"), &Environment::set_glow_hdr_luminance_cap);
|
||||
ClassDB::bind_method(D_METHOD("get_glow_hdr_luminance_cap"), &Environment::get_glow_hdr_luminance_cap);
|
||||
ClassDB::bind_method(D_METHOD("set_glow_map_strength", "strength"), &Environment::set_glow_map_strength);
|
||||
ClassDB::bind_method(D_METHOD("get_glow_map_strength"), &Environment::get_glow_map_strength);
|
||||
ClassDB::bind_method(D_METHOD("set_glow_map", "mode"), &Environment::set_glow_map);
|
||||
ClassDB::bind_method(D_METHOD("get_glow_map"), &Environment::get_glow_map);
|
||||
|
||||
ADD_GROUP("Glow", "glow_");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_enabled"), "set_glow_enabled", "is_glow_enabled");
|
||||
|
@ -1351,6 +1384,8 @@ void Environment::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_hdr_threshold", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_threshold", "get_glow_hdr_bleed_threshold");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_hdr_scale", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_scale", "get_glow_hdr_bleed_scale");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_hdr_luminance_cap", PROPERTY_HINT_RANGE, "0.0,256.0,0.01"), "set_glow_hdr_luminance_cap", "get_glow_hdr_luminance_cap");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_map_strength", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_glow_map_strength", "get_glow_map_strength");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "glow_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_glow_map", "get_glow_map");
|
||||
|
||||
// Fog
|
||||
|
||||
|
|
|
@ -170,6 +170,8 @@ private:
|
|||
float glow_hdr_bleed_threshold = 1.0;
|
||||
float glow_hdr_bleed_scale = 2.0;
|
||||
float glow_hdr_luminance_cap = 12.0;
|
||||
float glow_map_strength = 0.8f;
|
||||
Ref<Texture> glow_map;
|
||||
void _update_glow();
|
||||
|
||||
// Fog
|
||||
|
@ -360,6 +362,10 @@ public:
|
|||
float get_glow_hdr_bleed_scale() const;
|
||||
void set_glow_hdr_luminance_cap(float p_amount);
|
||||
float get_glow_hdr_luminance_cap() const;
|
||||
void set_glow_map_strength(float p_strength);
|
||||
float get_glow_map_strength() const;
|
||||
void set_glow_map(Ref<Texture> p_glow_map);
|
||||
Ref<Texture> get_glow_map() const;
|
||||
|
||||
// Fog
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ public:
|
|||
void environment_set_canvas_max_layer(RID p_env, int p_max_layer) override {}
|
||||
void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) override {}
|
||||
|
||||
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) override {}
|
||||
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, float p_glow_map_strength, RID p_glow_map) override {}
|
||||
void environment_glow_set_use_bicubic_upscale(bool p_enable) override {}
|
||||
void environment_glow_set_use_high_quality(bool p_enable) override {}
|
||||
|
||||
|
|
|
@ -115,6 +115,43 @@ RID EffectsRD::_get_uniform_set_from_texture(RID p_texture, bool p_use_mipmaps)
|
|||
return uniform_set;
|
||||
}
|
||||
|
||||
RID EffectsRD::_get_uniform_set_from_texture_pair(RID p_texture1, RID p_texture2, bool p_use_mipmaps) {
|
||||
TexturePair tp;
|
||||
tp.texture1 = p_texture1;
|
||||
tp.texture2 = p_texture2;
|
||||
|
||||
if (texture_pair_to_uniform_set_cache.has(tp)) {
|
||||
RID uniform_set = texture_pair_to_uniform_set_cache[tp];
|
||||
if (RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
|
||||
return uniform_set;
|
||||
}
|
||||
}
|
||||
|
||||
Vector<RD::Uniform> uniforms;
|
||||
{
|
||||
RD::Uniform u;
|
||||
u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
|
||||
u.binding = 0;
|
||||
u.ids.push_back(p_use_mipmaps ? default_mipmap_sampler : default_sampler);
|
||||
u.ids.push_back(p_texture1);
|
||||
uniforms.push_back(u);
|
||||
}
|
||||
{
|
||||
RD::Uniform u;
|
||||
u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;
|
||||
u.binding = 1;
|
||||
u.ids.push_back(p_use_mipmaps ? default_mipmap_sampler : default_sampler);
|
||||
u.ids.push_back(p_texture2);
|
||||
uniforms.push_back(u);
|
||||
}
|
||||
// anything with the same configuration (one texture in binding 0 for set 0), is good
|
||||
RID uniform_set = RD::get_singleton()->uniform_set_create(uniforms, tonemap.shader.version_get_shader(tonemap.shader_version, 0), 2);
|
||||
|
||||
texture_pair_to_uniform_set_cache[tp] = uniform_set;
|
||||
|
||||
return uniform_set;
|
||||
}
|
||||
|
||||
RID EffectsRD::_get_compute_uniform_set_from_texture(RID p_texture, bool p_use_mipmaps) {
|
||||
if (texture_to_compute_uniform_set_cache.has(p_texture)) {
|
||||
RID uniform_set = texture_to_compute_uniform_set_cache[p_texture];
|
||||
|
@ -828,6 +865,7 @@ void EffectsRD::tonemapper(RID p_source_color, RID p_dst_framebuffer, const Tone
|
|||
|
||||
tonemap.push_constant.use_glow = p_settings.use_glow;
|
||||
tonemap.push_constant.glow_intensity = p_settings.glow_intensity;
|
||||
tonemap.push_constant.glow_map_strength = p_settings.glow_map_strength;
|
||||
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];
|
||||
|
@ -867,7 +905,7 @@ void EffectsRD::tonemapper(RID p_source_color, RID p_dst_framebuffer, const Tone
|
|||
RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, tonemap.pipelines[mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dst_framebuffer), false, RD::get_singleton()->draw_list_get_current_pass()));
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_color), 0);
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_settings.exposure_texture), 1);
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_settings.glow_texture, true), 2);
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture_pair(p_settings.glow_texture, p_settings.glow_map, true), 2);
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_settings.color_correction_texture), 3);
|
||||
RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array);
|
||||
|
||||
|
@ -907,7 +945,7 @@ void EffectsRD::tonemapper(RD::DrawListID p_subpass_draw_list, RID p_source_colo
|
|||
RD::get_singleton()->draw_list_bind_render_pipeline(p_subpass_draw_list, tonemap.pipelines[mode].get_render_pipeline(RD::INVALID_ID, p_dst_format_id, false, RD::get_singleton()->draw_list_get_current_pass()));
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(p_subpass_draw_list, _get_uniform_set_for_input(p_source_color), 0);
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(p_subpass_draw_list, _get_uniform_set_from_texture(p_settings.exposure_texture), 1); // should be set to a default texture, it's ignored
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(p_subpass_draw_list, _get_uniform_set_from_texture(p_settings.glow_texture, true), 2); // should be set to a default texture, it's ignored
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(p_subpass_draw_list, _get_uniform_set_from_texture_pair(p_settings.glow_texture, p_settings.glow_map, true), 2); // should be set to a default texture, it's ignored
|
||||
RD::get_singleton()->draw_list_bind_uniform_set(p_subpass_draw_list, _get_uniform_set_from_texture(p_settings.color_correction_texture), 3);
|
||||
|
||||
RD::get_singleton()->draw_list_bind_index_array(p_subpass_draw_list, index_array);
|
||||
|
|
|
@ -274,7 +274,7 @@ private:
|
|||
|
||||
uint32_t glow_texture_size[2]; // 8 - 40
|
||||
float glow_intensity; // 4 - 44
|
||||
uint32_t pad3; // 4 - 48
|
||||
float glow_map_strength; // 4 - 48
|
||||
|
||||
uint32_t glow_mode; // 4 - 52
|
||||
float glow_levels[7]; // 28 - 80
|
||||
|
@ -874,6 +874,7 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
Map<TexturePair, RID> texture_pair_to_uniform_set_cache;
|
||||
Map<RID, RID> texture_to_compute_uniform_set_cache;
|
||||
Map<TexturePair, RID> texture_pair_to_compute_uniform_set_cache;
|
||||
Map<TexturePair, RID> image_pair_to_compute_uniform_set_cache;
|
||||
|
@ -882,6 +883,7 @@ private:
|
|||
RID _get_uniform_set_from_image(RID p_texture);
|
||||
RID _get_uniform_set_for_input(RID p_texture);
|
||||
RID _get_uniform_set_from_texture(RID p_texture, bool p_use_mipmaps = false);
|
||||
RID _get_uniform_set_from_texture_pair(RID p_texture1, RID p_texture2, bool p_use_mipmaps = false);
|
||||
RID _get_compute_uniform_set_from_texture(RID p_texture, bool p_use_mipmaps = false);
|
||||
RID _get_compute_uniform_set_from_texture_and_sampler(RID p_texture, RID p_sampler);
|
||||
RID _get_compute_uniform_set_from_texture_pair(RID p_texture, RID p_texture2, bool p_use_mipmaps = false);
|
||||
|
@ -943,10 +945,12 @@ public:
|
|||
|
||||
GlowMode glow_mode = GLOW_MODE_ADD;
|
||||
float glow_intensity = 1.0;
|
||||
float glow_map_strength = 0.0f;
|
||||
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;
|
||||
RID glow_map;
|
||||
|
||||
RS::EnvironmentToneMapper tonemap_mode = RS::ENV_TONE_MAPPER_LINEAR;
|
||||
float exposure = 1.0;
|
||||
|
|
|
@ -54,7 +54,7 @@ void RendererSceneEnvironmentRD::set_tonemap(RS::EnvironmentToneMapper p_tone_ma
|
|||
auto_exp_scale = p_auto_exp_scale;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_glow(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 RendererSceneEnvironmentRD::set_glow(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, float p_glow_map_strength, RID p_glow_map) {
|
||||
ERR_FAIL_COND_MSG(p_levels.size() != 7, "Size of array of glow levels must be 7");
|
||||
glow_enabled = p_enable;
|
||||
glow_levels = p_levels;
|
||||
|
@ -66,6 +66,8 @@ void RendererSceneEnvironmentRD::set_glow(bool p_enable, Vector<float> p_levels,
|
|||
glow_hdr_bleed_threshold = p_hdr_bleed_threshold;
|
||||
glow_hdr_bleed_scale = p_hdr_bleed_scale;
|
||||
glow_hdr_luminance_cap = p_hdr_luminance_cap;
|
||||
glow_map_strength = p_glow_map_strength;
|
||||
glow_map = p_glow_map;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_sdfgi(bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
|
||||
|
|
|
@ -102,6 +102,8 @@ public:
|
|||
float glow_hdr_bleed_threshold = 1.0;
|
||||
float glow_hdr_luminance_cap = 12.0;
|
||||
float glow_hdr_bleed_scale = 2.0;
|
||||
float glow_map_strength = 0.0f;
|
||||
RID glow_map = RID();
|
||||
|
||||
/// SSAO
|
||||
|
||||
|
@ -154,7 +156,7 @@ public:
|
|||
|
||||
void set_ambient_light(const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source);
|
||||
void set_tonemap(RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale);
|
||||
void set_glow(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 set_glow(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, float p_glow_map_strength, RID p_glow_map);
|
||||
void set_sdfgi(bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias);
|
||||
void set_fog(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);
|
||||
void set_volumetric_fog(bool p_enable, float p_density, const Color &p_scatterin, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject);
|
||||
|
|
|
@ -289,10 +289,10 @@ void RendererSceneRenderRD::environment_set_tonemap(RID p_env, RS::EnvironmentTo
|
|||
env->set_tonemap(p_tone_mapper, p_exposure, p_white, p_auto_exposure, p_min_luminance, p_max_luminance, p_auto_exp_speed, p_auto_exp_scale);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::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 RendererSceneRenderRD::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, float p_glow_map_strength, RID p_glow_map) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->set_glow(p_enable, p_levels, p_intensity, p_strength, p_mix, p_bloom_threshold, p_blend_mode, p_hdr_bleed_threshold, p_hdr_bleed_scale, p_hdr_luminance_cap);
|
||||
env->set_glow(p_enable, p_levels, p_intensity, p_strength, p_mix, p_bloom_threshold, p_blend_mode, p_hdr_bleed_threshold, p_hdr_bleed_scale, p_hdr_luminance_cap, p_glow_map_strength, p_glow_map);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_glow_set_use_bicubic_upscale(bool p_enable) {
|
||||
|
@ -2496,8 +2496,17 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
tonemap.glow_texture_size.y = rb->blur[1].mipmaps[0].height;
|
||||
tonemap.glow_use_bicubic_upscale = glow_bicubic_upscale;
|
||||
tonemap.glow_texture = rb->blur[1].texture;
|
||||
if (env->glow_map.is_valid()) {
|
||||
tonemap.glow_map_strength = env->glow_map_strength;
|
||||
tonemap.glow_map = storage->texture_get_rd_texture(env->glow_map);
|
||||
} else {
|
||||
tonemap.glow_map_strength = 0.0f;
|
||||
tonemap.glow_map = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_WHITE);
|
||||
}
|
||||
|
||||
} else {
|
||||
tonemap.glow_texture = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_BLACK);
|
||||
tonemap.glow_map = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_WHITE);
|
||||
}
|
||||
|
||||
if (rb->screen_space_aa == RS::VIEWPORT_SCREEN_SPACE_AA_FXAA) {
|
||||
|
@ -2590,6 +2599,7 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
|
|||
|
||||
tonemap.use_glow = false;
|
||||
tonemap.glow_texture = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_BLACK);
|
||||
tonemap.glow_map = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_WHITE);
|
||||
tonemap.use_auto_exposure = false;
|
||||
tonemap.exposure_texture = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_WHITE);
|
||||
|
||||
|
|
|
@ -1061,7 +1061,7 @@ public:
|
|||
|
||||
virtual bool is_environment(RID p_env) const override;
|
||||
|
||||
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) override;
|
||||
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, float p_glow_map_strength, RID p_glow_map) override;
|
||||
virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) override;
|
||||
virtual void environment_glow_set_use_high_quality(bool p_enable) override;
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ layout(set = 0, binding = 0) uniform sampler2D source_color;
|
|||
|
||||
layout(set = 1, binding = 0) uniform sampler2D source_auto_exposure;
|
||||
layout(set = 2, binding = 0) uniform sampler2D source_glow;
|
||||
layout(set = 2, binding = 1) uniform sampler2D glow_map;
|
||||
|
||||
#ifdef USE_1D_LUT
|
||||
layout(set = 3, binding = 0) uniform sampler2D source_color_correction;
|
||||
|
@ -63,7 +64,7 @@ layout(push_constant, binding = 1, std430) uniform Params {
|
|||
|
||||
uvec2 glow_texture_size;
|
||||
float glow_intensity;
|
||||
uint pad3;
|
||||
float glow_map_strength;
|
||||
|
||||
uint glow_mode;
|
||||
float glow_levels[7];
|
||||
|
@ -405,6 +406,9 @@ void main() {
|
|||
#ifndef SUBPASS
|
||||
if (params.use_glow && params.glow_mode == GLOW_MODE_MIX) {
|
||||
vec3 glow = gather_glow(source_glow, uv_interp) * params.luminance_multiplier;
|
||||
if (params.glow_map_strength > 0.001) {
|
||||
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
|
||||
}
|
||||
color.rgb = mix(color.rgb, glow, params.glow_intensity);
|
||||
}
|
||||
|
||||
|
@ -425,9 +429,11 @@ void main() {
|
|||
|
||||
#ifndef SUBPASS
|
||||
// Glow
|
||||
|
||||
if (params.use_glow && params.glow_mode != GLOW_MODE_MIX) {
|
||||
vec3 glow = gather_glow(source_glow, uv_interp) * params.glow_intensity * params.luminance_multiplier;
|
||||
if (params.glow_map_strength > 0.001) {
|
||||
glow = mix(glow, texture(glow_map, uv_interp).rgb * glow, params.glow_map_strength);
|
||||
}
|
||||
|
||||
// high dynamic range -> SRGB
|
||||
glow = apply_tonemapping(glow, params.white);
|
||||
|
|
|
@ -131,7 +131,7 @@ public:
|
|||
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer) = 0;
|
||||
virtual void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) = 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_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, float p_glow_map_strength, RID p_glow_map) = 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;
|
||||
|
||||
|
|
|
@ -1113,7 +1113,7 @@ public:
|
|||
PASS6(environment_set_ssil, RID, bool, float, float, float, float)
|
||||
PASS6(environment_set_ssil_quality, RS::EnvironmentSSILQuality, bool, float, int, float, float)
|
||||
|
||||
PASS11(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, RS::EnvironmentGlowBlendMode, float, float, float)
|
||||
PASS13(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, RS::EnvironmentGlowBlendMode, float, float, float, float, RID)
|
||||
PASS1(environment_glow_set_use_bicubic_upscale, bool)
|
||||
PASS1(environment_glow_set_use_high_quality, bool)
|
||||
|
||||
|
|
|
@ -123,7 +123,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, 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_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, float p_glow_map_strength, RID p_glow_map) = 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;
|
||||
|
||||
|
|
|
@ -629,7 +629,7 @@ public:
|
|||
FUNC6(environment_set_ssil, RID, bool, float, float, float, float)
|
||||
FUNC6(environment_set_ssil_quality, EnvironmentSSILQuality, bool, float, int, float, float)
|
||||
|
||||
FUNC11(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, EnvironmentGlowBlendMode, float, float, float)
|
||||
FUNC13(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, EnvironmentGlowBlendMode, float, float, float, float, RID)
|
||||
FUNC1(environment_glow_set_use_bicubic_upscale, bool)
|
||||
FUNC1(environment_glow_set_use_high_quality, bool)
|
||||
|
||||
|
|
|
@ -2317,7 +2317,7 @@ void RenderingServer::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("environment_set_bg_energy", "env", "energy"), &RenderingServer::environment_set_bg_energy);
|
||||
ClassDB::bind_method(D_METHOD("environment_set_canvas_max_layer", "env", "max_layer"), &RenderingServer::environment_set_canvas_max_layer);
|
||||
ClassDB::bind_method(D_METHOD("environment_set_ambient_light", "env", "color", "ambient", "energy", "sky_contibution", "reflection_source"), &RenderingServer::environment_set_ambient_light, DEFVAL(RS::ENV_AMBIENT_SOURCE_BG), DEFVAL(1.0), DEFVAL(0.0), DEFVAL(RS::ENV_REFLECTION_SOURCE_BG));
|
||||
ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "levels", "intensity", "strength", "mix", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "hdr_luminance_cap"), &RenderingServer::environment_set_glow);
|
||||
ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "levels", "intensity", "strength", "mix", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "hdr_luminance_cap", "glow_map_strength", "glow_map"), &RenderingServer::environment_set_glow);
|
||||
ClassDB::bind_method(D_METHOD("environment_set_tonemap", "env", "tone_mapper", "exposure", "white", "auto_exposure", "min_luminance", "max_luminance", "auto_exp_speed", "auto_exp_grey"), &RenderingServer::environment_set_tonemap);
|
||||
ClassDB::bind_method(D_METHOD("environment_set_adjustment", "env", "enable", "brightness", "contrast", "saturation", "use_1d_color_correction", "color_correction"), &RenderingServer::environment_set_adjustment);
|
||||
ClassDB::bind_method(D_METHOD("environment_set_ssr", "env", "enable", "max_steps", "fade_in", "fade_out", "depth_tolerance"), &RenderingServer::environment_set_ssr);
|
||||
|
|
|
@ -991,7 +991,7 @@ public:
|
|||
ENV_GLOW_BLEND_MODE_MIX,
|
||||
};
|
||||
|
||||
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, 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, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) = 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;
|
||||
|
|
Loading…
Reference in New Issue