Cycles: new Microfacet-based Hair BSDF with elliptical cross-section support #105600

Merged
Weizhen Huang merged 114 commits from weizhen/blender:microfacet_hair into main 2023-08-18 12:46:20 +02:00
2 changed files with 5 additions and 8 deletions
Showing only changes of commit dfbe7c544f - Show all commits

View File

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

View File

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