Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-02-29 20:29:13 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-02-29 20:29:13 +0300
commite34ce36ea4dab3986d4d8d76961236543c8d4be4 (patch)
tree582c0b53d2b937216732b24e2bdb578ea34bffc4
parent76a7ea0b7137b08ec12fa5181d448865e4440f00 (diff)
Workbench: Refactor: Add specular toggle support
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl4
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl76
-rw-r--r--source/blender/draw/engines/workbench/workbench_opaque.c8
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);
}