Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-12-02 03:40:58 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-12-02 03:40:58 +0300
commita35c635edb3db548e11555024ec3a384f93ce352 (patch)
treeae0c0c9435c2e7daed4cbd916e0be90df7898b51 /intern/cycles/kernel/closure/bsdf_microfacet.h
parent7164e63fefcfa26caf387a2ad04a8c51b533c32b (diff)
parentf1ac64921b49eaea8658d144754a1a532198c720 (diff)
Merge branch 'master' into tmp-overlay-enginetmp-overlay-engine
# Conflicts: # source/blender/draw/modes/paint_texture_mode.c
Diffstat (limited to 'intern/cycles/kernel/closure/bsdf_microfacet.h')
-rw-r--r--intern/cycles/kernel/closure/bsdf_microfacet.h35
1 files changed, 23 insertions, 12 deletions
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index 2f73434706c..2884ea62a18 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -37,6 +37,7 @@ CCL_NAMESPACE_BEGIN
typedef ccl_addr_space struct MicrofacetExtra {
float3 color, cspec0;
+ float3 fresnel_color;
float clearcoat;
} MicrofacetExtra;
@@ -276,6 +277,22 @@ ccl_device_forceinline float D_GTR1(float NdotH, float alpha)
return (alpha2 - 1.0f) / (M_PI_F * logf(alpha2) * t);
}
+ccl_device_forceinline void bsdf_microfacet_fresnel_color(const ShaderData *sd,
+ MicrofacetBsdf *bsdf)
+{
+ kernel_assert(CLOSURE_IS_BSDF_MICROFACET_FRESNEL(bsdf->type));
+
+ float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
+ bsdf->extra->fresnel_color = interpolate_fresnel_color(
+ sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0);
+
+ if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
+ bsdf->extra->fresnel_color *= 0.25f * bsdf->extra->clearcoat;
+ }
+
+ bsdf->sample_weight *= average(bsdf->extra->fresnel_color);
+}
+
/* GGX microfacet with Smith shadow-masking from:
*
* Microfacet Models for Refraction through Rough Surfaces
@@ -305,15 +322,13 @@ ccl_device int bsdf_microfacet_ggx_fresnel_setup(MicrofacetBsdf *bsdf, const Sha
{
bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
- float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
- float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
- bsdf->sample_weight *= F;
-
bsdf->alpha_x = saturate(bsdf->alpha_x);
bsdf->alpha_y = bsdf->alpha_x;
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID;
+ bsdf_microfacet_fresnel_color(sd, bsdf);
+
return SD_BSDF | SD_BSDF_HAS_EVAL;
}
@@ -321,15 +336,13 @@ ccl_device int bsdf_microfacet_ggx_clearcoat_setup(MicrofacetBsdf *bsdf, const S
{
bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
- float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
- float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
- bsdf->sample_weight *= 0.25f * bsdf->extra->clearcoat * F;
-
bsdf->alpha_x = saturate(bsdf->alpha_x);
bsdf->alpha_y = bsdf->alpha_x;
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
+ bsdf_microfacet_fresnel_color(sd, bsdf);
+
return SD_BSDF | SD_BSDF_HAS_EVAL;
}
@@ -364,15 +377,13 @@ ccl_device int bsdf_microfacet_ggx_aniso_fresnel_setup(MicrofacetBsdf *bsdf, con
{
bsdf->extra->cspec0 = saturate3(bsdf->extra->cspec0);
- float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
- float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
- bsdf->sample_weight *= F;
-
bsdf->alpha_x = saturate(bsdf->alpha_x);
bsdf->alpha_y = saturate(bsdf->alpha_y);
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID;
+ bsdf_microfacet_fresnel_color(sd, bsdf);
+
return SD_BSDF | SD_BSDF_HAS_EVAL;
}