diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-11-19 18:23:37 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-11-19 20:05:15 +0300 |
commit | 2b56d2183972a0cb3b1355652a6709599ae6af0d (patch) | |
tree | 82220c66ce9c3ff4dffaf71c49d5b8d28749bb96 /source | |
parent | 98f8b48e693177e2f64f7b403bf9bfc88900cc82 (diff) |
Workbench: Performance: Fix performance drop caused by specular lighting
In my test, the composite pass went from 1.52ms to 0.24ms when specular
lighting is enabled.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl index 3df3b7c78a0..1b93fc0014c 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl @@ -55,20 +55,20 @@ vec3 get_world_specular_light(vec4 specular_data, LightData light_data, vec3 N, #ifdef V3D_SHADING_SPECULAR_HIGHLIGHT vec3 specular_light = specular_data.rgb * light_data.specular_color.rgb * light_data.specular_color.a; - float shininess = exp2(10*(1.0-specular_data.a) + 1); + float shininess = exp2(10.0 * (1.0 - specular_data.a) + 1); # ifdef BLINN - float normalization_factor = (shininess + 8) / (8 * M_PI); + float normalization_factor = (shininess + 8.0) / (8.0 * M_PI); vec3 L = -light_data.light_direction_vs.xyz; vec3 halfDir = normalize(L + I); - float specAngle = max(dot(halfDir, N), 0.0); + float spec_angle = max(dot(halfDir, N), 0.0); float NL = max(dot(L, N), 0.0); - float specular_influence = pow(specAngle, shininess) * NL * normalization_factor; + float specular_influence = pow(spec_angle, shininess) * NL * normalization_factor; # else vec3 reflection_vector = reflect(I, N); - float specAngle = max(dot(light_data.light_direction_vs.xyz, reflection_vector), 0.0); - float specular_influence = pow(specAngle, shininess); + float spec_angle = max(dot(light_data.light_direction_vs.xyz, reflection_vector), 0.0); + float specular_influence = pow(spec_angle, shininess); # endif vec3 specular_color = specular_light * specular_influence; @@ -82,8 +82,15 @@ vec3 get_world_specular_light(vec4 specular_data, LightData light_data, vec3 N, vec3 get_world_specular_lights(WorldData world_data, vec4 specular_data, vec3 N, vec3 I) { vec3 specular_light = vec3(0.0); - for (int i = 0 ; i < world_data.num_lights ; i ++) { - specular_light += get_world_specular_light(specular_data, world_data.lights[i], N, I); + /* Manual loop unrolling provide much better perf. */ + if (world_data.num_lights > 0) { + specular_light += get_world_specular_light(specular_data, world_data.lights[0], N, I); + } + if (world_data.num_lights > 1) { + specular_light += get_world_specular_light(specular_data, world_data.lights[1], N, I); + } + if (world_data.num_lights > 2) { + specular_light += get_world_specular_light(specular_data, world_data.lights[2], N, I); } return specular_light; } |