Fix T38439: allow IOR in range [0, inf] instead of [1, inf] in Cycles.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 3 Feb 2014 16:06:37 +0000 (17:06 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 3 Feb 2014 16:08:34 +0000 (17:08 +0100)
The same can be achieved by flipping normals on the mesh, but it can be
convenient to do this in the shader.

intern/cycles/kernel/shaders/node_fresnel.osl
intern/cycles/kernel/shaders/node_glass_bsdf.osl
intern/cycles/kernel/shaders/node_refraction_bsdf.osl
intern/cycles/kernel/svm/svm_closure.h
intern/cycles/kernel/svm/svm_fresnel.h
source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c
source/blender/nodes/shader/nodes/node_shader_fresnel.c

index ca463817840277cc5a571e21f9497a97bb8c7652..8c59d5bb51220ea74ee6e8e7e7ba83e0469c55d9 100644 (file)
@@ -22,7 +22,7 @@ shader node_fresnel(
        normal Normal = N,
        output float Fac = 0.0)
 {
-       float f = max(IOR, 1.0 + 1e-5);
+       float f = max(IOR, 1e-5);
        float eta = backfacing() ? 1.0 / f: f;
        float cosi = dot(I, Normal);
        Fac = fresnel_dielectric_cos(cosi, eta);
index c79785f2d6593645550912c319e84e4b2fb67e2c..9693419962126e97799107a1d452bab61461a047 100644 (file)
@@ -25,7 +25,7 @@ shader node_glass_bsdf(
        normal Normal = N,
        output closure color BSDF = 0)
 {
-       float f = max(IOR, 1.0 + 1e-5);
+       float f = max(IOR, 1e-5);
        float eta = backfacing() ? 1.0 / f: f;
        float cosi = dot(I, Normal);
        float Fr = fresnel_dielectric_cos(cosi, eta);
index a4e9d0825dbc5687690c306615fafeae24088dcb..f87b3a5dd8621d1f35b51de2aa352e7421f2cfe1 100644 (file)
@@ -24,7 +24,7 @@ shader node_refraction_bsdf(
        normal Normal = N,
        output closure color BSDF = 0)
 {
-       float f = max(IOR, 1.0 + 1e-5);
+       float f = max(IOR, 1e-5);
        float eta = backfacing() ? 1.0 / f: f;
 
        if (distribution == "Sharp")
index 42e66a79978a66fd51f9043c5345c10d37b7f711..2813e38d8f78bd35a52f5194e8cdae4f6af3fd22 100644 (file)
@@ -225,7 +225,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
                                sc->N = N;
                                sc->data0 = param1;
 
-                               float eta = fmaxf(param2, 1.0f + 1e-5f);
+                               float eta = fmaxf(param2, 1e-5f);
                                sc->data1 = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
 
                                /* setup bsdf */
@@ -247,7 +247,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
                                break;
 #endif
                        /* index of refraction */
-                       float eta = fmaxf(param2, 1.0f + 1e-5f);
+                       float eta = fmaxf(param2, 1e-5f);
                        eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
 
                        /* fresnel */
index 0a3d576cfe1c09d204cfdec8a7b5b13b6d048434..5def52205eb44a36fddd9fe1c192beb37de5bcf2 100644 (file)
@@ -25,7 +25,7 @@ ccl_device void svm_node_fresnel(ShaderData *sd, float *stack, uint ior_offset,
        float eta = (stack_valid(ior_offset))? stack_load_float(stack, ior_offset): __uint_as_float(ior_value);
        float3 normal_in = stack_valid(normal_offset)? stack_load_float3(stack, normal_offset): sd->N;
        
-       eta = fmaxf(eta, 1.0f + 1e-5f);
+       eta = fmaxf(eta, 1e-5f);
        eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
 
        float f = fresnel_dielectric_cos(dot(sd->I, normal_in), eta);
index 4b2a9cc333973678f28abc10336109a6f87915ee..a59cbd6f46ebc8608d8cc0312275cef581f2d319 100644 (file)
@@ -32,7 +32,7 @@
 static bNodeSocketTemplate sh_node_bsdf_glass_in[] = {
        {       SOCK_RGBA, 1, N_("Color"),              0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
        {       SOCK_FLOAT, 1, N_("Roughness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
-       {       SOCK_FLOAT, 1, N_("IOR"),               1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
+       {       SOCK_FLOAT, 1, N_("IOR"),               1.45f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
        {       SOCK_VECTOR, 1, N_("Normal"),   0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
        {       -1, 0, ""       }
 };
index ce69707e8552ac463c918e6147d6569d2ac28116..5d1bcc81adb6f7fd10ddda39056061f5a8c6c5d7 100644 (file)
@@ -32,7 +32,7 @@
 static bNodeSocketTemplate sh_node_bsdf_refraction_in[] = {
        {       SOCK_RGBA, 1, N_("Color"),              0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
        {       SOCK_FLOAT, 1, N_("Roughness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
-       {       SOCK_FLOAT, 1, N_("IOR"),               1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
+       {       SOCK_FLOAT, 1, N_("IOR"),               1.45f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
        {       SOCK_VECTOR, 1, N_("Normal"),   0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
        {       -1, 0, ""       }
 };
index adc51a06ce5255e02e4f98ea1b5570b7dc02a8a5..59d798dc80ce5ed3ba1b2d8951ea3227e18006ad 100644 (file)
@@ -29,7 +29,7 @@
 
 /* **************** Fresnel ******************** */
 static bNodeSocketTemplate sh_node_fresnel_in[] = {
-       {       SOCK_FLOAT, 1, N_("IOR"),       1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
+       {       SOCK_FLOAT, 1, N_("IOR"),       1.45f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
        {       SOCK_VECTOR, 1, N_("Normal"),   0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
        {       -1, 0, ""       }
 };