Cycles: move sss and diffuse transmission into diffuse pass

This simplifies compositors setups and will be consistent with Eevee render
passes from D6331. There's a continuum between these passes and it's not clear
there is much advantage to having them available separately.

Differential Revision: https://developer.blender.org/D6848
This commit is contained in:
Brecht Van Lommel 2020-02-14 12:20:12 +01:00 committed by Brecht Van Lommel
parent e6be2af061
commit e0085bfd24
Notes: blender-bot 2023-02-14 06:46:23 +01:00
Referenced by commit 01162f756a, Fix unreported crash/assert in Cycles with volume render pass in viewport
17 changed files with 52 additions and 210 deletions

View File

@ -245,9 +245,6 @@ def list_render_passes(srl):
if srl.use_pass_transmission_direct: yield ("TransDir", "RGB", 'COLOR')
if srl.use_pass_transmission_indirect: yield ("TransInd", "RGB", 'COLOR')
if srl.use_pass_transmission_color: yield ("TransCol", "RGB", 'COLOR')
if srl.use_pass_subsurface_direct: yield ("SubsurfaceDir", "RGB", 'COLOR')
if srl.use_pass_subsurface_indirect: yield ("SubsurfaceInd", "RGB", 'COLOR')
if srl.use_pass_subsurface_color: yield ("SubsurfaceCol", "RGB", 'COLOR')
if srl.use_pass_emit: yield ("Emit", "RGB", 'COLOR')
if srl.use_pass_environment: yield ("Env", "RGB", 'COLOR')
@ -284,8 +281,7 @@ def list_render_passes(srl):
yield ("Denoising Intensity", "X", 'VALUE')
clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
"denoising_glossy_direct", "denoising_glossy_indirect",
"denoising_transmission_direct", "denoising_transmission_indirect",
"denoising_subsurface_direct", "denoising_subsurface_indirect")
"denoising_transmission_direct", "denoising_transmission_indirect")
if any(getattr(crl, option) for option in clean_options):
yield ("Denoising Clean", "RGB", 'COLOR')

View File

@ -178,10 +178,6 @@ enum_view3d_shading_render_pass= (
('TRANSMISSION_INDIRECT', "Transmission Indirect", "Show the Transmission Indirect render pass", 45),
('TRANSMISSION_COLOR', "Transmission Color", "Show the Transmission Color render pass", 46),
('SUBSURFACE_DIRECT', "Subsurface Direct", "Show the Subsurface Direct render pass", 47),
('SUBSURFACE_INDIRECT', "Subsurface Indirect", "Show the Subsurface Indirect render pass", 48),
('SUBSURFACE_COLOR', "Subsurface Color", "Show the Subsurface Color render pass", 49),
('VOLUME_DIRECT', "Volume Direct", "Show the Volume Direct render pass", 50),
('VOLUME_INDIRECT', "Volume Indirect", "Show the Volume Indirect render pass", 51),
@ -652,7 +648,6 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
('DIFFUSE', "Diffuse", ""),
('GLOSSY', "Glossy", ""),
('TRANSMISSION', "Transmission", ""),
('SUBSURFACE', "Subsurface", ""),
),
)
@ -1346,16 +1341,6 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
description="Denoise the indirect transmission lighting",
default=True,
)
denoising_subsurface_direct: BoolProperty(
name="Subsurface Direct",
description="Denoise the direct subsurface lighting",
default=True,
)
denoising_subsurface_indirect: BoolProperty(
name="Subsurface Indirect",
description="Denoise the indirect subsurface lighting",
default=True,
)
denoising_strength: FloatProperty(
name="Denoising Strength",
description="Controls neighbor pixel weighting for the denoising filter (lower values preserve more detail, but aren't as smooth)",

View File

@ -851,14 +851,6 @@ class CYCLES_RENDER_PT_passes_light(CyclesButtonsPanel, Panel):
row.prop(view_layer, "use_pass_transmission_indirect", text="Indirect", toggle=True)
row.prop(view_layer, "use_pass_transmission_color", text="Color", toggle=True)
split = layout.split(factor=0.35)
split.use_property_split = False
split.label(text="Subsurface")
row = split.row(align=True)
row.prop(view_layer, "use_pass_subsurface_direct", text="Direct", toggle=True)
row.prop(view_layer, "use_pass_subsurface_indirect", text="Indirect", toggle=True)
row.prop(view_layer, "use_pass_subsurface_color", text="Color", toggle=True)
split = layout.split(factor=0.35)
split.use_property_split = False
split.label(text="Volume")
@ -1040,15 +1032,6 @@ class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
split = layout.split(factor=0.5)
split.active = cycles_view_layer.use_denoising or cycles_view_layer.denoising_store_passes
col = split.column()
col.alignment = 'RIGHT'
col.label(text="Subsurface")
row = split.row(align=True)
row.use_property_split = False
row.prop(cycles_view_layer, "denoising_subsurface_direct", text="Direct", toggle=True)
row.prop(cycles_view_layer, "denoising_subsurface_indirect", text="Indirect", toggle=True)
class CYCLES_PT_post_processing(CyclesButtonsPanel, Panel):
bl_label = "Post Processing"
@ -1856,7 +1839,7 @@ class CYCLES_RENDER_PT_bake_influence(CyclesButtonsPanel, Panel):
cscene = scene.cycles
rd = scene.render
if rd.use_bake_multires == False and cscene.bake_type in {
'NORMAL', 'COMBINED', 'DIFFUSE', 'GLOSSY', 'TRANSMISSION', 'SUBSURFACE'}:
'NORMAL', 'COMBINED', 'DIFFUSE', 'GLOSSY', 'TRANSMISSION'}:
return True
def draw(self, context):
@ -1895,7 +1878,7 @@ class CYCLES_RENDER_PT_bake_influence(CyclesButtonsPanel, Panel):
flow.prop(cbk, "use_pass_ambient_occlusion")
flow.prop(cbk, "use_pass_emit")
elif cscene.bake_type in {'DIFFUSE', 'GLOSSY', 'TRANSMISSION', 'SUBSURFACE'}:
elif cscene.bake_type in {'DIFFUSE', 'GLOSSY', 'TRANSMISSION'}:
row = col.row(align=True)
row.use_property_split = False
row.prop(cbk, "use_pass_direct", toggle=True)

View File

@ -42,10 +42,7 @@ def custom_bake_remap(scene):
'GLOSSY_COLOR',
'TRANSMISSION_DIRECT',
'TRANSMISSION_INDIRECT',
'TRANSMISSION_COLOR',
'SUBSURFACE_DIRECT',
'SUBSURFACE_INDIRECT',
'SUBSURFACE_COLOR')
'TRANSMISSION_COLOR')
diffuse_direct_idx = bake_lookup.index('DIFFUSE_DIRECT')

View File

@ -278,8 +278,6 @@ static ShaderEvalType get_shader_type(const string &pass_type)
return SHADER_EVAL_GLOSSY_COLOR;
else if (strcmp(shader_type, "TRANSMISSION_COLOR") == 0)
return SHADER_EVAL_TRANSMISSION_COLOR;
else if (strcmp(shader_type, "SUBSURFACE_COLOR") == 0)
return SHADER_EVAL_SUBSURFACE_COLOR;
else if (strcmp(shader_type, "EMIT") == 0)
return SHADER_EVAL_EMISSION;
@ -296,8 +294,6 @@ static ShaderEvalType get_shader_type(const string &pass_type)
return SHADER_EVAL_GLOSSY;
else if (strcmp(shader_type, "TRANSMISSION") == 0)
return SHADER_EVAL_TRANSMISSION;
else if (strcmp(shader_type, "SUBSURFACE") == 0)
return SHADER_EVAL_SUBSURFACE;
/* extra */
else if (strcmp(shader_type, "ENVIRONMENT") == 0)
@ -640,8 +636,6 @@ static int bake_pass_filter_get(const int pass_filter)
flag |= BAKE_FILTER_GLOSSY;
if ((pass_filter & BL::BakeSettings::pass_filter_TRANSMISSION) != 0)
flag |= BAKE_FILTER_TRANSMISSION;
if ((pass_filter & BL::BakeSettings::pass_filter_SUBSURFACE) != 0)
flag |= BAKE_FILTER_SUBSURFACE;
if ((pass_filter & BL::BakeSettings::pass_filter_EMIT) != 0)
flag |= BAKE_FILTER_EMISSION;

View File

@ -461,19 +461,16 @@ PassType BlenderSync::get_pass_type(BL::RenderPass &b_pass)
MAP_PASS("DiffDir", PASS_DIFFUSE_DIRECT);
MAP_PASS("GlossDir", PASS_GLOSSY_DIRECT);
MAP_PASS("TransDir", PASS_TRANSMISSION_DIRECT);
MAP_PASS("SubsurfaceDir", PASS_SUBSURFACE_DIRECT);
MAP_PASS("VolumeDir", PASS_VOLUME_DIRECT);
MAP_PASS("DiffInd", PASS_DIFFUSE_INDIRECT);
MAP_PASS("GlossInd", PASS_GLOSSY_INDIRECT);
MAP_PASS("TransInd", PASS_TRANSMISSION_INDIRECT);
MAP_PASS("SubsurfaceInd", PASS_SUBSURFACE_INDIRECT);
MAP_PASS("VolumeInd", PASS_VOLUME_INDIRECT);
MAP_PASS("DiffCol", PASS_DIFFUSE_COLOR);
MAP_PASS("GlossCol", PASS_GLOSSY_COLOR);
MAP_PASS("TransCol", PASS_TRANSMISSION_COLOR);
MAP_PASS("SubsurfaceCol", PASS_SUBSURFACE_COLOR);
MAP_PASS("Emit", PASS_EMISSION);
MAP_PASS("Env", PASS_BACKGROUND);
@ -556,8 +553,6 @@ vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLa
MAP_OPTION("denoising_glossy_indirect", DENOISING_CLEAN_GLOSSY_IND);
MAP_OPTION("denoising_transmission_direct", DENOISING_CLEAN_TRANSMISSION_DIR);
MAP_OPTION("denoising_transmission_indirect", DENOISING_CLEAN_TRANSMISSION_IND);
MAP_OPTION("denoising_subsurface_direct", DENOISING_CLEAN_SUBSURFACE_DIR);
MAP_OPTION("denoising_subsurface_indirect", DENOISING_CLEAN_SUBSURFACE_IND);
#undef MAP_OPTION
}
b_engine.add_pass("Noisy Image", 4, "RGBA", b_view_layer.name().c_str());

