Cycles: new Microfacet-based Hair BSDF with elliptical cross-section support #105600
|
@ -502,12 +502,14 @@ ccl_device_inline int bsdf_label(const KernelGlobals kg,
|
|||
label = LABEL_TRANSMIT | LABEL_GLOSSY;
|
||||
break;
|
||||
case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
|
||||
case CLOSURE_BSDF_HAIR_MICROFACET_ID:
|
||||
if (bsdf_is_transmission(sc, wo))
|
||||
label = LABEL_TRANSMIT | LABEL_GLOSSY;
|
||||
else
|
||||
label = LABEL_REFLECT | LABEL_GLOSSY;
|
||||
break;
|
||||
case CLOSURE_BSDF_HAIR_MICROFACET_ID:
|
||||
label = LABEL_REFLECT | LABEL_GLOSSY;
|
||||
break;
|
||||
case CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID:
|
||||
label = LABEL_REFLECT | LABEL_DIFFUSE;
|
||||
break;
|
||||
|
|
|
@ -89,7 +89,7 @@ ccl_device int bsdf_microfacet_hair_setup(ccl_private ShaderData *sd,
|
|||
|
||||
kernel_assert(!is_zero(bsdf->N) && isfinite_safe(bsdf->N));
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_NEEDS_LCG | SD_BSDF_HAS_TRANSMISSION;
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_NEEDS_LCG;
|
||||
}
|
||||
|
||||
#endif /* __HAIR__ */
|
||||
|
@ -756,8 +756,6 @@ ccl_device int bsdf_microfacet_hair_sample(const KernelGlobals kg,
|
|||
if (microfacet_visible(wi, wr, wmi_, wh1)) {
|
||||
visibility = bsdf_G<m_type>(roughness2, dot(wmi, wr));
|
||||
}
|
||||
|
||||
label |= LABEL_REFLECT;
|
||||
}
|
||||
else if (sample_lobe < (r + tt)) {
|
||||
local_O = wtt;
|
||||
|
@ -767,8 +765,6 @@ ccl_device int bsdf_microfacet_hair_sample(const KernelGlobals kg,
|
|||
visibility = bsdf_G<m_type>(roughness2, dot(wmi, -wt)) *
|
||||
bsdf_G<m_type>(roughness2, dot(wmt, -wtt));
|
||||
}
|
||||
|
||||
label |= LABEL_TRANSMIT;
|
||||
}
|
||||
else { /* if (sample_lobe >= (r + tt)) */
|
||||
local_O = wtrt;
|
||||
|
@ -779,9 +775,8 @@ ccl_device int bsdf_microfacet_hair_sample(const KernelGlobals kg,
|
|||
bsdf_G<m_type>(roughness2, dot(wmt, -wtr)) *
|
||||
bsdf_G<m_type>(roughness2, dot(wmtr, -wtrt));
|
||||
}
|
||||
|
||||
label |= LABEL_TRANSMIT;
|
||||
}
|
||||
label |= LABEL_REFLECT;
|
||||
|
||||
*eval *= visibility;
|
||||
*wo = local_O.x * X + local_O.y * Y + local_O.z * Z;
|
||||
|
|
Loading…
Reference in New Issue