Commit: 521d4335ef8cb1b63008a64fe633c7202d6d9fbe
Author: Pascal Schoen
Date:   Fri Dec 2 13:43:06 2016 +0100
Branches: cycles_disney_bsdf_transmittance
https://developer.blender.org/rB521d4335ef8cb1b63008a64fe633c7202d6d9fbe

Enhanced the thin surface specular transmission approximation by a simple 
reflection to the other side without refracting it (refraction approximately 
cancels for thin surfaces).

===================================================================

M       intern/cycles/kernel/closure/bsdf.h
M       intern/cycles/kernel/closure/bsdf_microfacet.h
M       intern/cycles/kernel/svm/svm_closure.h
M       intern/cycles/kernel/svm/svm_types.h
M       release/datafiles/locale
M       release/scripts/addons
M       release/scripts/addons_contrib

===================================================================

diff --git a/intern/cycles/kernel/closure/bsdf.h 
b/intern/cycles/kernel/closure/bsdf.h
index 83e33c1..4f8180a 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -90,6 +90,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
                        label = bsdf_microfacet_ggx_sample(kg, sc, 
ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, 
dI).dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
@@ -206,6 +207,7 @@ float3 bsdf_eval(KernelGlobals *kg,
                        case CLOSURE_BSDF_MICROFACET_GGX_ID:
                        case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+                       case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
                                eval = bsdf_microfacet_ggx_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
@@ -285,6 +287,7 @@ float3 bsdf_eval(KernelGlobals *kg,
                        case CLOSURE_BSDF_MICROFACET_GGX_ID:
                        case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+                       case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
                                eval = bsdf_microfacet_ggx_eval_transmit(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
@@ -355,6 +358,7 @@ ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure 
*sc, float roughness)
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
                        bsdf_microfacet_ggx_blur(sc, roughness);
                        break;
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
@@ -389,6 +393,7 @@ ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure 
*b)
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
                case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
                case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h 
b/intern/cycles/kernel/closure/bsdf_microfacet.h
index ea4e4d3..88dbe3f 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -377,6 +377,18 @@ ccl_device int 
bsdf_microfacet_ggx_refraction_setup(MicrofacetBsdf *bsdf)
        return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
+ccl_device int bsdf_microfacet_ggx_refraction_thin_setup(MicrofacetBsdf *bsdf)
+{
+       bsdf->extra = NULL;
+
+       bsdf->alpha_x = saturate(bsdf->alpha_x);
+       bsdf->alpha_y = bsdf->alpha_x;
+
+       bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
+
+       return SD_BSDF|SD_BSDF_HAS_EVAL;
+}
+
 ccl_device void bsdf_microfacet_ggx_blur(ShaderClosure *sc, float roughness)
 {
        MicrofacetBsdf *bsdf = (MicrofacetBsdf*)sc;
@@ -390,7 +402,7 @@ ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const 
ShaderClosure *sc, cons
        const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
        float alpha_x = bsdf->alpha_x;
        float alpha_y = bsdf->alpha_y;
-       bool m_refractive = bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+       bool m_refractive = bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID || bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
        float3 N = bsdf->N;
 
        if(m_refractive || alpha_x*alpha_y <= 1e-7f)
@@ -499,7 +511,7 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const 
ShaderClosure *sc, con
        float alpha_x = bsdf->alpha_x;
        float alpha_y = bsdf->alpha_y;
        float m_eta = bsdf->ior;
-       bool m_refractive = bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+       bool m_refractive = bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID || bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
        float3 N = bsdf->N;
 
        if(!m_refractive || alpha_x*alpha_y <= 1e-7f)
@@ -512,7 +524,15 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const 
ShaderClosure *sc, con
                return make_float3(0.0f, 0.0f, 0.0f); /* vectors on same side 
-- not possible */
 
        /* compute half-vector of the refraction (eq. 16) */
-       float3 ht = -(m_eta * omega_in + I);
+       float3 ht;
+       if(bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+               /* for thin surfaces refraction approximately cancels and thus 
specular transmission is modelled
+                * using a microfacet distribution which is simply reflected to 
the other side */
+               ht = -(omega_in + I);
+       }
+       else {
+               ht = -(m_eta * omega_in + I);
+       }
        float3 Ht = normalize(ht);
        float cosHO = dot(Ht, I);
        float cosHI = dot(Ht, omega_in);
@@ -541,7 +561,13 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const 
ShaderClosure *sc, con
 
        /* out = fabsf(cosHI * cosHO) * (m_eta * m_eta) * G * D / (cosNO * Ht2)
         * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */
-       float common = D * (m_eta * m_eta) / (cosNO * Ht2);
+       float common;
+       if(bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+               common = D * 0.25f / cosNO;
+       }
+       else {
+               common = D * (m_eta * m_eta) / (cosNO * Ht2);
+       }
        float out = G * fabsf(cosHI * cosHO) * common;
        *pdf = G1o * fabsf(cosHO * cosHI) * common;
 
@@ -553,7 +579,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals 
*kg, const ShaderClosure
        const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
        float alpha_x = bsdf->alpha_x;
        float alpha_y = bsdf->alpha_y;
-       bool m_refractive = bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+       bool m_refractive = bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID || bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
        float3 N = bsdf->N;
 
        float cosNO = dot(N, I);
@@ -685,6 +711,10 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals 
*kg, const ShaderClosure
                        float m_eta = bsdf->ior, fresnel;
                        bool inside;
 
+                       if(bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+                               m_eta = 1.0f;
+                       }
+
                        fresnel = fresnel_dielectric(m_eta, m, I, &R, &T,
 #ifdef __RAY_DIFFERENTIALS__
                                dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
@@ -1054,7 +1084,7 @@ ccl_device int 
bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
                                *domega_in_dy = dTdy;
 #endif
 
-                               if(alpha_x*alpha_y <= 1e-7f || fabsf(m_eta - 
1.0f) < 1e-4f) {
+                               if(alpha_x*alpha_y <= 1e-7f || (fabsf(m_eta - 
1.0f) < 1e-4f && bsdf->type != CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID)) 
{
                                        /* some high number for MIS */
                                        *pdf = 1e6f;
                                        *eval = make_float3(1e6f, 1e6f, 1e6f);
@@ -1081,7 +1111,13 @@ ccl_device int 
bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
                                        Ht2 *= Ht2;
 
                                        /* see eval function for derivation */
-                                       float common = D * (m_eta * m_eta) / 
(cosNO * Ht2);
+                                       float common;
+                                       if(bsdf->type == 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+                                               common = D * 0.25f / cosNO;
+                                       }
+                                       else {
+                                               common = D * (m_eta * m_eta) / 
(cosNO * Ht2);
+                                       }
                                        float out = G * fabsf(cosHI * cosHO) * 
common;
                                        *pdf = G1o * cosHO * fabsf(cosHI) * 
common;
 
diff --git a/intern/cycles/kernel/svm/svm_closure.h 
b/intern/cycles/kernel/svm/svm_closure.h
index 4958bfd..96d9984 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -437,6 +437,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                                                                 * Burley, 
Brent (Walt Disney Animation Studios) */
                                                                if(surface_type 
== THIN_SURFACE) {
                                                                        
refraction_roughness *= 0.65f * ior - 0.35f;
+                                                                       
//refraction_roughness = safe_sqrtf(refraction_roughness);
                                                                }
                                                                else {
                                                                        
refraction_roughness *= refraction_roughness;
diff --git a/intern/cycles/kernel/svm/svm_types.h 
b/intern/cycles/kernel/svm/svm_types.h
index 92aed74..821716d 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -425,6 +425,7 @@ typedef enum ClosureType {
        CLOSURE_BSDF_REFRACTION_ID,
        CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID,
        CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID,
+       CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID,
        CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID,
        CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID,
        CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID,
diff --git a/release/datafiles/locale b/release/datafiles/locale
index dc16605..2b3c19f 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit dc166057192ea882b5cc70484d4c8bacd7cb41b4
+Subproject commit 2b3c19f5f61fc72dba56a7edfdc4e55e2327dc1f
diff --git a/release/scripts/addons b/release/scripts/addons
index 06dad53..3d8df61 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 06dad53c80801e0e0919f086040e3d9c31bbd0a1
+Subproject commit 3d8df6195de4062b60783c6c7791904a5f0087a3
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 04af69b..a52733b 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 04af69be141a5757fc60b44cc1a5b72db524af30
+Subproject commit a52733b58d95ce60ecde95a9eca242e7319c285a

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to