Commit: b12151eceb76cab4a49f9df661ce6156bbeaaa21
Author: Brecht Van Lommel
Date:   Sun Jun 8 12:46:12 2014 +0200
https://developer.blender.org/rBb12151eceb76cab4a49f9df661ce6156bbeaaa21

Cycles: glossy and anisotropic BSDF changes

* Anisotropic BSDF now supports GGX and Beckmann distributions, Ward has been
  removed because other distributions are superior.
* GGX is now the default distribution for all glossy and anisotropic nodes,
  since it looks good, has low noise and is fast to evaluate.
* Ashikhmin-Shirley is now available in the Glossy BSDF.

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

M       intern/cycles/blender/blender_shader.cpp
M       intern/cycles/kernel/CMakeLists.txt
M       intern/cycles/kernel/closure/bsdf.h
M       intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
M       intern/cycles/kernel/closure/bsdf_microfacet.h
D       intern/cycles/kernel/closure/bsdf_ward.h
M       intern/cycles/kernel/osl/osl_closures.cpp
M       intern/cycles/kernel/shaders/node_anisotropic_bsdf.osl
M       intern/cycles/kernel/shaders/node_glossy_bsdf.osl
M       intern/cycles/kernel/shaders/stdosl.h
M       intern/cycles/kernel/svm/svm_closure.h
M       intern/cycles/kernel/svm/svm_types.h
M       intern/cycles/render/nodes.cpp
M       source/blender/makesdna/DNA_node_types.h
M       source/blender/makesrna/intern/rna_nodetree.c
M       source/blender/nodes/NOD_static_types.h
M       source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c
M       source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
M       source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
M       source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c

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

diff --git a/intern/cycles/blender/blender_shader.cpp 
b/intern/cycles/blender/blender_shader.cpp
index 226e7a7..318ca10 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -323,13 +323,18 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData 
b_data, BL::Scene b_scen
 
                switch (b_aniso_node.distribution())
                {
+               case BL::ShaderNodeBsdfAnisotropic::distribution_SHARP:
+                       aniso->distribution = ustring("Sharp");
+                       break;
+               case BL::ShaderNodeBsdfAnisotropic::distribution_BECKMANN:
+                       aniso->distribution = ustring("Beckmann");
+                       break;
+               case BL::ShaderNodeBsdfAnisotropic::distribution_GGX:
+                       aniso->distribution = ustring("GGX");
+                       break;
                case 
BL::ShaderNodeBsdfAnisotropic::distribution_ASHIKHMIN_SHIRLEY:
                        aniso->distribution = ustring("Ashikhmin-Shirley");
                        break;
-               case BL::ShaderNodeBsdfAnisotropic::distribution_WARD:
-               default:
-                       aniso->distribution = ustring("Ward");
-                       break;
                }
 
                node = aniso;
@@ -367,6 +372,9 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData 
b_data, BL::Scene b_scen
                case BL::ShaderNodeBsdfGlossy::distribution_GGX:
                        glossy->distribution = ustring("GGX");
                        break;
+               case BL::ShaderNodeBsdfGlossy::distribution_ASHIKHMIN_SHIRLEY:
+                       glossy->distribution = ustring("Ashikhmin-Shirley");
+                       break;
                }
                node = glossy;
        }
diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index 6b6fcb1..58142ee 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -60,7 +60,6 @@ set(SRC_CLOSURE_HEADERS
        closure/bsdf_toon.h
        closure/bsdf_transparent.h
        closure/bsdf_util.h
-       closure/bsdf_ward.h
        closure/bsdf_ashikhmin_shirley.h
        closure/bsdf_westin.h
        closure/bsdf_hair.h
diff --git a/intern/cycles/kernel/closure/bsdf.h 
b/intern/cycles/kernel/closure/bsdf.h
index 371d0bf..8ddf497 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -24,7 +24,6 @@
 #include "../closure/bsdf_refraction.h"
 #include "../closure/bsdf_transparent.h"
 #ifdef __ANISOTROPIC__
-#include "../closure/bsdf_ward.h"
 #include "../closure/bsdf_ashikhmin_shirley.h"
 #endif
 #include "../closure/bsdf_westin.h"
@@ -84,21 +83,20 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const 
ShaderData *sd, const Shader
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                        label = bsdf_microfacet_ggx_sample(sc, sd->Ng, sd->I, 
sd->dI.dx, sd->dI.dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+               case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
                        label = bsdf_microfacet_beckmann_sample(sc, sd->Ng, 
sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
 #ifdef __ANISOTROPIC__
-               case CLOSURE_BSDF_WARD_ID:
-                       label = bsdf_ward_sample(sc, sd->Ng, sd->I, sd->dI.dx, 
sd->dI.dy, randu, randv,
-                               eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
-                       break;
                case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
+               case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
                        label = bsdf_ashikhmin_shirley_sample(sc, sd->Ng, 
sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
@@ -183,18 +181,18 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                                eval = bsdf_transparent_eval_reflect(sc, sd->I, 
omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_MICROFACET_GGX_ID:
+                       case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                                eval = bsdf_microfacet_ggx_eval_reflect(sc, 
sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+                       case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
                                eval = 
bsdf_microfacet_beckmann_eval_reflect(sc, sd->I, omega_in, pdf);
                                break;
 #ifdef __ANISOTROPIC__
-                       case CLOSURE_BSDF_WARD_ID:
-                               eval = bsdf_ward_eval_reflect(sc, sd->I, 
omega_in, pdf);
-                               break;
                        case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
+                       case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
                                eval = bsdf_ashikhmin_shirley_eval_reflect(sc, 
sd->I, omega_in, pdf);
                                break;
 #endif
@@ -253,18 +251,18 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                                eval = bsdf_transparent_eval_transmit(sc, 
sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_MICROFACET_GGX_ID:
+                       case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                                eval = bsdf_microfacet_ggx_eval_transmit(sc, 
sd->I, omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+                       case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
                                eval = 
bsdf_microfacet_beckmann_eval_transmit(sc, sd->I, omega_in, pdf);
                                break;
 #ifdef __ANISOTROPIC__
-                       case CLOSURE_BSDF_WARD_ID:
-                               eval = bsdf_ward_eval_transmit(sc, sd->I, 
omega_in, pdf);
-                               break;
                        case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
+                       case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
                                eval = bsdf_ashikhmin_shirley_eval_transmit(sc, 
sd->I, omega_in, pdf);
                                break;
 #endif
@@ -341,18 +339,18 @@ ccl_device void bsdf_blur(KernelGlobals *kg, 
ShaderClosure *sc, float roughness)
                        bsdf_transparent_blur(sc, roughness);
                        break;
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                        bsdf_microfacet_ggx_blur(sc, roughness);
                        break;
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+               case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
                        bsdf_microfacet_beckmann_blur(sc, roughness);
                        break;
 #ifdef __ANISOTROPIC__
-               case CLOSURE_BSDF_WARD_ID:
-                       bsdf_ward_blur(sc, roughness);
-                       break;
                case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
+               case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
                        bsdf_ashikhmin_shirley_blur(sc, roughness);
                        break;
 #endif
diff --git a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h 
b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
index ea5b610..6a5d041 100644
--- a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
+++ b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
@@ -31,16 +31,28 @@ Other than that, the implementation directly follows the 
paper.
 
 CCL_NAMESPACE_BEGIN
 
-
 ccl_device int bsdf_ashikhmin_shirley_setup(ShaderClosure *sc)
 {
-       sc->data0 = clamp(sc->data0, 1e-4f, 1.0f); /* store roughness. could 
already convert to exponent to save some cycles in eval, */
-       sc->data1 = clamp(sc->data1, 1e-4f, 1.0f); /* but this is more 
consistent with other bsdfs and shader_blur. */
+       /* store roughness. could already convert to exponent to save some 
cycles
+        * in eval, but this is more consistent with other bsdfs and 
shader_blur. */
+       sc->data0 = clamp(sc->data0, 1e-4f, 1.0f);
+       sc->data1 = sc->data0;
 
        sc->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID;
        return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_GLOSSY;
 }
 
+ccl_device int bsdf_ashikhmin_shirley_aniso_setup(ShaderClosure *sc)
+{
+       /* store roughness. could already convert to exponent to save some 
cycles
+        * in eval, but this is more consistent with other bsdfs and 
shader_blur. */
+       sc->data0 = clamp(sc->data0, 1e-4f, 1.0f);
+       sc->data1 = clamp(sc->data1, 1e-4f, 1.0f);
+
+       sc->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
+       return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_GLOSSY;
+}
+
 ccl_device void bsdf_ashikhmin_shirley_blur(ShaderClosure *sc, float roughness)
 {
        sc->data0 = fmaxf(roughness, sc->data0); /* clamp roughness */
@@ -55,7 +67,6 @@ ccl_device_inline float 
bsdf_ashikhmin_shirley_roughness_to_exponent(float rough
 ccl_device float3 bsdf_ashikhmin_shirley_eval_reflect(const ShaderClosure *sc, 
const float3 I, const float3 omega_in, float *pdf)
 {
        float3 N = sc->N;
-       float3 T = sc->T;
 
        float NdotI = dot(N, I);           /* in Cycles/OSL convention I is 
omega_out    */
        float NdotO = dot(N, omega_in);    /* and consequently we use for O 
omaga_in ;)  */
@@ -85,7 +96,7 @@ ccl_device float3 bsdf_ashikhmin_shirley_eval_reflect(const 
ShaderClosure *sc, c
                }
                else {             /* => ANisotropic case */
                        float3 X, Y;
-                       make_orthonormals_tangent(N, T, &X, &Y);
+                       make_orthonormals_tangent(N, sc->T, &X, &Y);
 
                        float HdotX = dot(H, X);
                        float HdotY = dot(H, Y);
@@ -117,7 +128,6 @@ ccl_device_inline void 
bsdf_ashikhmin_shirley_sample_first_quadrant(float n_x, f
 ccl_device int bsdf_ashikhmin_shirley_sample(const ShaderClosure *sc, float3 
Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, 
float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
        float3 N = sc->N;
-       float3 T = sc->T;
 
        float NdotI = dot(N, I);
        if (NdotI > 0.0f) {
@@ -127,7 +137,11 @@ ccl_device int bsdf_ashikhmin_shirley_sample(const 
ShaderClosure *sc, float3 Ng,
 
                /* get x,y basis on the surface for anisotropy */
                float3 X, Y;
-               make_orthonormals_tangent(N, T, &X, &Y);
+
+               if(n_x == n_y)
+                       make_orthonormals(N, &X, &Y);
+               else
+                       make_orthonormals_tangent(N, sc->T, &X, &Y);
 
                /* sample spherical coords for h in tangent space */
                float phi;
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h 
b/intern/cycles/kernel/closure/bsdf_microfacet.h
index b9b682c..4a3d223 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -365,7 +365,7 @@ ccl_device int 
bsdf_microfacet_ggx_aniso_setup(ShaderClosure *sc)
        sc->data0 = clamp(sc->data0, 0.0f, 1.0f); /* alpha_x */
        sc->data1 = clamp(sc->data1, 0.0f, 1.0f); /* alpha_y */
        
-       sc->type = CLOSURE_BSDF_MICROFACET_GGX_ID;
+       sc->type = CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID;
 
        return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
 }
@@ -713,7 +713,7 @@ ccl_device int 
bsdf_microfacet_beckmann_aniso_setup(ShaderClosure *sc)
        sc->data0 = clamp(sc->data0, 0.0f, 1.0f); /* alpha_x */
        sc->data1 = 

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to