[Bf-blender-cvs] [acaf46db0ea] blender2.8: Workbench: Specular Highlights

Jeroen Bakker noreply at git.blender.org
Wed May 30 14:52:00 CEST 2018


Commit: acaf46db0ea7103aaa3f46092b3582611d37ca0f
Author: Jeroen Bakker
Date:   Wed May 30 14:40:57 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBacaf46db0ea7103aaa3f46092b3582611d37ca0f

Workbench: Specular Highlights

Added specular highlights for:
 - Solid studio shading
 - Texture studio shading

===================================================================

M	release/scripts/startup/bl_ui/properties_scene.py
M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenkernel/intern/studiolight.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 545d0d696dc..4f3b293faa3 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -442,6 +442,7 @@ class SCENE_PT_viewport_display(SceneButtonsPanel, Panel):
         scene = context.scene
         layout.prop(scene.display, "light_direction", text="")
         layout.prop(scene.display, "shadow_shift")
+        layout.prop(scene.display, "roughness")
 
 
 class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 0841f914e7e..c2a1037de32 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3527,6 +3527,9 @@ class VIEW3D_PT_shading(Panel):
                 if shading.studio_light_orientation == 'WORLD':
                     col.row().prop(shading, "studiolight_rot_z")
 
+                row = col.row()
+                row.prop(shading, "show_specular_highlights")
+
             col.separator()
 
             row = col.row()
diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c
index 2cdffb88212..4e7a0b2b9c5 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -57,7 +57,7 @@
 static ListBase studiolights;
 #define STUDIOLIGHT_EXTENSIONS ".jpg", ".hdr"
 #define STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE 8
-#define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT 64
+#define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT 32
 #define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH (STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT * 2)
 
 static const char *STUDIOLIGHT_CAMERA_FOLDER = "studiolights/camera/";
@@ -430,30 +430,27 @@ static void studiolight_calculate_light_direction(StudioLight *sl)
 	sl->light_direction[2] = -1.0f;
 
 	if ((sl->flag & STUDIOLIGHT_EXTERNAL_FILE) && (sl->flag & STUDIOLIGHT_ORIENTATION_WORLD)) {
-		ImBuf *ibuf = NULL;
-		ibuf = IMB_loadiffname(sl->path, 0, NULL);
+		BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_IRRADIANCE_IMAGE_CALCULATED);
+		ImBuf *ibuf = sl->equirectangular_irradiance_buffer;
 		if (ibuf) {
-			IMB_float_from_rect(ibuf);
 			/* go over every pixel, determine light, if higher calc direction off the light */
-			float col[4];
-			float direction[3];
 			float new_light;
-			for (int y = 0; y < ibuf->y; y ++) {
-				for (int x = 0; x < ibuf->x; x ++) {
-					nearest_interpolation_color_wrap(ibuf, NULL, col, x, y);
-					new_light = col[0] + col[1] + col[2];
+			float *color = ibuf->rect_float;
+			for (int y = 0; y < STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT; y ++) {
+				for (int x = 0; x < STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH; x ++) {
+					new_light = color[0] + color[1] + color[2];
 					if (new_light > best_light) {
-						float u = x / (float)ibuf->x;
-						float v = y / (float)ibuf->y;
-						equirectangular_to_direction(direction, u, v);
-						sl->light_direction[0] = direction[1];
-						sl->light_direction[1] = direction[0];
-						sl->light_direction[2] = direction[2];
+						float u = x / (float)STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH;
+						float v = y / (float)STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT;
+						equirectangular_to_direction(sl->light_direction, u, v);
+						SWAP(float, sl->light_direction[0], sl->light_direction[1]);
+						normalize_v3(sl->light_direction);
+						negate_v3(sl->light_direction);
 						best_light = new_light;
 					}
+					color += 4;
 				}
 			}
-			IMB_freeImBuf(ibuf);
 		}
 	}
 	sl->flag |= STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index bdac8067bb5..a4b5f53e0eb 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1494,4 +1494,22 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 	}
