Merge branch 'blender-v4.0-release'
This commit is contained in:
commit
d15013b583
@ -36,7 +36,18 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
normal Tangent = normalize(dPdu),
|
||||
output closure color BSDF = 0)
|
||||
{
|
||||
float CLOSURE_WEIGHT_CUTOFF = 1e-5;
|
||||
|
||||
/* Clamping to match SVM */
|
||||
float metallic = clamp(Metallic, 0.0, 1.0);
|
||||
float transmission = clamp(TransmissionWeight, 0.0, 1.0);
|
||||
float subsurface_weight = clamp(SubsurfaceWeight, 0.0, 1.0);
|
||||
color specular_tint = max(SpecularTint, color(0.0));
|
||||
float coat_weight = max(CoatWeight, 0.0);
|
||||
color coat_tint = max(CoatTint, color(0.0));
|
||||
float sheen_weight = max(SheenWeight, 0.0);
|
||||
color base_color = max(BaseColor, color(0.0));
|
||||
color clamped_base_color = min(base_color, color(1.0));
|
||||
|
||||
float r2 = clamp(Roughness, 0.0, 1.0);
|
||||
r2 = r2 * r2;
|
||||
@ -53,8 +64,8 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
T = rotate(T, AnisotropicRotation * M_2PI, point(0.0, 0.0, 0.0), Normal);
|
||||
}
|
||||
|
||||
if (Metallic < 1.0 && TransmissionWeight < 1.0) {
|
||||
float eta = IOR;
|
||||
if (metallic < 1.0 && TransmissionWeight < 1.0) {
|
||||
float eta = max(IOR, 1e-5);
|
||||
float f0 = F0_from_ior(eta);
|
||||
if (SpecularIORLevel != 0.5) {
|
||||
f0 *= 2.0 * max(SpecularIORLevel, 0.0);
|
||||
@ -64,22 +75,21 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
}
|
||||
}
|
||||
|
||||
BSDF = BaseColor * diffuse(Normal);
|
||||
if (SubsurfaceWeight > 1e-5) {
|
||||
float subsurface_weight = min(SubsurfaceWeight, 1.0);
|
||||
vector radius = SubsurfaceScale * SubsurfaceRadius;
|
||||
BSDF = base_color * diffuse(Normal);
|
||||
if (subsurface_weight > CLOSURE_WEIGHT_CUTOFF) {
|
||||
vector radius = max(SubsurfaceScale * SubsurfaceRadius, vector(0.0));
|
||||
float subsurface_ior = (subsurface_method == "random_walk_skin") ? SubsurfaceIOR : eta;
|
||||
closure color SubsurfBSDF = bssrdf(subsurface_method,
|
||||
Normal,
|
||||
SubsurfaceScale * SubsurfaceRadius,
|
||||
BaseColor,
|
||||
radius,
|
||||
clamped_base_color,
|
||||
"roughness",
|
||||
r2,
|
||||
"ior",
|
||||
subsurface_ior,
|
||||
"anisotropy",
|
||||
SubsurfaceAnisotropy);
|
||||
BSDF = mix(BSDF, BaseColor * SubsurfBSDF, subsurface_weight);
|
||||
BSDF = mix(BSDF, clamped_base_color * SubsurfBSDF, subsurface_weight);
|
||||
}
|
||||
|
||||
if (eta != 1.0) {
|
||||
@ -95,38 +105,45 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
}
|
||||
|
||||
closure color TransmissionBSDF = 0;
|
||||
if (Metallic < 1.0 && TransmissionWeight > 0.0) {
|
||||
if (metallic < 1.0 && TransmissionWeight > CLOSURE_WEIGHT_CUTOFF) {
|
||||
float eta = max(IOR, 1e-5);
|
||||
eta = backfacing() ? 1.0 / eta : eta;
|
||||
|
||||
color F0 = F0_from_ior(eta) * specular_tint;
|
||||
color F90 = color(1.0);
|
||||
|
||||
TransmissionBSDF = generalized_schlick_bsdf(
|
||||
Normal, vector(0.0), color(1.0), sqrt(BaseColor), r2, r2, F0, F90, -eta, distribution),
|
||||
BSDF = mix(BSDF, TransmissionBSDF, clamp(TransmissionWeight, 0.0, 1.0));
|
||||
TransmissionBSDF = generalized_schlick_bsdf(Normal,
|
||||
vector(0.0),
|
||||
color(1.0),
|
||||
sqrt(clamped_base_color),
|
||||
r2,
|
||||
r2,
|
||||
F0,
|
||||
F90,
|
||||
-eta,
|
||||
distribution),
|
||||
BSDF = mix(BSDF, TransmissionBSDF, transmission);
|
||||
}
|
||||
|
||||
closure color MetallicBSDF = 0;
|
||||
if (Metallic > 0.0) {
|
||||
color F0 = BaseColor;
|
||||
color F82 = specular_tint;
|
||||
if (metallic > CLOSURE_WEIGHT_CUTOFF) {
|
||||
color F0 = clamped_base_color;
|
||||
color F82 = min(specular_tint, color(1.0));
|
||||
MetallicBSDF = microfacet_f82_tint(distribution, Normal, T, alpha_x, alpha_y, F0, F82);
|
||||
BSDF = mix(BSDF, MetallicBSDF, clamp(Metallic, 0.0, 1.0));
|
||||
BSDF = mix(BSDF, MetallicBSDF, metallic);
|
||||
}
|
||||
|
||||
if (EmissionStrength > 0.0 && EmissionColor != color(0.0)) {
|
||||
if (EmissionStrength != 0.0 && EmissionColor != color(0.0)) {
|
||||
BSDF += EmissionStrength * EmissionColor * emission();
|
||||
}
|
||||
|
||||
if (CoatWeight > 1e-5) {
|
||||
if (coat_weight > CLOSURE_WEIGHT_CUTOFF) {
|
||||
float coat_ior = max(CoatIOR, 1.0);
|
||||
float coat_weight = clamp(CoatWeight, 0.0, 1.0);
|
||||
if (CoatTint != color(1.0)) {
|
||||
float coat_neta = 1.0 / coat_ior;
|
||||
float cosNI = dot(I, CoatNormal);
|
||||
float cosNT = sqrt(1.0 - coat_neta * coat_neta * (1 - cosNI * cosNI));
|
||||
BSDF *= mix(color(1.0), pow(CoatTint, 1.0 / cosNT), coat_weight);
|
||||
BSDF *= mix(color(1.0), pow(CoatTint, 1.0 / cosNT), clamp(coat_weight, 0.0, 1.0));
|
||||
}
|
||||
float coat_r2 = clamp(CoatRoughness, 0.0, 1.0);
|
||||
coat_r2 = coat_r2 * coat_r2;
|
||||
@ -136,10 +153,10 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
BSDF = layer(coat_weight * CoatBSDF, BSDF);
|
||||
}
|
||||
|
||||
if (SheenWeight > 1e-5) {
|
||||
normal sheen_normal = normalize(mix(Normal, CoatNormal, clamp(CoatWeight, 0.0, 1.0)));
|
||||
if (SheenWeight > CLOSURE_WEIGHT_CUTOFF) {
|
||||
normal sheen_normal = normalize(mix(Normal, CoatNormal, clamp(coat_weight, 0.0, 1.0)));
|
||||
closure color SheenBSDF = sheen(sheen_normal, clamp(SheenRoughness, 0.0, 1.0));
|
||||
BSDF = layer(clamp(SheenWeight, 0.0, 1.0) * SheenTint * SheenBSDF, BSDF);
|
||||
BSDF = layer(sheen_weight * max(SheenTint, color(0.0)) * SheenBSDF, BSDF);
|
||||
}
|
||||
|
||||
BSDF = mix(transparent(), BSDF, clamp(Alpha, 0.0, 1.0));
|
||||
|
@ -109,18 +109,18 @@ ccl_device
|
||||
// get Disney principled parameters
|
||||
float metallic = saturatef(param1);
|
||||
float subsurface_weight = saturatef(param2);
|
||||
float specular_ior_level = fmaxf(stack_load_float(stack, specular_ior_level_offset), 0.0f);
|
||||
float specular_ior_level = max(stack_load_float(stack, specular_ior_level_offset), 0.0f);
|
||||
float roughness = saturatef(stack_load_float(stack, roughness_offset));
|
||||
Spectrum specular_tint = rgb_to_spectrum(
|
||||
max(stack_load_float3(stack, specular_tint_offset), zero_float3()));
|
||||
float anisotropic = saturatef(stack_load_float(stack, anisotropic_offset));
|
||||
float sheen_weight = saturatef(stack_load_float(stack, sheen_weight_offset));
|
||||
float3 sheen_tint = stack_load_float3(stack, sheen_tint_offset);
|
||||
float sheen_weight = max(stack_load_float(stack, sheen_weight_offset), 0.0f);
|
||||
float3 sheen_tint = max(stack_load_float3(stack, sheen_tint_offset), zero_float3());
|
||||
float sheen_roughness = saturatef(stack_load_float(stack, sheen_roughness_offset));
|
||||
float coat_weight = saturatef(stack_load_float(stack, coat_weight_offset));
|
||||
float coat_weight = fmaxf(stack_load_float(stack, coat_weight_offset), 0.0f);
|
||||
float coat_roughness = saturatef(stack_load_float(stack, coat_roughness_offset));
|
||||
float coat_ior = fmaxf(stack_load_float(stack, coat_ior_offset), 1.0f);
|
||||
float3 coat_tint = stack_load_float3(stack, coat_tint_offset);
|
||||
float3 coat_tint = max(stack_load_float3(stack, coat_tint_offset), zero_float3());
|
||||
float transmission_weight = saturatef(stack_load_float(stack, transmission_weight_offset));
|
||||
float anisotropic_rotation = stack_load_float(stack, anisotropic_rotation_offset);
|
||||
float ior = fmaxf(stack_load_float(stack, eta_offset), 1e-5f);
|
||||
@ -140,6 +140,8 @@ ccl_device
|
||||
make_float3(__uint_as_float(data_base_color.y),
|
||||
__uint_as_float(data_base_color.z),
|
||||
__uint_as_float(data_base_color.w));
|
||||
base_color = max(base_color, zero_float3());
|
||||
const float3 clamped_base_color = min(base_color, one_float3());
|
||||
|
||||
// get the subsurface scattering data
|
||||
uint4 data_subsurf = read_node(kg, &offset);
|
||||
@ -157,7 +159,7 @@ ccl_device
|
||||
float emission_strength = stack_valid(emission_strength_offset) ?
|
||||
stack_load_float(stack, emission_strength_offset) :
|
||||
__uint_as_float(data_alpha_emission.z);
|
||||
float3 emission = stack_load_float3(stack, emission_offset) * fmaxf(emission_strength, 0.0f);
|
||||
float3 emission = stack_load_float3(stack, emission_offset) * emission_strength;
|
||||
|
||||
Spectrum weight = closure_weight * mix_weight;
|
||||
|
||||
@ -283,8 +285,8 @@ ccl_device
|
||||
bsdf->alpha_x = alpha_x;
|
||||
bsdf->alpha_y = alpha_y;
|
||||
|
||||
fresnel->f0 = rgb_to_spectrum(base_color);
|
||||
const Spectrum f82 = specular_tint;
|
||||
fresnel->f0 = rgb_to_spectrum(clamped_base_color);
|
||||
const Spectrum f82 = min(specular_tint, one_spectrum());
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
|
||||
@ -316,7 +318,7 @@ ccl_device
|
||||
fresnel->f90 = one_spectrum();
|
||||
fresnel->exponent = -ior;
|
||||
fresnel->reflection_tint = one_spectrum();
|
||||
fresnel->transmission_tint = sqrt(rgb_to_spectrum(base_color));
|
||||
fresnel->transmission_tint = sqrt(rgb_to_spectrum(clamped_base_color));
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
|
||||
@ -375,16 +377,18 @@ ccl_device
|
||||
/* Diffuse/Subsurface component */
|
||||
#ifdef __SUBSURFACE__
|
||||
ccl_private Bssrdf *bssrdf = bssrdf_alloc(
|
||||
sd, rgb_to_spectrum(base_color) * subsurface_weight * weight);
|
||||
sd, rgb_to_spectrum(clamped_base_color) * subsurface_weight * weight);
|
||||
if (bssrdf) {
|
||||
float3 subsurface_radius = stack_load_float3(stack, data_subsurf.y);
|
||||
float subsurface_scale = stack_load_float(stack, data_subsurf.z);
|
||||
|
||||
bssrdf->radius = rgb_to_spectrum(subsurface_radius * subsurface_scale);
|
||||
bssrdf->albedo = rgb_to_spectrum(base_color);
|
||||
bssrdf->radius = rgb_to_spectrum(max(subsurface_radius * subsurface_scale, zero_float3()));
|
||||
bssrdf->albedo = rgb_to_spectrum(clamped_base_color);
|
||||
bssrdf->N = maybe_ensure_valid_specular_reflection(sd, N);
|
||||
bssrdf->alpha = sqr(roughness);
|
||||
/* IOR is clamped to [1.01..3.8] inside bssrdf_setup */
|
||||
bssrdf->ior = eta;
|
||||
/* Anisotropy is clamped to [0.0..0.9] inside bssrdf_setup */
|
||||
bssrdf->anisotropy = stack_load_float(stack, data_subsurf.w);
|
||||
if (subsurface_method == CLOSURE_BSSRDF_RANDOM_WALK_SKIN_ID) {
|
||||
bssrdf->ior = stack_load_float(stack, data_subsurf.x);
|
||||
|
@ -7392,6 +7392,11 @@ def km_3d_view_tool_edit_armature_extrude_to_cursor(params):
|
||||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
("armature.click_extrude", {"type": params.tool_mouse, "value": 'PRESS', **params.tool_modifier}, None),
|
||||
# Support LMB click-drag for RMB key-map.
|
||||
*(([] if (params.select_mouse == 'LEFTMOUSE') else [
|
||||
("transform.translate", {"type": params.tool_mouse, "value": 'CLICK_DRAG'},
|
||||
{"properties": [("release_confirm", True)]})
|
||||
])),
|
||||
]},
|
||||
)
|
||||
|
||||
@ -7477,6 +7482,11 @@ def km_3d_view_tool_edit_mesh_extrude_to_cursor(params):
|
||||
{"items": [
|
||||
# No need for `tool_modifier` since this takes all input.
|
||||
("mesh.dupli_extrude_cursor", {"type": params.tool_mouse, "value": 'PRESS'}, None),
|
||||
# Support LMB click-drag for RMB key-map.
|
||||
*(([] if (params.select_mouse == 'LEFTMOUSE') else [
|
||||
("transform.translate", {"type": params.tool_mouse, "value": 'CLICK_DRAG'},
|
||||
{"properties": [("release_confirm", True)]})
|
||||
])),
|
||||
]},
|
||||
)
|
||||
|
||||
@ -7771,6 +7781,11 @@ def km_3d_view_tool_edit_curve_extrude_to_cursor(params):
|
||||
{"items": [
|
||||
# No need for `tool_modifier` since this takes all input.
|
||||
("curve.vertex_add", {"type": params.tool_mouse, "value": 'PRESS'}, None),
|
||||
# Support LMB click-drag for RMB key-map.
|
||||
*(([] if (params.select_mouse == 'LEFTMOUSE') else [
|
||||
("transform.translate", {"type": params.tool_mouse, "value": 'CLICK_DRAG'},
|
||||
{"properties": [("release_confirm", True)]})
|
||||
])),
|
||||
]},
|
||||
)
|
||||
|
||||
|
@ -225,7 +225,6 @@ static int armature_click_extrude_invoke(bContext *C, wmOperator *op, const wmEv
|
||||
ARegion *region;
|
||||
View3D *v3d;
|
||||
float tvec[3], oldcurs[3], mval_f[2];
|
||||
int retv;
|
||||
|
||||
scene = CTX_data_scene(C);
|
||||
region = CTX_wm_region(C);
|
||||
@ -240,12 +239,16 @@ static int armature_click_extrude_invoke(bContext *C, wmOperator *op, const wmEv
|
||||
copy_v3_v3(cursor->location, tvec);
|
||||
|
||||
/* extrude to the where new cursor is and store the operation result */
|
||||
retv = armature_click_extrude_exec(C, op);
|
||||
int retval = armature_click_extrude_exec(C, op);
|
||||
|
||||
/* restore previous 3d cursor position */
|
||||
copy_v3_v3(cursor->location, oldcurs);
|
||||
|
||||
return retv;
|
||||
/* Support dragging to move after extrude, see: #114282. */
|
||||
if (retval & OPERATOR_FINISHED) {
|
||||
retval |= OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void ARMATURE_OT_click_extrude(wmOperatorType *ot)
|
||||
|
@ -5703,7 +5703,12 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
RNA_float_set_array(op->ptr, "location", location);
|
||||
}
|
||||
|
||||
return add_vertex_exec(C, op);
|
||||
/* Support dragging to move after extrude, see: #114282. */
|
||||
int retval = add_vertex_exec(C, op);
|
||||
if (retval & OPERATOR_FINISHED) {
|
||||
retval |= OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void CURVE_OT_vertex_add(wmOperatorType *ot)
|
||||
|
@ -914,7 +914,9 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w
|
||||
}
|
||||
MEM_freeN(objects);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
/* Support dragging to move after extrude, see: #114282. */
|
||||
const int retval = OPERATOR_FINISHED | OPERATOR_PASS_THROUGH;
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)
|
||||
|
@ -63,22 +63,36 @@ void node_bsdf_principled(vec4 base_color,
|
||||
out Closure result)
|
||||
{
|
||||
/* Match cycles. */
|
||||
metallic = clamp(metallic, 0.0, 1.0);
|
||||
roughness = clamp(roughness, 0.0, 1.0);
|
||||
metallic = saturate(metallic);
|
||||
roughness = saturate(roughness);
|
||||
ior = max(ior, 1e-5);
|
||||
transmission_weight = clamp(transmission_weight, 0.0, 1.0);
|
||||
subsurface_weight = clamp(subsurface_weight, 0.0, 1.0);
|
||||
alpha = saturate(alpha);
|
||||
subsurface_weight = saturate(subsurface_weight);
|
||||
/* Not used by EEVEE */
|
||||
/* subsurface_anisotropy = clamp(subsurface_anisotropy, 0.0, 0.9); */
|
||||
/* subsurface_ior = clamp(subsurface_ior, 1.01, 3.8); */
|
||||
specular_ior_level = max(specular_ior_level, 0.0);
|
||||
specular_tint = max(specular_tint, vec4(0.0));
|
||||
/* Not used by EEVEE */
|
||||
/* anisotropic = clamp(anisotropic, 0.0, 1.0) */
|
||||
coat_weight = clamp(coat_weight, 0.0, 1.0);
|
||||
coat_roughness = clamp(coat_roughness, 0.0, 1.0);
|
||||
/* anisotropic = saturate(anisotropic); */
|
||||
transmission_weight = saturate(transmission_weight);
|
||||
coat_weight = max(coat_weight, 0.0);
|
||||
coat_roughness = saturate(coat_roughness);
|
||||
coat_ior = max(coat_ior, 1.0);
|
||||
sheen_weight = clamp(sheen_weight, 0.0, 1.0);
|
||||
sheen_roughness = clamp(sheen_roughness, 0.0, 1.0);
|
||||
emission_strength = max(emission_strength, 0.0);
|
||||
alpha = clamp(alpha, 0.0, 1.0);
|
||||
coat_tint = max(coat_tint, vec4(0.0));
|
||||
sheen_weight = max(sheen_weight, 0.0);
|
||||
sheen_roughness = saturate(sheen_roughness);
|
||||
sheen_tint = max(sheen_tint, vec4(0.0));
|
||||
|
||||
base_color = max(base_color, vec4(0.0));
|
||||
vec4 clamped_base_color = min(base_color, vec4(1.0));
|
||||
|
||||
vec4 diffuse_sss_base_color = base_color;
|
||||
if (subsurface_weight > 0.0) {
|
||||
/* Subsurface Scattering materials behave unpredictably with values greater than 1.0 in Cycles.
|
||||
* So it's clamped there and we clamp here for consistency with Cycles. */
|
||||
diffuse_sss_base_color = mix(diffuse_sss_base_color, clamped_base_color, subsurface_weight);
|
||||
}
|
||||
|
||||
N = safe_normalize(N);
|
||||
CN = safe_normalize(CN);
|
||||
@ -100,7 +114,7 @@ void node_bsdf_principled(vec4 base_color,
|
||||
vec3 sheen_color = sheen_weight * sheen_tint.rgb * principled_sheen(NV, sheen_roughness);
|
||||
diffuse_data.color = weight * sheen_color;
|
||||
/* Attenuate lower layers */
|
||||
weight *= (1.0 - math_reduce_max(sheen_color));
|
||||
weight *= max((1.0 - math_reduce_max(sheen_color)), 0.0);
|
||||
}
|
||||
else {
|
||||
diffuse_data.color = vec3(0.0);
|
||||
@ -117,13 +131,13 @@ void node_bsdf_principled(vec4 base_color,
|
||||
float reflectance = bsdf_lut(coat_NV, coat_data.roughness, coat_ior, false).x;
|
||||
coat_data.weight = weight * coat_weight * reflectance;
|
||||
/* Attenuate lower layers */
|
||||
weight *= (1.0 - reflectance * coat_weight);
|
||||
weight *= max((1.0 - reflectance * coat_weight), 0.0);
|
||||
|
||||
if (!all(equal(coat_tint.rgb, vec3(1.0)))) {
|
||||
float coat_neta = 1.0 / coat_ior;
|
||||
float NT = sqrt_fast(1.0 - coat_neta * coat_neta * (1 - NV * NV));
|
||||
/* Tint lower layers. */
|
||||
coat_tint.rgb = mix(vec3(1.0), pow(coat_tint.rgb, vec3(1.0 / NT)), coat_weight);
|
||||
coat_tint.rgb = mix(vec3(1.0), pow(coat_tint.rgb, vec3(1.0 / NT)), saturate(coat_weight));
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -142,13 +156,13 @@ void node_bsdf_principled(vec4 base_color,
|
||||
reflection_data.roughness = roughness;
|
||||
vec3 reflection_tint = specular_tint.rgb;
|
||||
if (metallic > 0.0) {
|
||||
vec3 F0 = base_color.rgb;
|
||||
vec3 F82 = reflection_tint;
|
||||
vec3 F0 = clamped_base_color.rgb;
|
||||
vec3 F82 = min(reflection_tint, vec3(1.0));
|
||||
vec3 metallic_brdf;
|
||||
brdf_f82_tint_lut(F0, F82, NV, roughness, do_multiscatter != 0.0, metallic_brdf);
|
||||
reflection_data.color = weight * metallic * metallic_brdf;
|
||||
/* Attenuate lower layers */
|
||||
weight *= (1.0 - metallic);
|
||||
weight *= max((1.0 - metallic), 0.0);
|
||||
}
|
||||
else {
|
||||
reflection_data.color = vec3(0.0);
|
||||
@ -165,7 +179,7 @@ void node_bsdf_principled(vec4 base_color,
|
||||
vec3 reflectance, transmittance;
|
||||
bsdf_lut(F0,
|
||||
F90,
|
||||
base_color.rgb,
|
||||
clamped_base_color.rgb,
|
||||
NV,
|
||||
roughness,
|
||||
ior,
|
||||
@ -178,7 +192,7 @@ void node_bsdf_principled(vec4 base_color,
|
||||
refraction_data.weight = weight * transmission_weight;
|
||||
refraction_data.color = transmittance * coat_tint.rgb;
|
||||
/* Attenuate lower layers */
|
||||
weight *= (1.0 - transmission_weight);
|
||||
weight *= max((1.0 - transmission_weight), 0.0);
|
||||
}
|
||||
else {
|
||||
refraction_data.weight = 0.0;
|
||||
@ -205,14 +219,14 @@ void node_bsdf_principled(vec4 base_color,
|
||||
|
||||
reflection_data.color += weight * reflectance;
|
||||
/* Attenuate lower layers */
|
||||
weight *= (1.0 - math_reduce_max(reflectance));
|
||||
weight *= max((1.0 - math_reduce_max(reflectance)), 0.0);
|
||||
}
|
||||
|
||||
/* Diffuse component */
|
||||
if (true) {
|
||||
diffuse_data.sss_radius = subsurface_radius * subsurface_scale;
|
||||
diffuse_data.sss_radius = max(subsurface_radius * subsurface_scale, vec3(0.0));
|
||||
diffuse_data.sss_id = uint(do_sss);
|
||||
diffuse_data.color += weight * base_color.rgb * coat_tint.rgb;
|
||||
diffuse_data.color += weight * diffuse_sss_base_color.rgb * coat_tint.rgb;
|
||||
}
|
||||
|
||||
/* Adjust the weight of picking the closure. */
|
||||
|
Loading…
Reference in New Issue
Block a user