[Bf-blender-cvs] [fa438866900] blender2.8-workbench: Workbench: make normal packing optional

Jeroen Bakker noreply at git.blender.org
Wed Apr 25 16:57:48 CEST 2018


Commit: fa4388669005b9ca0cf0bc3855ee0c0e183c3b3a
Author: Jeroen Bakker
Date:   Wed Apr 25 16:57:18 2018 +0200
Branches: blender2.8-workbench
https://developer.blender.org/rBfa4388669005b9ca0cf0bc3855ee0c0e183c3b3a

Workbench: make normal packing optional

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

M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

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
 }
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 934849caf55..6fc416c068e 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -75,6 +75,10 @@ static char *workbench_build_defines(WORKBENCH_PrivateData *wpd)
 		BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n");
 	}
 
+#ifdef WORKBENCH_ENCODE_NORMALS
+	BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
+#endif
+
 	str = BLI_dynstr_get_cstring(ds);
 	BLI_dynstr_free(ds);
 	return str;
@@ -201,7 +205,11 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata)
 		const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
 		e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_R_32U, &draw_engine_workbench_solid);
 		e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RGBA_8, &draw_engine_workbench_solid);
-		e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RG_8, &draw_engine_workbench_solid);
+#ifdef WORKBENCH_ENCODE_NORMALS
+		e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RGBA_8, &draw_engine_workbench_solid);
+#else
+		e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RGBA_32, &draw_engine_workbench_solid);
+#endif
 
 		GPU_framebuffer_ensure_config(&fbl->prepass_fb, {
 			GPU_ATTACHMENT_TEXTURE(dtxl->depth),
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index e1622b42e4c..d94cce6e880 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -32,6 +32,7 @@
 
 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
 #define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
+#define WORKBENCH_ENCODE_NORMALS
 
 typedef struct WORKBENCH_FramebufferList {
 	struct GPUFrameBuffer *prepass_fb;



More information about the Bf-blender-cvs mailing list