Cycles: principled absorption color now has more effect at lower values.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 28 Feb 2018 03:36:55 +0000 (04:36 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 28 Feb 2018 19:11:53 +0000 (20:11 +0100)
intern/cycles/kernel/shaders/node_principled_volume.osl
intern/cycles/kernel/svm/svm_closure.h
intern/cycles/util/util_math_float3.h

index 609fb95866d3f61b2ea6d2e599e26a302254f3cb..ea8d6ab12c58f7de1ec182b397bee3522b0d504c 100644 (file)
@@ -51,7 +51,8 @@ shader node_principled_volume(
 
                /* Add scattering and absorption closures. */
                color scatter_coeff = scatter_color;
 
                /* Add scattering and absorption closures. */
                color scatter_coeff = scatter_color;
-               color absorption_coeff = max(1.0 - scatter_color, 0.0) * max(1.0 - AbsorptionColor, 0.0);
+               color absorption_color = sqrt(max(AbsorptionColor, 0.0));
+               color absorption_coeff = max(1.0 - scatter_color, 0.0) * max(1.0 - absorption_color, 0.0);
                Volume = scatter_coeff * density * henyey_greenstein(Anisotropy) +
                         absorption_coeff * density * absorption();
        }
                Volume = scatter_coeff * density * henyey_greenstein(Anisotropy) +
                         absorption_coeff * density * absorption();
        }
index 819b256bde0b9cf28fa448a072805a04f3598abc..a54095ed127f0b3909fbf998eeb232664db25a6b 100644 (file)
@@ -893,7 +893,7 @@ ccl_device void svm_node_principled_volume(KernelGlobals *kg, ShaderData *sd, fl
                /* Add extinction weight. */
                float3 zero = make_float3(0.0f, 0.0f, 0.0f);
                float3 one = make_float3(1.0f, 1.0f, 1.0f);
                /* Add extinction weight. */
                float3 zero = make_float3(0.0f, 0.0f, 0.0f);
                float3 one = make_float3(1.0f, 1.0f, 1.0f);
-               float3 absorption_color = stack_load_float3(stack, absorption_color_offset);
+               float3 absorption_color = max(sqrt(stack_load_float3(stack, absorption_color_offset)), zero);
                float3 absorption = max(one - color, zero) * max(one - absorption_color, zero);
                volume_extinction_setup(sd, (color + absorption) * density);
        }
                float3 absorption = max(one - color, zero) * max(one - absorption_color, zero);
                volume_extinction_setup(sd, (color + absorption) * density);
        }
index e0a89b539b0012807dcd0c9cafb2aa2e88fdf9b1..a0a62ae95df1926869e3642288501b676714fe17 100644 (file)
@@ -57,6 +57,7 @@ ccl_device_inline float3 clamp(const float3& a, const float3& mn, const float3&
 ccl_device_inline float3 fabs(const float3& a);
 ccl_device_inline float3 mix(const float3& a, const float3& b, float t);
 ccl_device_inline float3 rcp(const float3& a);
 ccl_device_inline float3 fabs(const float3& a);
 ccl_device_inline float3 mix(const float3& a, const float3& b, float t);
 ccl_device_inline float3 rcp(const float3& a);
+ccl_device_inline float3 sqrt(const float3& a);
 #endif  /* !__KERNEL_OPENCL__ */
 
 ccl_device_inline float min3(float3 a);
 #endif  /* !__KERNEL_OPENCL__ */
 
 ccl_device_inline float min3(float3 a);
@@ -270,6 +271,15 @@ ccl_device_inline float3 fabs(const float3& a)
 #endif
 }
 
 #endif
 }
 
+ccl_device_inline float3 sqrt(const float3& a)
+{
+#ifdef __KERNEL_SSE__
+       return float3(_mm_sqrt_ps(a));
+#else
+       return make_float3(sqrtf(a.x), sqrtf(a.y), sqrtf(a.z));
+#endif
+}
+
 ccl_device_inline float3 mix(const float3& a, const float3& b, float t)
 {
        return a + t*(b - a);
 ccl_device_inline float3 mix(const float3& a, const float3& b, float t)
 {
        return a + t*(b - a);