EEVEE-Next: World: Add shadow options

This adds jitter option and filter option.
This commit is contained in:
Clément Foucault 2024-05-24 18:40:55 +02:00
parent fb85ea535f
commit b96b87a75c
9 changed files with 77 additions and 5 deletions

@ -207,11 +207,23 @@ class EEVEE_WORLD_PT_sun_shadow(WorldButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
world = context.world
layout.use_property_split = True
layout.prop(world, "sun_shadow_maximum_resolution", text="Resolution Limit")
col = layout.column(align=False, heading="Jitter")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(world, "use_sun_shadow_jitter", text="")
sub = sub.row(align=True)
sub.active = world.use_sun_shadow_jitter
sub.prop(world, "sun_shadow_jitter_overblur", text="Overblur")
col.separator()
col = layout.column()
col.prop(world, "sun_shadow_filter_radius", text="Filter")
col.prop(world, "sun_shadow_maximum_resolution", text="Resolution Limit")
class WORLD_PT_viewport_display(WorldButtonsPanel, Panel):

@ -29,7 +29,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 42
#define BLENDER_FILE_SUBVERSION 43
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and cancel loading the file, showing a warning to

@ -3640,6 +3640,14 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 43)) {
const World *default_world = DNA_struct_default_get(World);
LISTBASE_FOREACH (World *, world, &bmain->worlds) {
world->sun_shadow_maximum_resolution = default_world->sun_shadow_maximum_resolution;
world->sun_shadow_filter_radius = default_world->sun_shadow_filter_radius;
}
}
/**
* Always bump subversion in BKE_blender_version.h when adding versioning
* code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check.

@ -353,8 +353,11 @@ void LightModule::begin_sync()
la.r = la.g = la.b = -1.0f; /* Tag as world sun light. */
la.energy = 1.0f;
la.sun_angle = inst_.world.sun_angle();
la.shadow_filter_radius = inst_.world.sun_shadow_filter_radius();
la.shadow_jitter_overblur = inst_.world.sun_shadow_jitter_overblur();
la.shadow_maximum_resolution = inst_.world.sun_shadow_max_resolution();
SET_FLAG_FROM_TEST(la.mode, inst_.world.use_sun_shadow(), LA_SHADOW);
SET_FLAG_FROM_TEST(la.mode, inst_.world.use_sun_shadow_jitter(), LA_SHADOW_JITTER);
Light &light = light_map_.lookup_or_add_default(world_sunlight_key);
light.used = true;

@ -106,11 +106,26 @@ class World {
return scene_world_get()->sun_shadow_maximum_resolution;
}
float sun_shadow_filter_radius()
{
return scene_world_get()->sun_shadow_filter_radius;
}
float sun_shadow_jitter_overblur()
{
return scene_world_get()->sun_shadow_jitter_overblur;
}
bool use_sun_shadow()
{
return scene_world_get()->flag & WO_USE_SUN_SHADOW;
}
bool use_sun_shadow_jitter()
{
return scene_world_get()->flag & WO_USE_SUN_SHADOW_JITTER;
}
private:
void sync_volume();

@ -32,7 +32,10 @@
.probe_resolution = LIGHT_PROBE_RESOLUTION_1024, \
.sun_threshold = 10.0f, \
.sun_angle = DEG2RADF(0.526f), \
\
.sun_shadow_filter_radius = 1.0f, \
.sun_shadow_maximum_resolution = 0.001f, \
.sun_shadow_jitter_overblur = 10.0f, \
}
/** \} */

@ -71,8 +71,10 @@ typedef struct World {
float sun_threshold;
/** Angle for sun extraction. */
float sun_angle;
/** Maximum resolution for extracted sun shadow. */
/** Shadow properties for sun extraction. */
float sun_shadow_maximum_resolution;
float sun_shadow_jitter_overblur;
float sun_shadow_filter_radius;
char _pad4[4];
/** Old animation system, deprecated for 2.5. */
@ -131,6 +133,7 @@ enum {
* Use shadowing from the extracted sun light.
*/
WO_USE_SUN_SHADOW = 1 << 4,
WO_USE_SUN_SHADOW_JITTER = 1 << 5,
};
/** #World::probe_resolution. */

@ -310,7 +310,7 @@ static void rna_def_light_shadow(StructRNA *srna, bool sun)
RNA_def_property_ui_range(prop, 0.0001f, 0.020f, 0.05f, 4);
RNA_def_property_ui_text(prop,
"Shadows Resolution Limit",
"Maximum size of a shadow map pixel. Higher values use less memory at "
"Minimum size of a shadow map pixel. Higher values use less memory at "
"the cost of shadow quality");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_update(prop, 0, "rna_Light_update");

@ -315,6 +315,34 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_update(prop, 0, "rna_World_draw_update");
prop = RNA_def_property(srna, "sun_shadow_filter_radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0f, 5.0f, 1.0f, 2);
RNA_def_property_ui_text(
prop, "Shadow Filter Radius", "Blur shadow aliasing using Percentage Closer Filtering");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_update(prop, 0, "rna_World_draw_update");
prop = RNA_def_property(srna, "use_sun_shadow_jitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "flag", WO_USE_SUN_SHADOW_JITTER);
RNA_def_property_ui_text(
prop,
"Shadow Jitter",
"Enable jittered soft shadows to increase shadow precision (disabled in viewport unless "
"enabled in the render settings). Has a high performance impact");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_update(prop, 0, "rna_World_draw_update");
prop = RNA_def_property(srna, "sun_shadow_jitter_overblur", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_range(prop, 0.0f, 20.0f, 10.0f, 0);
RNA_def_property_ui_text(
prop,
"Shadow Jitter Overblur",
"Apply shadow tracing to each jittered sample to reduce under-sampling artifacts");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_update(prop, 0, "rna_World_draw_update");
rna_def_lighting(brna);
rna_def_world_mist(brna);
}