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:
authorJeroen Bakker <j.bakker@atmind.nl>2018-04-19 15:48:53 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-04-19 15:48:53 +0300
commita305652d87b7d14562e8e22aefe9073f34d2f06e (patch)
tree8adfa7f596c9f07fcdda1e84d2aebcd7b2b1a2e5
parent0a679c6b685a4a046a9c4074cff8c508d6f91618 (diff)
Workbench: Diffuse studio lighting
-rw-r--r--source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl22
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl22
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_studio_vert.glsl4
3 files changed, 42 insertions, 6 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl b/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl
index 46f5409e4ca..96e65e2919e 100644
--- a/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl
@@ -1,11 +1,29 @@
uniform vec3 color;
+uniform vec3 light_direction = vec3(0.0, 0.0, 1.0);
-in vec3 normal;
+uniform vec3 world_diffuse_light_xp = vec3(0.5, 0.5, 0.6);
+uniform vec3 world_diffuse_light_xn = vec3(0.5, 0.5, 0.6);
+uniform vec3 world_diffuse_light_yp = vec3(0.5, 0.5, 0.6);
+uniform vec3 world_diffuse_light_yn = vec3(0.5, 0.5, 0.6);
+uniform vec3 world_diffuse_light_zp = vec3(0.8, 0.8, 0.8);
+uniform vec3 world_diffuse_light_zn = vec3(0.0, 0.0, 0.0);
+
+in vec3 normal_viewport;
out vec4 fragColor;
+#define USE_WORLD_DIFFUSE
+#define AMBIENT_COLOR vec3(0.2, 0.2, 0.2)
void main()
{
- float intensity = lambert_diffuse(vec3(0.0, 0.0, 1.0), normal);
+
+#ifdef USE_WORLD_DIFFUSE
+ vec3 diffuse_light_color = get_world_diffuse_light(normal_viewport, world_diffuse_light_xp, world_diffuse_light_xn, world_diffuse_light_yp, world_diffuse_light_yn, world_diffuse_light_zp, world_diffuse_light_zn);
+ vec3 shaded_color = (AMBIENT_COLOR + diffuse_light_color) * color;
+
+#else
+ float intensity = lambert_diffuse(light_direction, normal_viewport);
vec3 shaded_color = color * intensity;
+
+#endif
fragColor = vec4(shaded_color, 1.0);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl
index c4ac62c2cfc..22a55a386f7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl
@@ -1,3 +1,21 @@
-float lambert_diffuse(vec3 light_direction, vec3 surface_normal) {
- return max(0.0, dot(light_direction, surface_normal));
+float normalized_dot(vec3 v1, vec3 v2)
+{
+ return max(0.0, dot(v1, v2));
}
+
+float lambert_diffuse(vec3 light_direction, vec3 surface_normal)
+{
+ return normalized_dot(light_direction, surface_normal);
+}
+
+vec3 get_world_diffuse_light(vec3 N, vec3 xp, vec3 xn, vec3 yp, vec3 yn, vec3 zp, vec3 zn)
+{
+ vec3 result = vec3(0.0, 0.0, 0.0);
+ result = mix(result, xp, normalized_dot(vec3( 1.0, 0.0, 0.0), N));
+ result = mix(result, xn, normalized_dot(vec3(-1.0, 0.0, 0.0), N));
+ result = mix(result, yp, normalized_dot(vec3( 0.0, 1.0, 0.0), N));
+ result = mix(result, yn, normalized_dot(vec3( 0.0, -1.0, 0.0), N));
+ result = mix(result, zp, normalized_dot(vec3( 0.0, 0.0, 1.0), N));
+ result = mix(result, zn, normalized_dot(vec3( 0.0, 0.0, -1.0), N));
+ return result;
+} \ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_studio_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_studio_vert.glsl
index 819caa6e807..2da5deabfc2 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_studio_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_studio_vert.glsl
@@ -4,10 +4,10 @@ uniform mat3 NormalMatrix;
in vec3 pos;
in vec3 nor;
-out vec3 normal;
+out vec3 normal_viewport;
void main()
{
- normal = normalize(NormalMatrix * nor);
+ normal_viewport = normalize(NormalMatrix * nor);
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
}