Fix #122031: Cycles: OSL implementation of Thin Film is missing
This commit is contained in:
@@ -274,8 +274,8 @@ ccl_device void osl_closure_dielectric_bsdf_setup(KernelGlobals kg,
|
||||
|
||||
fresnel->reflection_tint = rgb_to_spectrum(closure->reflection_tint);
|
||||
fresnel->transmission_tint = rgb_to_spectrum(closure->transmission_tint);
|
||||
fresnel->thin_film.thickness = 0.0f;
|
||||
fresnel->thin_film.ior = 0.0f;
|
||||
fresnel->thin_film.thickness = closure->thinfilm_thickness;
|
||||
fresnel->thin_film.ior = closure->thinfilm_ior;
|
||||
bsdf_microfacet_setup_fresnel_dielectric_tint(kg, bsdf, sd, fresnel, preserve_energy);
|
||||
|
||||
if (layer_albedo != NULL) {
|
||||
@@ -425,8 +425,8 @@ ccl_device void osl_closure_generalized_schlick_bsdf_setup(
|
||||
fresnel->f0 = rgb_to_spectrum(closure->f0);
|
||||
fresnel->f90 = rgb_to_spectrum(closure->f90);
|
||||
fresnel->exponent = closure->exponent;
|
||||
fresnel->thin_film.thickness = 0.0f;
|
||||
fresnel->thin_film.ior = 0.0f;
|
||||
fresnel->thin_film.thickness = closure->thinfilm_thickness;
|
||||
fresnel->thin_film.ior = closure->thinfilm_ior;
|
||||
bsdf_microfacet_setup_fresnel_generalized_schlick(kg, bsdf, sd, fresnel, preserve_energy);
|
||||
|
||||
if (layer_albedo != NULL) {
|
||||
|
||||
@@ -54,6 +54,8 @@ OSL_CLOSURE_STRUCT_BEGIN(DielectricBSDF, dielectric_bsdf)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(DielectricBSDF, FLOAT, float, alpha_y, NULL)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(DielectricBSDF, FLOAT, float, ior, NULL)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(DielectricBSDF, STRING, DeviceString, distribution, NULL)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(DielectricBSDF, FLOAT, float, thinfilm_thickness, "thinfilm_thickness")
|
||||
OSL_CLOSURE_STRUCT_MEMBER(DielectricBSDF, FLOAT, float, thinfilm_ior, "thinfilm_ior")
|
||||
OSL_CLOSURE_STRUCT_END(DielectricBSDF, dielectric_bsdf)
|
||||
|
||||
OSL_CLOSURE_STRUCT_BEGIN(ConductorBSDF, conductor_bsdf)
|
||||
@@ -77,6 +79,9 @@ OSL_CLOSURE_STRUCT_BEGIN(GeneralizedSchlickBSDF, generalized_schlick_bsdf)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(GeneralizedSchlickBSDF, VECTOR, packed_float3, f90, NULL)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(GeneralizedSchlickBSDF, FLOAT, float, exponent, NULL)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(GeneralizedSchlickBSDF, STRING, DeviceString, distribution, NULL)
|
||||
OSL_CLOSURE_STRUCT_MEMBER(
|
||||
GeneralizedSchlickBSDF, FLOAT, float, thinfilm_thickness, "thinfilm_thickness")
|
||||
OSL_CLOSURE_STRUCT_MEMBER(GeneralizedSchlickBSDF, FLOAT, float, thinfilm_ior, "thinfilm_ior")
|
||||
OSL_CLOSURE_STRUCT_END(GeneralizedSchlickBSDF, generalized_schlick_bsdf)
|
||||
|
||||
OSL_CLOSURE_STRUCT_BEGIN(Microfacet, microfacet)
|
||||
|
||||
@@ -31,6 +31,8 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
color EmissionColor = 1.0,
|
||||
float EmissionStrength = 0.0,
|
||||
float Alpha = 1.0,
|
||||
float ThinFilmThickness = 0.0,
|
||||
float ThinFilmIOR = 1.33,
|
||||
normal Normal = N,
|
||||
normal CoatNormal = N,
|
||||
normal Tangent = normalize(dPdu),
|
||||
@@ -92,21 +94,33 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
BSDF = mix(BSDF, clamped_base_color * SubsurfBSDF, subsurface_weight);
|
||||
}
|
||||
|
||||
if (eta != 1.0) {
|
||||
if (eta != 1.0 || ThinFilmThickness > 0.1) {
|
||||
/* Apply specular tint */
|
||||
color F0 = f0 * specular_tint;
|
||||
color F90 = color(1.0);
|
||||
|
||||
BSDF = layer(
|
||||
generalized_schlick_bsdf(
|
||||
Normal, T, color(1.0), color(0.0), alpha_x, alpha_y, F0, F90, -eta, distribution),
|
||||
BSDF);
|
||||
BSDF = layer(generalized_schlick_bsdf(Normal,
|
||||
T,
|
||||
color(1.0),
|
||||
color(0.0),
|
||||
alpha_x,
|
||||
alpha_y,
|
||||
F0,
|
||||
F90,
|
||||
-eta,
|
||||
distribution,
|
||||
"thinfilm_thickness",
|
||||
ThinFilmThickness,
|
||||
"thinfilm_ior",
|
||||
ThinFilmIOR),
|
||||
BSDF);
|
||||
}
|
||||
}
|
||||
|
||||
closure color TransmissionBSDF = 0;
|
||||
if (metallic < 1.0 && TransmissionWeight > CLOSURE_WEIGHT_CUTOFF) {
|
||||
float eta = max(IOR, 1e-5);
|
||||
float thinfilm_ior = backfacing() ? ThinFilmIOR / eta : ThinFilmIOR;
|
||||
eta = backfacing() ? 1.0 / eta : eta;
|
||||
|
||||
color F0 = F0_from_ior(eta) * specular_tint;
|
||||
@@ -121,7 +135,11 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
||||
F0,
|
||||
F90,
|
||||
-eta,
|
||||
distribution),
|
||||
distribution,
|
||||
"thinfilm_thickness",
|
||||
ThinFilmThickness,
|
||||
"thinfilm_ior",
|
||||
thinfilm_ior),
|
||||
BSDF = mix(BSDF, TransmissionBSDF, transmission);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user