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:
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl14
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl4
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl7
3 files changed, 20 insertions, 5 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index 8b03b058301..008ab90d7a3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -15,21 +15,27 @@ float bayer_dither_noise() {
/* From http://aras-p.info/texts/CompactNormalStorage.html
* Using Method #4: Spheremap Transform */
-vec3 normal_decode(vec2 enc)
+vec3 normal_decode(vec3 enc)
{
- vec2 fenc = enc * 4.0 - 2.0;
+ vec2 fenc = enc.xy * 4.0 - 2.0;
float f = dot(fenc, fenc);
float g = sqrt(1.0 - f / 4.0);
vec3 n;
n.xy = fenc*g;
n.z = 1 - f / 2;
+
+ if (enc.z > 0.5) {
+ n = -n;
+ }
return n;
}
/* From http://aras-p.info/texts/CompactNormalStorage.html
* Using Method #4: Spheremap Transform */
-vec2 normal_encode(vec3 n)
+vec3 normal_encode(vec3 n)
{
float p = sqrt(n.z * 8.0 + 8.0);
- return n.xy / p + 0.5;
+ vec3 result = vec3(n.xyz / p + 0.5);
+ result.z = (gl_FrontFacing)? 0.0: 1.0;
+ return result;
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index ef0dd8519e7..89e5b882536 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -43,7 +43,11 @@ void main()
vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb;
#ifdef V3D_LIGHTING_STUDIO
+#ifdef WORKBENCH_ENCODE_NORMALS
+ vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rgb);
+#else
vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
+#endif
vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport);
vec3 shaded_color = diffuse_light * diffuse_color;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 0f7e5a1b170..32133914e65 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -5,11 +5,16 @@ in vec3 normal_viewport;
out uint objectId;
out vec3 diffuseColor;
-out vec2 normalViewport;
+out vec3 normalViewport;
+
void main()
{
objectId = uint(object_id);
diffuseColor = object_color;
+#ifdef WORKBENCH_ENCODE_NORMALS
normalViewport = normal_encode(normal_viewport);
+#else
+ normalViewport = normal_viewport;
+#endif
}