diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-02-28 23:33:40 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-02-28 23:34:09 +0300 |
commit | 33b6f944c673bf76de9d5ed955f0e6ab1fe10aac (patch) | |
tree | 55897a3c771de37a85dcc3b9e24c8ef73234cb63 /intern | |
parent | 382218beb29f52e1ea5c10803edf95a937878308 (diff) | |
parent | 03d10703783a0d233517aac558ac3f0a7d55d302 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/shaders/node_principled_volume.osl | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 2 | ||||
-rw-r--r-- | intern/cycles/util/util_math_float3.h | 10 |
3 files changed, 13 insertions, 2 deletions
diff --git a/intern/cycles/kernel/shaders/node_principled_volume.osl b/intern/cycles/kernel/shaders/node_principled_volume.osl index 609fb95866d..ea8d6ab12c5 100644 --- a/intern/cycles/kernel/shaders/node_principled_volume.osl +++ b/intern/cycles/kernel/shaders/node_principled_volume.osl @@ -51,7 +51,8 @@ shader node_principled_volume( /* 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(); } diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 819b256bde0..a54095ed127 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -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); - 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); } diff --git a/intern/cycles/util/util_math_float3.h b/intern/cycles/util/util_math_float3.h index e0a89b539b0..a0a62ae95df 100644 --- a/intern/cycles/util/util_math_float3.h +++ b/intern/cycles/util/util_math_float3.h @@ -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 sqrt(const 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 } +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); |