From e3f1d980982b1c0da7853a960cbd3e9a3f434376 Mon Sep 17 00:00:00 2001 From: Matt Heimlich Date: Wed, 28 Mar 2018 23:18:46 +0200 Subject: Cycles: take into account diffuse roughness for roughness baking. Roughness baking previously defaulted to 1.0 for all diffuse materials, now we also bake roughness values of Oren-Nayer and Principled Diffuse. Differential Revision: https://developer.blender.org/D3115 --- intern/cycles/kernel/closure/bsdf.h | 28 +++++++++++++++++++++++++--- intern/cycles/kernel/kernel_passes.h | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) (limited to 'intern/cycles/kernel') diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h index e3beff6675a..d8ff69ca241 100644 --- a/intern/cycles/kernel/closure/bsdf.h +++ b/intern/cycles/kernel/closure/bsdf.h @@ -36,20 +36,42 @@ CCL_NAMESPACE_BEGIN /* Returns the square of the roughness of the closure if it has roughness, * 0 for singular closures and 1 otherwise. */ -ccl_device_inline float bsdf_get_roughness_squared(const ShaderClosure *sc) +ccl_device_inline float bsdf_get_specular_roughness_squared(const ShaderClosure *sc) { if(CLOSURE_IS_BSDF_SINGULAR(sc->type)) { return 0.0f; } if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) { - MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc; + MicrofacetBsdf *bsdf = (MicrofacetBsdf*)sc; return bsdf->alpha_x*bsdf->alpha_y; } return 1.0f; } +ccl_device_inline float bsdf_get_roughness_squared(const ShaderClosure *sc) +{ + /* This version includes diffuse, mainly for baking Principled BSDF + * where specular and metallic zero otherwise does not bake the + * specified roughness parameter. */ + if(sc->type == CLOSURE_BSDF_OREN_NAYAR_ID) { + OrenNayarBsdf *bsdf = (OrenNayarBsdf*)sc; + return sqr(sqr(bsdf->roughness)); + } + + if(sc->type == CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID) { + PrincipledDiffuseBsdf *bsdf = (PrincipledDiffuseBsdf*)sc; + return sqr(sqr(bsdf->roughness)); + } + + if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) { + return 0.0f; + } + + return bsdf_get_specular_roughness_squared(sc); +} + ccl_device_forceinline int bsdf_sample(KernelGlobals *kg, ShaderData *sd, const ShaderClosure *sc, @@ -176,7 +198,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg, float threshold_squared = kernel_data.background.transparent_roughness_squared_threshold; if(threshold_squared >= 0.0f) { - if(bsdf_get_roughness_squared(sc) <= threshold_squared) { + if(bsdf_get_specular_roughness_squared(sc) <= threshold_squared) { label |= LABEL_TRANSMIT_TRANSPARENT; } } diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 1933d695f92..a42a8e9812f 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -140,7 +140,7 @@ ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg, /* All closures contribute to the normal feature, but only diffuse-like ones to the albedo. */ normal += sc->N * sc->sample_weight; sum_weight += sc->sample_weight; - if(bsdf_get_roughness_squared(sc) > sqr(0.075f)) { + if(bsdf_get_specular_roughness_squared(sc) > sqr(0.075f)) { albedo += sc->weight; sum_nonspecular_weight += sc->sample_weight; } -- cgit v1.2.3