Commit: 472ab59f0879dd85798947f6493b69feccc3b4f6
Author: Thomas Dinges
Date:   Thu Jun 16 14:41:57 2016 +0200
Branches: experimental-build
https://developer.blender.org/rB472ab59f0879dd85798947f6493b69feccc3b4f6

Third attempt, too stupid to add new files. (D2002).

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

M       intern/cycles/blender/blender_shader.cpp
M       intern/cycles/kernel/CMakeLists.txt
M       intern/cycles/kernel/closure/bsdf.h
A       intern/cycles/kernel/closure/bsdf_microfacet_multi.h
A       intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
M       intern/cycles/kernel/closure/bsdf_util.h
M       intern/cycles/kernel/kernel_bake.h
M       intern/cycles/kernel/kernel_emission.h
M       intern/cycles/kernel/kernel_path.h
M       intern/cycles/kernel/kernel_path_branched.h
M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/kernel/kernel_shadow.h
M       intern/cycles/kernel/kernel_subsurface.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/split/kernel_shader_eval.h
M       intern/cycles/kernel/svm/svm_closure.h
M       intern/cycles/kernel/svm/svm_types.h
M       intern/cycles/render/nodes.cpp
M       intern/cycles/util/util_math.h
M       source/blender/makesdna/DNA_node_types.h
M       source/blender/makesrna/intern/rna_nodetree.c

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

diff --git a/intern/cycles/blender/blender_shader.cpp 
b/intern/cycles/blender/blender_shader.cpp
index 78a28b7..fbf7ee6 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -393,6 +393,9 @@ static ShaderNode *add_node(Scene *scene,
                        case BL::ShaderNodeBsdfAnisotropic::distribution_GGX:
                                aniso->distribution = 
CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID;
                                break;
+                       case 
BL::ShaderNodeBsdfAnisotropic::distribution_MULTI_GGX:
+                               aniso->distribution = 
CLOSURE_BSDF_MICROFACET_MULTI_GGX_ANISO_ID;
+                               break;
                        case 
BL::ShaderNodeBsdfAnisotropic::distribution_ASHIKHMIN_SHIRLEY:
                                aniso->distribution = 
CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
                                break;
@@ -439,6 +442,9 @@ static ShaderNode *add_node(Scene *scene,
                        case 
BL::ShaderNodeBsdfGlossy::distribution_ASHIKHMIN_SHIRLEY:
                                glossy->distribution = 
CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
                                break;
+                       case BL::ShaderNodeBsdfGlossy::distribution_MULTI_GGX:
+                               glossy->distribution = 
CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID;
+                               break;
                }
                node = glossy;
        }
@@ -455,6 +461,9 @@ static ShaderNode *add_node(Scene *scene,
                        case BL::ShaderNodeBsdfGlass::distribution_GGX:
                                glass->distribution = 
CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID;
                                break;
+                       case BL::ShaderNodeBsdfGlass::distribution_MULTI_GGX:
+                               glass->distribution = 
CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID;
+                               break;
                }
                node = glass;
        }
@@ -469,6 +478,8 @@ static ShaderNode *add_node(Scene *scene,
                                refraction->distribution = 
CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
                                break;
                        case BL::ShaderNodeBsdfRefraction::distribution_GGX:
+                       /* Multiscattering GGX isn't supported for the 
Refraction BSDF. */
+                       case 
BL::ShaderNodeBsdfRefraction::distribution_MULTI_GGX:
                                refraction->distribution = 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
                                break;
                }
diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index 61c484d..4f41ee0 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -76,6 +76,8 @@ set(SRC_CLOSURE_HEADERS
        closure/bsdf_diffuse.h
        closure/bsdf_diffuse_ramp.h
        closure/bsdf_microfacet.h
+       closure/bsdf_microfacet_multi.h
+       closure/bsdf_microfacet_multi_impl.h
        closure/bsdf_oren_nayar.h
        closure/bsdf_phong_ramp.h
        closure/bsdf_reflection.h
diff --git a/intern/cycles/kernel/closure/bsdf.h 
b/intern/cycles/kernel/closure/bsdf.h
index f0add80..f318a61 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -20,6 +20,7 @@
 #include "../closure/bsdf_phong_ramp.h"
 #include "../closure/bsdf_diffuse_ramp.h"
 #include "../closure/bsdf_microfacet.h"
+#include "../closure/bsdf_microfacet_multi.h"
 #include "../closure/bsdf_reflection.h"
 #include "../closure/bsdf_refraction.h"
 #include "../closure/bsdf_transparent.h"
@@ -35,7 +36,7 @@
 
 CCL_NAMESPACE_BEGIN
 
-ccl_device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const 
ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, 
differential3 *domega_in, float *pdf)
+ccl_device int bsdf_sample(KernelGlobals *kg, ShaderData *sd, const 
ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, 
differential3 *domega_in, float *pdf)
 {
        int label;
 
@@ -85,6 +86,14 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const 
ShaderData *sd, const Shader
                        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;
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+                       label = bsdf_microfacet_multi_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, &ccl_fetch(sd, lcg_state));
+                       break;
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                       label = bsdf_microfacet_multi_ggx_glass_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, &ccl_fetch(sd, lcg_state));
+                       break;
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -130,7 +139,7 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const 
ShaderData *sd, const Shader
        return label;
 }
 
-ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const 
ShaderClosure *sc, const float3 omega_in, float *pdf)
+ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData *sd, const 
ShaderClosure *sc, const float3 omega_in, float *pdf)
 {
        float3 eval;
 
@@ -172,6 +181,12 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                                eval = bsdf_microfacet_ggx_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf, 
&ccl_fetch(sd, lcg_state));
+                               break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_glass_eval_reflect(sc, ccl_fetch(sd, I), omega_in, 
pdf, &ccl_fetch(sd, lcg_state));
+                               break;
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -234,6 +249,12 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                                eval = bsdf_microfacet_ggx_eval_transmit(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf, 
&ccl_fetch(sd, lcg_state));
+                               break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_glass_eval_transmit(sc, ccl_fetch(sd, I), omega_in, 
pdf, &ccl_fetch(sd, lcg_state));
+                               break;
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -286,6 +307,10 @@ ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure 
*sc, float roughness)
 
 #ifdef __SVM__
        switch(sc->type) {
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                       bsdf_microfacet_multi_ggx_blur(sc, roughness);
+                       break;
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h 
b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
new file mode 100644
index 0000000..95e4518
--- /dev/null
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
@@ -0,0 +1,456 @@
+/*
+ * Copyright 2011-2016 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+/* Most of the code is based on the supplemental implementations from 
https://eheitzresearch.wordpress.com/240-2/. */
+
+/* === GGX Microfacet distribution functions === */
+
+/* Isotropic GGX microfacet distribution */
+ccl_device_inline float D_ggx(float3 wm, float alpha)
+{
+       wm.z *= wm.z;
+       alpha *= alpha;
+       float tmp = (1.0f - wm.z) + alpha * wm.z;
+       return alpha / (M_PI_F * tmp*tmp);
+}
+
+/* Anisotropic GGX microfacet distribution */
+ccl_device_inline float D_ggx_aniso(const float3 wm, const float2 alpha)
+{
+       float slope_x = -wm.x/alpha.x;
+       float slope_y = -wm.y/alpha.y;
+       float tmp = wm.z*wm.z + slope_x*slope_x + slope_y*slope_y;
+
+       return 1.0f / (M_PI_F * tmp*tmp * alpha.x*alpha.y);
+}
+
+/* Sample slope distribution (based on page 14 of the supplemental 
implementation). */
+ccl_device_inline float2 mf_sampleP22_11(const float cosI, const float2 randU)
+{
+       if(cosI > 0.9999f) {
+               const float r = sqrtf(randU.x / (1.0f - randU.x));
+               const float phi = M_2PI_F * randU.y;
+               return make_float2(r*cosf(phi), r*sinf(phi));
+       }
+
+       const float sinI = sqrtf(1.0f - cosI*cosI);
+       const float tanI = sinI/cosI;
+       const float projA = 0.5f * (cosI + 1.0f);
+       if(projA < 0.0001f)
+               return make_float2(0.0f, 0.0f);
+       const float c = 1.0f / projA;
+       const float A = 2.0f*randU.x / (cosI*c) - 1.0f;
+       const float tmp = 1.0f / (A*A-1.0f);
+       const float D = safe_sqrtf(tanI*tanI*tmp*tmp - (A*A-tanI*tanI)*tmp);
+
+       const float slopeX2 = tanI*tmp + D;
+       const float slopeX = (A < 0.0f || slopeX2 > 1.0f/tanI)? (tanI*tmp - D) 
: slopeX2;
+
+       float U2;
+       if(randU.y >= 0.5f)
+               U2 = 2.0f*(randU.y - 0.5f);
+       else
+               U2 = 2.0f*(0.5f - randU.y);
+       const float z = (U2*(U2*(U2*0.27385f-0.73369f)+0.46341f)) / 
(U2*(U2*(U2*0.093073f+0.309420f)-1.0f)+0.597999f);
+       const float slopeY = z * sqrtf(1.0f + slopeX*slopeX);
+
+       if(randU.y >= 0.5f)
+               return make_float2(slopeX, slopeY);
+       else
+               return make_float2(slopeX, -slopeY);
+}
+
+/* Visible normal sampling for the GGX distribution (based on page 7 of the 
supplemental implementation). */
+ccl_device_inline float3 mf_sample_vndf(const float3 wi, const float2 alpha, 
const float2 randU)
+{
+       const float3 wi_11 = normalize(make_float3(alpha.x*wi.x, alpha.y*wi.y, 
wi.z));
+       const float2 slope_11 = mf_sampleP22_11(wi_11.z, randU);
+
+       const float2 cossin_phi = normalize(make_float2(wi_11.x, wi_11.y));
+       const float slope_x = alpha.x*(cossin_phi.x * slope_11.x - cossin_phi.y 
* slope_11.y);
+       const float slope_y = alpha.y*(cossin_phi.y * slope_11.x + cossin_phi.x 
* slope_11.y);
+
+       kernel_assert(isfinite(slope_x));
+       

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to