Fix #122031: Cycles: OSL implementation of Thin Film is missing

This commit is contained in:
Lukas Stockner
2024-05-24 23:53:58 +02:00
parent bfa54f22ce
commit 896ef010f6
3 changed files with 33 additions and 10 deletions

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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);
}