forked from bartvdbraak/blender
Cycles: Refactor closure roughness detection to fix a potential bug with Denoising of specular shaders
This commit is contained in:
parent
f402638211
commit
d8066fb0f1
@ -36,6 +36,22 @@
|
||||
|
||||
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_sqr(const ShaderClosure *sc)
|
||||
{
|
||||
if(CLOSURE_IS_BSDF_SINGULAR(sc->type)) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
|
||||
MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc;
|
||||
return bsdf->alpha_x*bsdf->alpha_y;
|
||||
}
|
||||
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
|
||||
ShaderData *sd,
|
||||
const ShaderClosure *sc,
|
||||
@ -438,23 +454,5 @@ ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure *b)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Classifies a closure as diffuse-like or specular-like.
|
||||
* This is needed for the denoising feature pass generation,
|
||||
* which are written on the first bounce where more than 25%
|
||||
* of the sampling weight belongs to diffuse-line closures. */
|
||||
ccl_device_inline bool bsdf_is_specular_like(ShaderClosure *sc)
|
||||
{
|
||||
if(CLOSURE_IS_BSDF_TRANSPARENT(sc->type)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
|
||||
MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc;
|
||||
return (bsdf->alpha_x*bsdf->alpha_y <= 0.075f*0.075f);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
|
@ -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_is_specular_like(sc)) {
|
||||
if(bsdf_get_roughness_sqr(sc) > sqr(0.075f)) {
|
||||
albedo += sc->weight;
|
||||
sum_nonspecular_weight += sc->sample_weight;
|
||||
}
|
||||
|
@ -465,13 +465,16 @@ typedef enum ClosureType {
|
||||
#define CLOSURE_IS_BSDF_GLOSSY(type) (type >= CLOSURE_BSDF_REFLECTION_ID && type <= CLOSURE_BSDF_HAIR_REFLECTION_ID)
|
||||
#define CLOSURE_IS_BSDF_TRANSMISSION(type) (type >= CLOSURE_BSDF_TRANSLUCENT_ID && type <= CLOSURE_BSDF_HAIR_TRANSMISSION_ID)
|
||||
#define CLOSURE_IS_BSDF_BSSRDF(type) (type == CLOSURE_BSDF_BSSRDF_ID || type == CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID)
|
||||
#define CLOSURE_IS_BSDF_SINGULAR(type) (type == CLOSURE_BSDF_REFLECTION_ID || \
|
||||
type == CLOSURE_BSDF_REFRACTION_ID || \
|
||||
type == CLOSURE_BSDF_TRANSPARENT_ID)
|
||||
#define CLOSURE_IS_BSDF_TRANSPARENT(type) (type == CLOSURE_BSDF_TRANSPARENT_ID)
|
||||
#define CLOSURE_IS_BSDF_ANISOTROPIC(type) (type >= CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID && type <= CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID)
|
||||
#define CLOSURE_IS_BSDF_MULTISCATTER(type) (type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID ||\
|
||||
type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ANISO_ID || \
|
||||
type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID)
|
||||
#define CLOSURE_IS_BSDF_MICROFACET(type) ((type >= CLOSURE_BSDF_REFLECTION_ID && type <= CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID) ||\
|
||||
(type >= CLOSURE_BSDF_REFRACTION_ID && type <= CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID))
|
||||
#define CLOSURE_IS_BSDF_MICROFACET(type) ((type >= CLOSURE_BSDF_MICROFACET_GGX_ID && type <= CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID) ||\
|
||||
(type >= CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID && type <= CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID) ||\
|
||||
(type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID))
|
||||
#define CLOSURE_IS_BSDF_OR_BSSRDF(type) (type <= CLOSURE_BSSRDF_BURLEY_ID)
|
||||
#define CLOSURE_IS_BSSRDF(type) (type >= CLOSURE_BSSRDF_CUBIC_ID && type <= CLOSURE_BSSRDF_BURLEY_ID)
|
||||
#define CLOSURE_IS_VOLUME(type) (type >= CLOSURE_VOLUME_ID && type <= CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID)
|
||||
|
@ -518,6 +518,11 @@ ccl_device float safe_modulo(float a, float b)
|
||||
return (b != 0.0f)? fmodf(a, b): 0.0f;
|
||||
}
|
||||
|
||||
ccl_device_inline float sqr(float a)
|
||||
{
|
||||
return a * a;
|
||||
}
|
||||
|
||||
ccl_device_inline float beta(float x, float y)
|
||||
{
|
||||
#ifndef __KERNEL_OPENCL__
|
||||
|
Loading…
Reference in New Issue
Block a user