+
+	{
+		if (!DNA_struct_elem_find(fd->filesdna, "SceneDisplay", "float", "roughness")) {
+			for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+				scene->display.roughness = 0.0f;
+			}
+			for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
+				for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+					for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+						if (sl->spacetype == SPACE_VIEW3D) {
+							View3D *v3d = (View3D *)sl;
+							v3d->shading.flag |= V3D_SHADING_SPECULAR_HIGHLIGHTS;
+						}
+					}
+				}
+			}
+		}
+	}
 }
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 9bd240afe3a..0889ce9a334 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -149,7 +149,7 @@ static void eevee_cache_populate(void *vedata, Object *ob)
 		}
 	}
 	else if (!USE_SCENE_LIGHT(draw_ctx->v3d)) {
-		/* do not add any light sources to the cache */
+		/* do not add any scene light sources to the cache */
 	}
 	else if (ob->type == OB_LIGHTPROBE) {
 		if ((ob->base_flag & BASE_FROMDUPLI) != 0) {
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index d0b1c580e5f..c826a5b82fa 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -8,4 +8,6 @@ struct WorldData {
 	vec4 background_color_low;
 	vec4 background_color_high;
 	vec4 object_outline_color;
+	vec4 light_direction_vs;
+	float specular_sharpness;
 };
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index 35867a566f1..525b934d3be 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -10,7 +10,6 @@ uniform float lightMultiplier;
 uniform float shadowShift = 0.1;
 uniform mat3 normalWorldMatrix;
 
-uniform vec3 lightDirection; /* light direction in view space */
 
 layout(std140) uniform world_block {
 	WorldData world_data;
@@ -57,14 +56,17 @@ void main()
 
 
 #ifdef V3D_LIGHTING_STUDIO
-#ifdef STUDIOLIGHT_ORIENTATION_CAMERA
+  #ifdef STUDIOLIGHT_ORIENTATION_CAMERA
 	vec3 diffuse_light = get_camera_diffuse_light(world_data, normal_viewport);
-#endif
-#ifdef STUDIOLIGHT_ORIENTATION_WORLD
+  #endif
+
+  #ifdef STUDIOLIGHT_ORIENTATION_WORLD
 	vec3 normal_world = normalWorldMatrix * normal_viewport;
 	vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world);
-#endif
-	vec3 shaded_color = diffuse_light * diffuse_color.rgb;
+  #endif
+
+	vec3 specular_color = get_world_specular_light(world_data, normal_viewport, vec3(0.0, 0.0, 1.0));
+	vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color;
 
 #else /* V3D_LIGHTING_STUDIO */
 	vec3 shaded_color = diffuse_color.rgb;
@@ -72,7 +74,7 @@ void main()
 #endif /* V3D_LIGHTING_STUDIO */
 
 #ifdef V3D_SHADING_SHADOW
-	float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection));
+	float shadow_mix = step(-shadowShift, dot(normal_viewport, world_data.light_direction_vs.xyz));
 	float light_multiplier;
 	light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix);
 
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index 309ae063284..6585bac9289 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -36,7 +36,9 @@ void main()
 	vec3 normal_world = normalWorldMatrix * normal_viewport;
 	vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world);
 #endif
-	vec3 shaded_color = diffuse_light * diffuse_color.rgb;
+
+	vec3 specular_color = get_world_specular_light(world_data, normal_viewport, vec3(0.0, 0.0, 1.0));
+	vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color;
 
 #else /* V3D_LIGHTING_STUDIO */
 	vec3 shaded_color = diffuse_color.rgb;
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 6507f1ec707..7e476080b64 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
@@ -18,3 +18,19 @@ vec3 get_camera_diffuse_light(WorldData world_data, vec3 N)
 	result = mix(result, world_data.diffuse_light_y_neg, clamp(-N.z, 0.0, 1.0));
 	return result.xyz;
 }
+
+/* N And I are in View Space. */
+vec3 get_world_specular_light(WorldData world_data, vec3 N, vec3 I)
+{
+#ifdef V3D_SHADING_SPECULAR_HIGHLIGHTS
+	vec3 reflection_vector = reflect(I, N);
+	vec3 specular_light = vec3(1.0);
+	/* Simple frontal specular highlights. */
+	float specular_influence = pow(max(0.0, dot(world_data.light_direction_vs.xyz, reflection_vector)), world_data.specular_sharpness);
+	vec3 specular_color = specular_light * specular_influence;
+
+#else /* V3D_SHADING_SPECULAR_HIGHLIGHTS */
+	vec3 specular_color = vec3(0.0);
+#endif /* V3D_SHADING_SPECULAR_HIGHLIGHTS */
+	return specular_color;
+}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index bbd8c57a5b9..062a5b04988 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -5,6 +5,7 @@
 void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 {
 	const DRWContextState *draw_ctx = DRW_context_state_get();
+	Scene *scene = dr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list