Cycles: principled absorption color now has more effect at lower values.

This commit is contained in:
Brecht Van Lommel 2018-02-28 04:36:55 +01:00
parent 4762c099d7
commit 8cc7f48581
3 changed files with 13 additions and 2 deletions

@ -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();
}

@ -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);
}

@ -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);