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 | |
parent | 7613ffc944ebc133f1f906ea737ab55718434cc4 (diff) |
Cycles: add roughness baking support, using squared roughness convention.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/blender/addon/properties.py | 1 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_bake.h | 34 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 26 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/bake.cpp | 2 |
6 files changed, 49 insertions, 17 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 1b95c365616..8dbd80f3747 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -571,6 +571,7 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): ('SHADOW', "Shadow", ""), ('NORMAL', "Normal", ""), ('UV', "UV", ""), + ('ROUGHNESS', "Roughness", ""), ('EMIT', "Emit", ""), ('ENVIRONMENT', "Environment", ""), ('DIFFUSE', "Diffuse", ""), diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 9d1e87b763c..00d23b9095e 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -252,6 +252,8 @@ static ShaderEvalType get_shader_type(const string& pass_type) return SHADER_EVAL_NORMAL; else if(strcmp(shader_type, "UV")==0) return SHADER_EVAL_UV; + else if(strcmp(shader_type, "ROUGHNESS")==0) + return SHADER_EVAL_ROUGHNESS; else if(strcmp(shader_type, "DIFFUSE_COLOR")==0) return SHADER_EVAL_DIFFUSE_COLOR; else if(strcmp(shader_type, "GLOSSY_COLOR")==0) diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h index b3c2450d10e..79e6d1b4862 100644 --- a/intern/cycles/kernel/kernel_bake.h +++ b/intern/cycles/kernel/kernel_bake.h @@ -330,15 +330,30 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input, switch(type) { /* data passes */ case SHADER_EVAL_NORMAL: + case SHADER_EVAL_ROUGHNESS: + case SHADER_EVAL_EMISSION: { - float3 N = sd.N; - if((sd.flag & SD_HAS_BUMP)) { - shader_eval_surface(kg, &sd, &state, 0); - N = shader_bsdf_average_normal(kg, &sd); + if(type != SHADER_EVAL_NORMAL || (sd.flag & SD_HAS_BUMP)) { + int path_flag = (type == SHADER_EVAL_EMISSION) ? PATH_RAY_EMISSION : 0; + shader_eval_surface(kg, &sd, &state, path_flag); } - /* encoding: normal = (2 * color) - 1 */ - out = N * 0.5f + make_float3(0.5f, 0.5f, 0.5f); + if(type == SHADER_EVAL_NORMAL) { + float3 N = sd.N; + if(sd.flag & SD_HAS_BUMP) { + N = shader_bsdf_average_normal(kg, &sd); + } + + /* encoding: normal = (2 * color) - 1 */ + out = N * 0.5f + make_float3(0.5f, 0.5f, 0.5f); + } + else if(type == SHADER_EVAL_ROUGHNESS) { + float roughness = shader_bsdf_average_roughness(&sd); + out = make_float3(roughness, roughness, roughness); + } + else { + out = shader_emissive_eval(kg, &sd); + } break; } case SHADER_EVAL_UV: @@ -346,13 +361,6 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input, out = primitive_uv(kg, &sd); break; } - case SHADER_EVAL_EMISSION: - { - shader_eval_surface(kg, &sd, &state, PATH_RAY_EMISSION); - out = shader_emissive_eval(kg, &sd); - break; - } - #ifdef __PASSES__ /* light passes */ case SHADER_EVAL_AO: 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)); } } diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 977ceac12ea..11657003259 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -263,6 +263,7 @@ typedef enum ShaderEvalType { /* data passes */ SHADER_EVAL_NORMAL, SHADER_EVAL_UV, + SHADER_EVAL_ROUGHNESS, SHADER_EVAL_DIFFUSE_COLOR, SHADER_EVAL_GLOSSY_COLOR, SHADER_EVAL_TRANSMISSION_COLOR, diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp index 1fef7a0188f..927e04abc7f 100644 --- a/intern/cycles/render/bake.cpp +++ b/intern/cycles/render/bake.cpp @@ -247,7 +247,7 @@ void BakeManager::device_free(Device * /*device*/, DeviceScene * /*dscene*/) int BakeManager::aa_samples(Scene *scene, BakeData *bake_data, ShaderEvalType type) { - if(type == SHADER_EVAL_UV) { + if(type == SHADER_EVAL_UV || type == SHADER_EVAL_ROUGHNESS) { return 1; } else if(type == SHADER_EVAL_NORMAL) { |