EEVEE-Next: Add tracing options for diffuse rays

Also fixes diffuse surface always tracing
even when tracing is off.
This commit is contained in:
Clément Foucault 2023-09-26 23:45:40 +02:00
parent 3a4fc2c94e
commit f966205022
8 changed files with 53 additions and 5 deletions

@ -652,7 +652,7 @@ class RENDER_PT_eevee_next_raytracing_reflection(EeveeRaytracingOptionsPanel):
def draw_header(self, context):
layout = self.layout
if context.scene.eevee.ray_split_settings == 'UNIFIED':
layout.label(text="Reflection & Refraction")
layout.label(text="Reflection & Refraction & Diffuse")
else:
layout.label(text="Reflection")
@ -706,6 +706,35 @@ class RENDER_PT_eevee_next_denoise_refraction(EeveeRaytracingDenoisePanel):
self.draw_internal(context.scene.eevee.refraction_options)
class RENDER_PT_eevee_next_raytracing_diffuse(EeveeRaytracingOptionsPanel):
bl_label = "Diffuse"
bl_parent_id = "RENDER_PT_eevee_next_raytracing"
@classmethod
def poll(cls, context):
return (context.scene.eevee.ray_split_settings == 'SPLIT')
def draw(self, context):
self.draw_internal(context, context.scene.eevee.diffuse_options)
class RENDER_PT_eevee_next_screen_trace_diffuse(EeveeRaytracingScreenOption):
bl_parent_id = "RENDER_PT_eevee_next_raytracing_diffuse"
def draw(self, context):
self.draw_internal(context.scene.eevee.diffuse_options)
class RENDER_PT_eevee_next_denoise_diffuse(EeveeRaytracingDenoisePanel):
bl_parent_id = "RENDER_PT_eevee_next_raytracing_diffuse"
def draw_header(self, context):
self.draw_header_internal(context.scene.eevee.diffuse_options)
def draw(self, context):
self.draw_internal(context.scene.eevee.diffuse_options)
class RENDER_PT_eevee_shadows(RenderButtonsPanel, Panel):
bl_label = "Shadows"
bl_options = {'DEFAULT_CLOSED'}
@ -1240,10 +1269,13 @@ classes = (
RENDER_PT_eevee_next_raytracing,
RENDER_PT_eevee_next_raytracing_reflection,
RENDER_PT_eevee_next_raytracing_refraction,
RENDER_PT_eevee_next_raytracing_diffuse,
RENDER_PT_eevee_next_screen_trace_reflection,
RENDER_PT_eevee_next_screen_trace_refraction,
RENDER_PT_eevee_next_screen_trace_diffuse,
RENDER_PT_eevee_next_denoise_reflection,
RENDER_PT_eevee_next_denoise_refraction,
RENDER_PT_eevee_next_denoise_diffuse,
RENDER_PT_eevee_motion_blur,
RENDER_PT_eevee_next_motion_blur,
RENDER_PT_motion_blur_curve,

@ -1510,5 +1510,12 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
light->shadow_trace_distance = default_light.shadow_trace_distance;
}
}
if (!DNA_struct_member_exists(fd->filesdna, "SceneEEVEE", "RaytraceEEVEE", "diffuse_options"))
{
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
scene->eevee.diffuse_options = scene->eevee.reflection_options;
}
}
}
}

@ -30,10 +30,12 @@ void RayTraceModule::init()
reflection_options_ = sce_eevee.reflection_options;
refraction_options_ = sce_eevee.refraction_options;
diffuse_options_ = sce_eevee.diffuse_options;
tracing_method_ = RaytraceEEVEE_Method(sce_eevee.ray_tracing_method);
if (sce_eevee.ray_split_settings == 0) {
refraction_options_ = reflection_options_;
diffuse_options_ = reflection_options_;
}
}
@ -218,9 +220,9 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer,
RayTraceBuffer::DenoiseBuffer *denoise_buf = nullptr;
if (raytrace_closure == CLOSURE_DIFFUSE) {
options = reflection_options_;
options = diffuse_options_;
generate_ray_ps = &generate_diffuse_ps_;
trace_ray_ps = force_no_tracing ? &trace_diffuse_ps_ : &trace_diffuse_ps_;
trace_ray_ps = force_no_tracing ? &trace_fallback_ps_ : &trace_diffuse_ps_;
denoise_spatial_ps = &denoise_spatial_diffuse_ps_;
denoise_bilateral_ps = &denoise_bilateral_diffuse_ps_;
denoise_buf = &rt_buffer.diffuse;

@ -164,6 +164,7 @@ class RayTraceModule {
/** Copy of the scene options to avoid changing parameters during motion blur. */
RaytraceEEVEE reflection_options_;
RaytraceEEVEE refraction_options_;
RaytraceEEVEE diffuse_options_;
RaytraceEEVEE_Method tracing_method_ = RAYTRACE_EEVEE_METHOD_NONE;

@ -18,7 +18,7 @@
/* Could maybe become parameters. */
#define RAY_BIAS_REFLECTION 0.02
#define RAY_BIAS_REFRACTION 0.02
#define RAY_BIAS_DIFFUSE 0.02
#define RAY_BIAS_DIFFUSE 0.05
/* Returns view-space ray. */
vec3 ray_generate_direction(vec2 noise, ClosureReflection reflection, vec3 V, out float pdf)
@ -68,6 +68,5 @@ vec3 ray_generate_direction(vec2 noise, ClosureDiffuse diffuse, vec3 V, out floa
vec3 T, B, N = diffuse.N;
make_orthonormal_basis(N, T, B);
return sample_cosine_hemisphere(Xi, N, T, B, pdf);
}

@ -238,6 +238,7 @@
\
.reflection_options = _DNA_DEFAULT_RaytraceEEVEE, \
.refraction_options = _DNA_DEFAULT_RaytraceEEVEE, \
.diffuse_options = _DNA_DEFAULT_RaytraceEEVEE, \
\
.light_cache_data = NULL, \
.light_threshold = 0.01f, \

@ -1895,6 +1895,7 @@ typedef struct SceneEEVEE {
struct RaytraceEEVEE reflection_options;
struct RaytraceEEVEE refraction_options;
struct RaytraceEEVEE diffuse_options;
struct LightCache *light_cache DNA_DEPRECATED;
struct LightCache *light_cache_data;

@ -8120,6 +8120,11 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "RaytraceEEVEE");
RNA_def_property_ui_text(
prop, "Refraction Trace Options", "EEVEE settings for tracing refractions");
prop = RNA_def_property(srna, "diffuse_options", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "RaytraceEEVEE");
RNA_def_property_ui_text(
prop, "Diffuse Trace Options", "EEVEE settings for tracing diffuse reflections");
}
static void rna_def_scene_gpencil(BlenderRNA *brna)