diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-03-10 20:18:05 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-03-10 20:37:33 +0300 |
commit | 23ccf5767fea1d7f1b50405334249b1a7a69d5c9 (patch) | |
tree | 27168c3c202fcc21097018bf9908c75ada215467 /intern/cycles/kernel/kernel_shader.h | |
parent | 7613ffc944ebc133f1f906ea737ab55718434cc4 (diff) |
Cycles: add roughness baking support, using squared roughness convention.
Diffstat (limited to 'intern/cycles/kernel/kernel_shader.h')
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index fc8d06fc33d..937a50cba8b 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -763,6 +763,26 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, ShaderData *sd, return label; } +ccl_device float shader_bsdf_average_roughness(ShaderData *sd) +{ + float roughness = 0.0f; + float sum_weight = 0.0f; + + for(int i = 0; i < sd->num_closure; i++) { + ShaderClosure *sc = &sd->closure[i]; + + if(CLOSURE_IS_BSDF(sc->type)) { + /* sqrt once to undo the squaring from multiplying roughness on the + * two axes, and once for the squared roughness convention. */ + float weight = fabsf(average(sc->weight)); + roughness += weight * sqrtf(safe_sqrtf(bsdf_get_roughness_squared(sc))); + sum_weight += weight; + } + } + + return (sum_weight > 0.0f) ? roughness / sum_weight : 0.0f; +} + ccl_device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughness) { for(int i = 0; i < sd->num_closure; i++) { @@ -875,7 +895,7 @@ ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd) for(int i = 0; i < sd->num_closure; i++) { ShaderClosure *sc = &sd->closure[i]; if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) - N += sc->N*average(sc->weight); + N += sc->N*fabsf(average(sc->weight)); } return (is_zero(N))? sd->N : normalize(N); @@ -892,11 +912,11 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) { const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc; eval += sc->weight*ao_factor; - N += bsdf->N*average(sc->weight); + N += bsdf->N*fabsf(average(sc->weight)); } else if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type)) { eval += sc->weight; - N += sd->N*average(sc->weight); + N += sd->N*fabsf(average(sc->weight)); } } |