View File

@ -36,21 +36,18 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval,
eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
eval->transparent = make_float3(0.0f, 0.0f, 0.0f);
eval->subsurface = make_float3(0.0f, 0.0f, 0.0f);
eval->scatter = make_float3(0.0f, 0.0f, 0.0f);
eval->volume = make_float3(0.0f, 0.0f, 0.0f);
if (type == CLOSURE_BSDF_TRANSPARENT_ID)
eval->transparent = value;
else if (CLOSURE_IS_BSDF_DIFFUSE(type))
else if (CLOSURE_IS_BSDF_DIFFUSE(type) || CLOSURE_IS_BSDF_BSSRDF(type))
eval->diffuse = value;
else if (CLOSURE_IS_BSDF_GLOSSY(type))
eval->glossy = value;
else if (CLOSURE_IS_BSDF_TRANSMISSION(type))
eval->transmission = value;
else if (CLOSURE_IS_BSDF_BSSRDF(type))
eval->subsurface = value;
else if (CLOSURE_IS_PHASE(type))
eval->scatter = value;
eval->volume = value;
}
else
#endif
@ -73,16 +70,14 @@ ccl_device_inline void bsdf_eval_accum(BsdfEval *eval,
value *= mis_weight;
#ifdef __PASSES__
if (eval->use_light_pass) {
if (CLOSURE_IS_BSDF_DIFFUSE(type))
if (CLOSURE_IS_BSDF_DIFFUSE(type) || CLOSURE_IS_BSDF_BSSRDF(type))
eval->diffuse += value;
else if (CLOSURE_IS_BSDF_GLOSSY(type))
eval->glossy += value;
else if (CLOSURE_IS_BSDF_TRANSMISSION(type))
eval->transmission += value;
else if (CLOSURE_IS_BSDF_BSSRDF(type))
eval->subsurface += value;
else if (CLOSURE_IS_PHASE(type))
eval->scatter += value;
eval->volume += value;
/* skipping transparent, this function is used by for eval(), will be zero then */
}
@ -98,7 +93,7 @@ ccl_device_inline bool bsdf_eval_is_zero(BsdfEval *eval)
#ifdef __PASSES__
if (eval->use_light_pass) {
return is_zero(eval->diffuse) && is_zero(eval->glossy) && is_zero(eval->transmission) &&
is_zero(eval->transparent) && is_zero(eval->subsurface) && is_zero(eval->scatter);
is_zero(eval->transparent) && is_zero(eval->volume);
}
else
#endif
@ -114,8 +109,7 @@ ccl_device_inline void bsdf_eval_mis(BsdfEval *eval, float value)
eval->diffuse *= value;
eval->glossy *= value;
eval->transmission *= value;
eval->subsurface *= value;
eval->scatter *= value;
eval->volume *= value;
/* skipping transparent, this function is used by for eval(), will be zero then */
}
@ -144,8 +138,7 @@ ccl_device_inline void bsdf_eval_mul3(BsdfEval *eval, float3 value)
eval->diffuse *= value;
eval->glossy *= value;
eval->transmission *= value;
eval->subsurface *= value;
eval->scatter *= value;
eval->volume *= value;
/* skipping transparent, this function is used by for eval(), will be zero then */
}
@ -160,7 +153,7 @@ ccl_device_inline float3 bsdf_eval_sum(const BsdfEval *eval)
{
#ifdef __PASSES__
if (eval->use_light_pass) {
return eval->diffuse + eval->glossy + eval->transmission + eval->subsurface + eval->scatter;
return eval->diffuse + eval->glossy + eval->transmission + eval->volume;
}
else
#endif
@ -187,19 +180,16 @@ ccl_device_inline void path_radiance_init(KernelGlobals *kg, PathRadiance *L)
L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->color_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->color_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->color_subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f);
L->direct_volume = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f);
L->transparent = 0.0f;
L->emission = make_float3(0.0f, 0.0f, 0.0f);
@ -211,8 +201,7 @@ ccl_device_inline void path_radiance_init(KernelGlobals *kg, PathRadiance *L)
L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->state.glossy = make_float3(0.0f, 0.0f, 0.0f);
L->state.transmission = make_float3(0.0f, 0.0f, 0.0f);
L->state.subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->state.scatter = make_float3(0.0f, 0.0f, 0.0f);
L->state.volume = make_float3(0.0f, 0.0f, 0.0f);
L->state.direct = make_float3(0.0f, 0.0f, 0.0f);
}
else
@ -264,11 +253,9 @@ ccl_device_inline void path_radiance_bsdf_bounce(KernelGlobals *kg,
L_state->diffuse = bsdf_eval->diffuse * value;
L_state->glossy = bsdf_eval->glossy * value;
L_state->transmission = bsdf_eval->transmission * value;
L_state->subsurface = bsdf_eval->subsurface * value;
L_state->scatter = bsdf_eval->scatter * value;
L_state->volume = bsdf_eval->volume * value;
*throughput = L_state->diffuse + L_state->glossy + L_state->transmission +
L_state->subsurface + L_state->scatter;
*throughput = L_state->diffuse + L_state->glossy + L_state->transmission + L_state->volume;
L_state->direct = *throughput;
}
@ -449,8 +436,7 @@ ccl_device_inline void path_radiance_accum_light(KernelGlobals *kg,
L->direct_diffuse += shaded_throughput * bsdf_eval->diffuse;
L->direct_glossy += shaded_throughput * bsdf_eval->glossy;
L->direct_transmission += shaded_throughput * bsdf_eval->transmission;
L->direct_subsurface += shaded_throughput * bsdf_eval->subsurface;
L->direct_scatter += shaded_throughput * bsdf_eval->scatter;
L->direct_volume += shaded_throughput * bsdf_eval->volume;
if (is_lamp) {
L->shadow.x += shadow.x * shadow_fac;
@ -562,15 +548,13 @@ ccl_device_inline void path_radiance_sum_indirect(PathRadiance *L)
L->direct_diffuse += L->state.diffuse * L->direct_emission;
L->direct_glossy += L->state.glossy * L->direct_emission;
L->direct_transmission += L->state.transmission * L->direct_emission;
L->direct_subsurface += L->state.subsurface * L->direct_emission;
L->direct_scatter += L->state.scatter * L->direct_emission;
L->direct_volume += L->state.volume * L->direct_emission;
L->indirect = safe_divide_color(L->indirect, L->state.direct);
L->indirect_diffuse += L->state.diffuse * L->indirect;
L->indirect_glossy += L->state.glossy * L->indirect;
L->indirect_transmission += L->state.transmission * L->indirect;
L->indirect_subsurface += L->state.subsurface * L->indirect;
L->indirect_scatter += L->state.scatter * L->indirect;
L->indirect_volume += L->state.volume * L->indirect;
}
#endif
}
@ -582,8 +566,7 @@ ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L)
L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->state.glossy = make_float3(0.0f, 0.0f, 0.0f);
L->state.transmission = make_float3(0.0f, 0.0f, 0.0f);
L->state.subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->state.scatter = make_float3(0.0f, 0.0f, 0.0f);
L->state.volume = make_float3(0.0f, 0.0f, 0.0f);
L->direct_emission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect = make_float3(0.0f, 0.0f, 0.0f);
@ -647,10 +630,10 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg,
if (L->use_light_pass) {
path_radiance_sum_indirect(L);
L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission +
L->direct_subsurface + L->direct_scatter + L->emission;
L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_volume +
L->emission;
L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission +
L->indirect_subsurface + L->indirect_scatter;
L->indirect_volume;
if (!kernel_data.background.transparent)
L_direct += L->background;
@ -666,14 +649,12 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg,
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f);
L->direct_volume = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f);
L->indirect_volume = make_float3(0.0f, 0.0f, 0.0f);
L->emission = make_float3(0.0f, 0.0f, 0.0f);
}
@ -715,7 +696,7 @@ ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg,
kernel_assert(L->use_light_pass);
*clean = L->emission + L->background;
*noisy = L->direct_scatter + L->indirect_scatter;
*noisy = L->direct_volume + L->indirect_volume;
# define ADD_COMPONENT(flag, component) \
if (kernel_data.film.denoising_flags & flag) \
@ -729,8 +710,6 @@ ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg,
ADD_COMPONENT(DENOISING_CLEAN_GLOSSY_IND, L->indirect_glossy);
ADD_COMPONENT(DENOISING_CLEAN_TRANSMISSION_DIR, L->direct_transmission);
ADD_COMPONENT(DENOISING_CLEAN_TRANSMISSION_IND, L->indirect_transmission);
ADD_COMPONENT(DENOISING_CLEAN_SUBSURFACE_DIR, L->direct_subsurface);
ADD_COMPONENT(DENOISING_CLEAN_SUBSURFACE_IND, L->indirect_subsurface);
# undef ADD_COMPONENT
#else
*noisy = L->emission;
@ -767,14 +746,12 @@ ccl_device_inline void path_radiance_accum_sample(PathRadiance *L, PathRadiance
safe_float3_add(L->direct_diffuse, L_sample->direct_diffuse);
safe_float3_add(L->direct_glossy, L_sample->direct_glossy);
safe_float3_add(L->direct_transmission, L_sample->direct_transmission);
safe_float3_add(L->direct_subsurface, L_sample->direct_subsurface);
safe_float3_add(L->direct_scatter, L_sample->direct_scatter);
safe_float3_add(L->direct_volume, L_sample->direct_volume);
safe_float3_add(L->indirect_diffuse, L_sample->indirect_diffuse);
safe_float3_add(L->indirect_glossy, L_sample->indirect_glossy);
safe_float3_add(L->indirect_transmission, L_sample->indirect_transmission);
safe_float3_add(L->indirect_subsurface, L_sample->indirect_subsurface);
safe_float3_add(L->indirect_scatter, L_sample->indirect_scatter);
safe_float3_add(L->indirect_volume, L_sample->indirect_volume);
safe_float3_add(L->background, L_sample->background);
safe_float3_add(L->ao, L_sample->ao);

View File

@ -71,7 +71,7 @@ ccl_device_inline void compute_light_pass(
# ifdef __SUBSURFACE__
/* sample subsurface scattering */
if ((pass_filter & BAKE_FILTER_SUBSURFACE) && (sd->flag & SD_BSSRDF)) {
if ((pass_filter & BAKE_FILTER_DIFFUSE) && (sd->flag & SD_BSSRDF)) {
/* When mixing BSSRDF and BSDF closures we should skip BSDF lighting
* if scattering was successful. */
SubsurfaceIndirectRays ss_indirect;
@ -123,7 +123,7 @@ ccl_device_inline void compute_light_pass(
# ifdef __SUBSURFACE__
/* sample subsurface scattering */
if ((pass_filter & BAKE_FILTER_SUBSURFACE) && (sd->flag & SD_BSSRDF)) {
if ((pass_filter & BAKE_FILTER_DIFFUSE) && (sd->flag & SD_BSSRDF)) {
/* When mixing BSSRDF and BSDF closures we should skip BSDF lighting
* if scattering was successful. */
kernel_branched_path_subsurface_scatter(
@ -178,10 +178,6 @@ ccl_device_inline float3 kernel_bake_shader_bsdf(KernelGlobals *kg,
return shader_bsdf_glossy(kg, sd);
case SHADER_EVAL_TRANSMISSION:
return shader_bsdf_transmission(kg, sd);
# ifdef __SUBSURFACE__
case SHADER_EVAL_SUBSURFACE:
return shader_bsdf_subsurface(kg, sd);
# endif
default:
kernel_assert(!"Unknown bake type passed to BSDF evaluate");
return make_float3(0.0f, 0.0f, 0.0f);
@ -385,11 +381,6 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg,
if ((pass_filter & BAKE_FILTER_TRANSMISSION_INDIRECT) == BAKE_FILTER_TRANSMISSION_INDIRECT)
out += L.indirect_transmission;
if ((pass_filter & BAKE_FILTER_SUBSURFACE_DIRECT) == BAKE_FILTER_SUBSURFACE_DIRECT)
out += L.direct_subsurface;
if ((pass_filter & BAKE_FILTER_SUBSURFACE_INDIRECT) == BAKE_FILTER_SUBSURFACE_INDIRECT)
out += L.indirect_subsurface;
if ((pass_filter & BAKE_FILTER_EMISSION) != 0)
out += L.emission;
@ -414,13 +405,6 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg,
kg, &sd, &state, L.direct_transmission, L.indirect_transmission, type, pass_filter);
break;
}
case SHADER_EVAL_SUBSURFACE: {
# ifdef __SUBSURFACE__
out = kernel_bake_evaluate_direct_indirect(
kg, &sd, &state, L.direct_subsurface, L.indirect_subsurface, type, pass_filter);
# endif
break;
}
# endif
/* extra */

View File

@ -145,16 +145,14 @@ ccl_device_noinline_cpu bool direct_emission(KernelGlobals *kg,
#ifdef __PASSES__
/* use visibility flag to skip lights */
if (ls->shader & SHADER_EXCLUDE_ANY) {
if (ls->shader & SHADER_EXCLUDE_DIFFUSE) {
if (ls->shader & SHADER_EXCLUDE_DIFFUSE)
eval->diffuse = make_float3(0.0f, 0.0f, 0.0f);
eval->subsurface = make_float3(0.0f, 0.0f, 0.0f);
}
if (ls->shader & SHADER_EXCLUDE_GLOSSY)
eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
if (ls->shader & SHADER_EXCLUDE_TRANSMIT)
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
if (ls->shader & SHADER_EXCLUDE_SCATTER)
eval->scatter = make_float3(0.0f, 0.0f, 0.0f);
eval->volume = make_float3(0.0f, 0.0f, 0.0f);
}
#endif

View File

@ -249,8 +249,6 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg,
L->color_glossy += shader_bsdf_glossy(kg, sd) * throughput;
if (light_flag & PASSMASK_COMPONENT(TRANSMISSION))
L->color_transmission += shader_bsdf_transmission(kg, sd) * throughput;
if (light_flag & PASSMASK_COMPONENT(SUBSURFACE))
L->color_subsurface += shader_bsdf_subsurface(kg, sd) * throughput;
if (light_flag & PASSMASK(MIST)) {
/* bring depth into 0..1 range */
@ -296,11 +294,8 @@ ccl_device_inline void kernel_write_light_passes(KernelGlobals *kg,
if (light_flag & PASSMASK(TRANSMISSION_INDIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_indirect,
L->indirect_transmission);
if (light_flag & PASSMASK(SUBSURFACE_INDIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_subsurface_indirect,
L->indirect_subsurface);
if (light_flag & PASSMASK(VOLUME_INDIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_volume_indirect, L->indirect_scatter);
kernel_write_pass_float3(buffer + kernel_data.film.pass_volume_indirect, L->indirect_volume);
if (light_flag & PASSMASK(DIFFUSE_DIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_diffuse_direct, L->direct_diffuse);
if (light_flag & PASSMASK(GLOSSY_DIRECT))
@ -308,11 +303,8 @@ ccl_device_inline void kernel_write_light_passes(KernelGlobals *kg,
if (light_flag & PASSMASK(TRANSMISSION_DIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_direct,
L->direct_transmission);
if (light_flag & PASSMASK(SUBSURFACE_DIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_subsurface_direct,
L->direct_subsurface);
if (light_flag & PASSMASK(VOLUME_DIRECT))
kernel_write_pass_float3(buffer + kernel_data.film.pass_volume_direct, L->direct_scatter);
kernel_write_pass_float3(buffer + kernel_data.film.pass_volume_direct, L->direct_volume);
if (light_flag & PASSMASK(EMISSION))
kernel_write_pass_float3(buffer + kernel_data.film.pass_emission, L->emission);
@ -328,8 +320,6 @@ ccl_device_inline void kernel_write_light_passes(KernelGlobals *kg,
if (light_flag & PASSMASK(TRANSMISSION_COLOR))
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_color,
L->color_transmission);
if (light_flag & PASSMASK(SUBSURFACE_COLOR))
kernel_write_pass_float3(buffer + kernel_data.film.pass_subsurface_color, L->color_subsurface);
if (light_flag & PASSMASK(SHADOW)) {
float4 shadow = L->shadow;
shadow.w = kernel_data.film.pass_shadow_scale;

View File

@ -901,7 +901,8 @@ ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd)
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
if (CLOSURE_IS_BSDF_DIFFUSE(sc->type))
if (CLOSURE_IS_BSDF_DIFFUSE(sc->type) || CLOSURE_IS_BSSRDF(sc->type) ||
CLOSURE_IS_BSDF_BSSRDF(sc->type))
eval += sc->weight;
}
@ -936,20 +937,6 @@ ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd)
return eval;
}
ccl_device float3 shader_bsdf_subsurface(KernelGlobals *kg, ShaderData *sd)
{
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
for (int i = 0; i < sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
if (CLOSURE_IS_BSSRDF(sc->type) || CLOSURE_IS_BSDF_BSSRDF(sc->type))
eval += sc->weight;
}
return eval;
}
ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd)
{
float3 N = make_float3(0.0f, 0.0f, 0.0f);

View File

@ -220,7 +220,6 @@ typedef enum ShaderEvalType {
SHADER_EVAL_DIFFUSE_COLOR,
SHADER_EVAL_GLOSSY_COLOR,
SHADER_EVAL_TRANSMISSION_COLOR,
SHADER_EVAL_SUBSURFACE_COLOR,
SHADER_EVAL_EMISSION,
SHADER_EVAL_AOV_COLOR,
SHADER_EVAL_AOV_VALUE,
@ -232,7 +231,6 @@ typedef enum ShaderEvalType {
SHADER_EVAL_DIFFUSE,
SHADER_EVAL_GLOSSY,
SHADER_EVAL_TRANSMISSION,
SHADER_EVAL_SUBSURFACE,
/* extra */
SHADER_EVAL_ENVIRONMENT,
@ -392,9 +390,6 @@ typedef enum PassType {
PASS_TRANSMISSION_DIRECT,
PASS_TRANSMISSION_INDIRECT,
PASS_TRANSMISSION_COLOR,
PASS_SUBSURFACE_DIRECT,
PASS_SUBSURFACE_INDIRECT,
PASS_SUBSURFACE_COLOR,
PASS_VOLUME_DIRECT,
PASS_VOLUME_INDIRECT,
/* No Scatter color since it's tricky to define what it would even mean. */
@ -445,23 +440,20 @@ typedef enum eBakePassFilter {
BAKE_FILTER_DIFFUSE = (1 << 3),
BAKE_FILTER_GLOSSY = (1 << 4),
BAKE_FILTER_TRANSMISSION = (1 << 5),
BAKE_FILTER_SUBSURFACE = (1 << 6),
BAKE_FILTER_EMISSION = (1 << 7),
BAKE_FILTER_AO = (1 << 8),
BAKE_FILTER_EMISSION = (1 << 6),
BAKE_FILTER_AO = (1 << 7),
} eBakePassFilter;
typedef enum BakePassFilterCombos {
BAKE_FILTER_COMBINED = (BAKE_FILTER_DIRECT | BAKE_FILTER_INDIRECT | BAKE_FILTER_DIFFUSE |
BAKE_FILTER_GLOSSY | BAKE_FILTER_TRANSMISSION | BAKE_FILTER_SUBSURFACE |
BAKE_FILTER_EMISSION | BAKE_FILTER_AO),
BAKE_FILTER_GLOSSY | BAKE_FILTER_TRANSMISSION | BAKE_FILTER_EMISSION |
BAKE_FILTER_AO),
BAKE_FILTER_DIFFUSE_DIRECT = (BAKE_FILTER_DIRECT | BAKE_FILTER_DIFFUSE),
BAKE_FILTER_GLOSSY_DIRECT = (BAKE_FILTER_DIRECT | BAKE_FILTER_GLOSSY),
BAKE_FILTER_TRANSMISSION_DIRECT = (BAKE_FILTER_DIRECT | BAKE_FILTER_TRANSMISSION),
BAKE_FILTER_SUBSURFACE_DIRECT = (BAKE_FILTER_DIRECT | BAKE_FILTER_SUBSURFACE),
BAKE_FILTER_DIFFUSE_INDIRECT = (BAKE_FILTER_INDIRECT | BAKE_FILTER_DIFFUSE),
BAKE_FILTER_GLOSSY_INDIRECT = (BAKE_FILTER_INDIRECT | BAKE_FILTER_GLOSSY),
BAKE_FILTER_TRANSMISSION_INDIRECT = (BAKE_FILTER_INDIRECT | BAKE_FILTER_TRANSMISSION),
BAKE_FILTER_SUBSURFACE_INDIRECT = (BAKE_FILTER_INDIRECT | BAKE_FILTER_SUBSURFACE),
} BakePassFilterCombos;
typedef enum DenoiseFlag {
@ -471,9 +463,7 @@ typedef enum DenoiseFlag {
DENOISING_CLEAN_GLOSSY_IND = (1 << 3),
DENOISING_CLEAN_TRANSMISSION_DIR = (1 << 4),
DENOISING_CLEAN_TRANSMISSION_IND = (1 << 5),
DENOISING_CLEAN_SUBSURFACE_DIR = (1 << 6),
DENOISING_CLEAN_SUBSURFACE_IND = (1 << 7),
DENOISING_CLEAN_ALL_PASSES = (1 << 8) - 1,
DENOISING_CLEAN_ALL_PASSES = (1 << 6) - 1,
} DenoiseFlag;
#ifdef __KERNEL_DEBUG__
@ -493,8 +483,7 @@ typedef ccl_addr_space struct PathRadianceState {
float3 diffuse;
float3 glossy;
float3 transmission;
float3 subsurface;
float3 scatter;
float3 volume;
float3 direct;
#endif
@ -517,19 +506,16 @@ typedef ccl_addr_space struct PathRadiance {
float3 color_diffuse;
float3 color_glossy;
float3 color_transmission;
float3 color_subsurface;
float3 direct_diffuse;
float3 direct_glossy;
float3 direct_transmission;
float3 direct_subsurface;
float3 direct_scatter;
float3 direct_volume;
float3 indirect_diffuse;
float3 indirect_glossy;
float3 indirect_transmission;
float3 indirect_subsurface;
float3 indirect_scatter;
float3 indirect_volume;
float4 shadow;
float mist;
@ -583,8 +569,7 @@ typedef struct BsdfEval {
float3 glossy;
float3 transmission;
float3 transparent;
float3 subsurface;
float3 scatter;
float3 volume;
#endif
#ifdef __SHADOW_TRICKS__
float3 sum_no_mis;
@ -1214,18 +1199,15 @@ typedef struct KernelFilm {
int pass_diffuse_color;
int pass_glossy_color;
int pass_transmission_color;
int pass_subsurface_color;
int pass_diffuse_indirect;
int pass_glossy_indirect;
int pass_transmission_indirect;
int pass_subsurface_indirect;
int pass_volume_indirect;
int pass_diffuse_direct;
int pass_glossy_direct;
int pass_transmission_direct;
int pass_subsurface_direct;
int pass_volume_direct;
int pass_emission;
@ -1252,7 +1234,6 @@ typedef struct KernelFilm {
int pass_aov_color;
int pass_aov_value;
int pad1;
int pad2;
/* XYZ to rendering color space transform. float4 instead of float3 to
* ensure consistent padding/alignment across devices. */

View File

@ -527,6 +527,7 @@ typedef enum ClosureType {
CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID,
CLOSURE_BSDF_PRINCIPLED_SHEEN_ID,
CLOSURE_BSDF_DIFFUSE_TOON_ID,
CLOSURE_BSDF_TRANSLUCENT_ID,
/* Glossy */
CLOSURE_BSDF_REFLECTION_ID,
@ -549,7 +550,6 @@ typedef enum ClosureType {
CLOSURE_BSDF_HAIR_REFLECTION_ID,
/* Transmission */
CLOSURE_BSDF_TRANSLUCENT_ID,
CLOSURE_BSDF_REFRACTION_ID,
CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID,
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID,
@ -590,12 +590,12 @@ typedef enum ClosureType {
/* watch this, being lazy with memory usage */
#define CLOSURE_IS_BSDF(type) (type <= CLOSURE_BSDF_TRANSPARENT_ID)
#define CLOSURE_IS_BSDF_DIFFUSE(type) \
(type >= CLOSURE_BSDF_DIFFUSE_ID && type <= CLOSURE_BSDF_DIFFUSE_TOON_ID)
(type >= CLOSURE_BSDF_DIFFUSE_ID && type <= CLOSURE_BSDF_TRANSLUCENT_ID)
#define CLOSURE_IS_BSDF_GLOSSY(type) \
((type >= CLOSURE_BSDF_REFLECTION_ID && type <= CLOSURE_BSDF_HAIR_REFLECTION_ID) || \
(type == CLOSURE_BSDF_HAIR_PRINCIPLED_ID))
#define CLOSURE_IS_BSDF_TRANSMISSION(type) \
(type >= CLOSURE_BSDF_TRANSLUCENT_ID && type <= CLOSURE_BSDF_HAIR_TRANSMISSION_ID)
(type >= CLOSURE_BSDF_REFRACTION_ID && type <= CLOSURE_BSDF_HAIR_TRANSMISSION_ID)
#define CLOSURE_IS_BSDF_BSSRDF(type) \
(type == CLOSURE_BSDF_BSSRDF_ID || type == CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID)
#define CLOSURE_IS_BSDF_SINGULAR(type) \

View File

@ -285,8 +285,6 @@ int BakeManager::shader_type_to_pass_filter(ShaderEvalType type, const int pass_
return BAKE_FILTER_GLOSSY | component_flags;
case SHADER_EVAL_TRANSMISSION:
return BAKE_FILTER_TRANSMISSION | component_flags;
case SHADER_EVAL_SUBSURFACE:
return BAKE_FILTER_SUBSURFACE | component_flags;
case SHADER_EVAL_COMBINED:
return pass_filter;
default:

View File

@ -155,7 +155,6 @@ void Pass::add(PassType type, vector<Pass> &passes, const char *name)
case PASS_DIFFUSE_COLOR:
case PASS_GLOSSY_COLOR:
case PASS_TRANSMISSION_COLOR:
case PASS_SUBSURFACE_COLOR:
pass.components = 4;
break;
case PASS_DIFFUSE_DIRECT:
@ -176,12 +175,6 @@ void Pass::add(PassType type, vector<Pass> &passes, const char *name)
pass.exposure = true;
pass.divide_type = PASS_TRANSMISSION_COLOR;
break;
case PASS_SUBSURFACE_DIRECT:
case PASS_SUBSURFACE_INDIRECT:
pass.components = 4;
pass.exposure = true;
pass.divide_type = PASS_SUBSURFACE_COLOR;
break;
case PASS_VOLUME_DIRECT:
case PASS_VOLUME_INDIRECT:
pass.components = 4;
@ -442,9 +435,6 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
case PASS_TRANSMISSION_COLOR:
kfilm->pass_transmission_color = kfilm->pass_stride;
break;
case PASS_SUBSURFACE_COLOR:
kfilm->pass_subsurface_color = kfilm->pass_stride;
break;
case PASS_DIFFUSE_INDIRECT:
kfilm->pass_diffuse_indirect = kfilm->pass_stride;
break;
@ -454,9 +444,6 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
case PASS_TRANSMISSION_INDIRECT:
kfilm->pass_transmission_indirect = kfilm->pass_stride;
break;
case PASS_SUBSURFACE_INDIRECT:
kfilm->pass_subsurface_indirect = kfilm->pass_stride;
break;
case PASS_VOLUME_INDIRECT:
kfilm->pass_volume_indirect = kfilm->pass_stride;
break;
@ -469,9 +456,6 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
case PASS_TRANSMISSION_DIRECT:
kfilm->pass_transmission_direct = kfilm->pass_stride;
break;
case PASS_SUBSURFACE_DIRECT:
kfilm->pass_subsurface_direct = kfilm->pass_stride;
break;
case PASS_VOLUME_DIRECT:
kfilm->pass_volume_direct = kfilm->pass_stride;
break;
@ -521,7 +505,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
kfilm->use_display_exposure = pass.exposure && (kfilm->exposure != 1.0f);
}
else if (pass.type == PASS_DIFFUSE_COLOR || pass.type == PASS_TRANSMISSION_COLOR ||
pass.type == PASS_GLOSSY_COLOR || pass.type == PASS_SUBSURFACE_COLOR) {
pass.type == PASS_GLOSSY_COLOR) {
kfilm->display_divide_pass_stride = kfilm->pass_stride;
}

View File

@ -86,7 +86,6 @@ const EnumPropertyItem rna_enum_bake_pass_type_items[] = {
{SCE_PASS_DIFFUSE_COLOR, "DIFFUSE", 0, "Diffuse", ""},
{SCE_PASS_GLOSSY_COLOR, "GLOSSY", 0, "Glossy", ""},
{SCE_PASS_TRANSM_COLOR, "TRANSMISSION", 0, "Transmission", ""},
{SCE_PASS_SUBSURFACE_COLOR, "SUBSURFACE", 0, "Subsurface", ""},
{0, NULL, 0, NULL, NULL},
};
@ -533,7 +532,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
0,
INT_MAX,
"Pass Filter",
"Filter to combined, diffuse, glossy, transmission and subsurface passes",
"Filter to combined, diffuse, glossy and transmission passes",
0,
INT_MAX);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);

View File

@ -526,7 +526,6 @@ const EnumPropertyItem rna_enum_bake_pass_filter_type_items[] = {
{R_BAKE_PASS_FILTER_DIFFUSE, "DIFFUSE", 0, "Diffuse", ""},
{R_BAKE_PASS_FILTER_GLOSSY, "GLOSSY", 0, "Glossy", ""},
{R_BAKE_PASS_FILTER_TRANSM, "TRANSMISSION", 0, "Transmission", ""},
{R_BAKE_PASS_FILTER_SUBSURFACE, "SUBSURFACE", 0, "Subsurface", ""},
{0, NULL, 0, NULL, NULL},
};
@ -4870,11 +4869,6 @@ static void rna_def_bake_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Transmission", "Add transmission contribution");
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
prop = RNA_def_property(srna, "use_pass_subsurface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pass_filter", R_BAKE_PASS_FILTER_SUBSURFACE);
RNA_def_property_ui_text(prop, "Subsurface", "Add subsurface contribution");
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
prop = RNA_def_property(srna, "pass_filter", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "pass_filter");
RNA_def_property_enum_items(prop, rna_enum_bake_pass_filter_type_items);