diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-02-29 20:29:13 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-02-29 20:29:13 +0300 |
commit | e34ce36ea4dab3986d4d8d76961236543c8d4be4 (patch) | |
tree | 582c0b53d2b937216732b24e2bdb578ea34bffc4 | |
parent | 76a7ea0b7137b08ec12fa5181d448865e4440f00 (diff) |
Workbench: Refactor: Add specular toggle support
3 files changed, 51 insertions, 37 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl index 3aa37f1971d..5bba46b4a61 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl @@ -18,7 +18,7 @@ vec2 matcap_uv_compute(vec3 I, vec3 N, bool flipped) uniform sampler2D matcapDiffuseImage; uniform sampler2D matcapSpecularImage; -uniform bool useSpecular = false; +uniform bool useSpecularMatcap = false; vec3 get_matcap_lighting(vec3 base_color, vec3 N, vec3 I) { @@ -28,5 +28,5 @@ vec3 get_matcap_lighting(vec3 base_color, vec3 N, vec3 I) vec3 diffuse = textureLod(matcapDiffuseImage, uv, 0.0).rgb; vec3 specular = textureLod(matcapSpecularImage, uv, 0.0).rgb; - return diffuse * base_color + specular * float(useSpecular); + return diffuse * base_color + specular * float(useSpecularMatcap); } 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 61e4bc06411..e7c94c9b955 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 @@ -43,10 +43,20 @@ vec4 wrapped_lighting(vec4 NL, vec4 w) return clamp((NL + w) * denom, 0.0, 1.0); } +uniform bool useSpecularLighting = false; + vec3 get_world_lighting(vec3 base_color, float roughness, float metallic, vec3 N, vec3 I) { - vec3 specular_color = mix(vec3(0.05), base_color.rgb, metallic); - vec3 diffuse_color = mix(base_color.rgb, vec3(0.0), metallic); + vec3 specular_color, diffuse_color; + + if (useSpecularLighting) { + diffuse_color = mix(base_color, vec3(0.0), metallic); + specular_color = mix(vec3(0.05), base_color, metallic); + } + else { + diffuse_color = base_color; + specular_color = vec3(0.0); + } vec3 specular_light = world_data.ambient_color.rgb; vec3 diffuse_light = world_data.ambient_color.rgb; @@ -55,37 +65,37 @@ vec3 get_world_lighting(vec3 base_color, float roughness, float metallic, vec3 N world_data.lights[2].diffuse_color_wrap.a, world_data.lights[3].diffuse_color_wrap.a); -#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT - /* Prepare Specular computation. Eval 4 lights at once. */ - vec3 R = -reflect(I, N); - vec4 spec_angle, spec_NL, wrap_NL; - prep_specular(world_data.lights[0].direction.xyz, I, N, R, spec_NL.x, wrap_NL.x, spec_angle.x); - prep_specular(world_data.lights[1].direction.xyz, I, N, R, spec_NL.y, wrap_NL.y, spec_angle.y); - prep_specular(world_data.lights[2].direction.xyz, I, N, R, spec_NL.z, wrap_NL.z, spec_angle.z); - prep_specular(world_data.lights[3].direction.xyz, I, N, R, spec_NL.w, wrap_NL.w, spec_angle.w); - - vec4 gloss = vec4(1.0 - roughness); - /* Reduce gloss for smooth light. (simulate bigger light) */ - gloss *= 1.0 - wrap; - vec4 shininess = exp2(10.0 * gloss + 1.0); - - vec4 spec_light = blinn_specular(shininess, spec_angle, spec_NL); - - /* Simulate Env. light. */ - vec4 w = mix(wrap, vec4(1.0), roughness); - vec4 spec_env = wrapped_lighting(wrap_NL, w); - - spec_light = mix(spec_light, spec_env, wrap * wrap); - - /* Multiply result by lights specular colors. */ - specular_light += spec_light.x * world_data.lights[0].specular_color.rgb; - specular_light += spec_light.y * world_data.lights[1].specular_color.rgb; - specular_light += spec_light.z * world_data.lights[2].specular_color.rgb; - specular_light += spec_light.w * world_data.lights[3].specular_color.rgb; - - float NV = clamp(dot(N, I), 0.0, 1.0); - specular_color = brdf_approx(specular_color, roughness, NV); -#endif + if (useSpecularLighting) { + /* Prepare Specular computation. Eval 4 lights at once. */ + vec3 R = -reflect(I, N); + vec4 spec_angle, spec_NL, wrap_NL; + prep_specular(world_data.lights[0].direction.xyz, I, N, R, spec_NL.x, wrap_NL.x, spec_angle.x); + prep_specular(world_data.lights[1].direction.xyz, I, N, R, spec_NL.y, wrap_NL.y, spec_angle.y); + prep_specular(world_data.lights[2].direction.xyz, I, N, R, spec_NL.z, wrap_NL.z, spec_angle.z); + prep_specular(world_data.lights[3].direction.xyz, I, N, R, spec_NL.w, wrap_NL.w, spec_angle.w); + + vec4 gloss = vec4(1.0 - roughness); + /* Reduce gloss for smooth light. (simulate bigger light) */ + gloss *= 1.0 - wrap; + vec4 shininess = exp2(10.0 * gloss + 1.0); + + vec4 spec_light = blinn_specular(shininess, spec_angle, spec_NL); + + /* Simulate Env. light. */ + vec4 w = mix(wrap, vec4(1.0), roughness); + vec4 spec_env = wrapped_lighting(wrap_NL, w); + + spec_light = mix(spec_light, spec_env, wrap * wrap); + + /* Multiply result by lights specular colors. */ + specular_light += spec_light.x * world_data.lights[0].specular_color.rgb; + specular_light += spec_light.y * world_data.lights[1].specular_color.rgb; + specular_light += spec_light.z * world_data.lights[2].specular_color.rgb; + specular_light += spec_light.w * world_data.lights[3].specular_color.rgb; + + float NV = clamp(dot(N, I), 0.0, 1.0); + specular_color = brdf_approx(specular_color, roughness, NV); + } specular_light *= specular_color; /* Prepare diffuse computation. Eval 4 lights at once. */ diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c index 0a2a7733e56..e5535c700fe 100644 --- a/source/blender/draw/engines/workbench/workbench_opaque.c +++ b/source/blender/draw/engines/workbench/workbench_opaque.c @@ -127,16 +127,20 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data) DRW_shgroup_uniform_texture(grp, "materialBuffer", wpd->material_buffer_tx); DRW_shgroup_uniform_texture(grp, "normalBuffer", wpd->normal_buffer_tx); + const bool use_spec = workbench_is_specular_highlight_enabled(wpd); + if (STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)) { BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_MATCAP_DIFFUSE_GPUTEXTURE | STUDIOLIGHT_MATCAP_SPECULAR_GPUTEXTURE); - bool use_spec = workbench_is_specular_highlight_enabled(wpd); struct GPUTexture *diff_tx = wpd->studio_light->matcap_diffuse.gputexture; struct GPUTexture *spec_tx = wpd->studio_light->matcap_specular.gputexture; DRW_shgroup_uniform_texture(grp, "matcapDiffuseImage", diff_tx); DRW_shgroup_uniform_texture(grp, "matcapSpecularImage", use_spec ? spec_tx : diff_tx); - DRW_shgroup_uniform_bool_copy(grp, "useSpecular", use_spec); + DRW_shgroup_uniform_bool_copy(grp, "useSpecularMatcap", use_spec); + } + else if (STUDIOLIGHT_TYPE_STUDIO_ENABLED(wpd)) { + DRW_shgroup_uniform_bool_copy(grp, "useSpecularLighting", use_spec); } DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } |