From fa4388669005b9ca0cf0bc3855ee0c0e183c3b3a Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 25 Apr 2018 16:57:18 +0200 Subject: Workbench: make normal packing optional --- .../engines/workbench/shaders/workbench_common_lib.glsl | 14 ++++++++++---- .../workbench/shaders/workbench_composite_frag.glsl | 4 ++++ .../engines/workbench/shaders/workbench_prepass_frag.glsl | 7 ++++++- .../blender/draw/engines/workbench/workbench_materials.c | 10 +++++++++- source/blender/draw/engines/workbench/workbench_private.h | 1 + 5 files changed, 30 insertions(+), 6 deletions(-) (limited to 'source/blender/draw') 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; -- cgit v1.2.3