From d85fd8feeb1b493b891158fd4cc5ed8bd44c7990 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 4 May 2018 16:26:31 +0200 Subject: T54953: Use OCIO for display color management --- .../engines/workbench/shaders/workbench_common_lib.glsl | 17 ----------------- .../workbench/shaders/workbench_composite_frag.glsl | 9 ++++----- .../draw/engines/workbench/workbench_materials.c | 17 ++++++++++++++--- .../blender/draw/engines/workbench/workbench_private.h | 1 + 4 files changed, 19 insertions(+), 25 deletions(-) (limited to 'source/blender') 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 5fcadc21a2c..e9d9b8c02e8 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl @@ -33,20 +33,3 @@ vec2 normal_encode(vec3 n) float p = sqrt(n.z * 8.0 + 8.0); return vec2(n.xy / p + 0.5); } - -/* Linear to srgb conversion */ -const float SRGB_ALPHA = 0.055; -float linear_to_srgb(float channel) { - if(channel <= 0.0031308) { - return 12.92 * channel; - } else { - return (1.0 + SRGB_ALPHA) * pow(channel, 1.0/2.4) - SRGB_ALPHA; - } -} -vec3 linearrgb_to_srgb(vec3 rgb) { - return vec3( - linear_to_srgb(rgb.r), - linear_to_srgb(rgb.g), - linear_to_srgb(rgb.b) - ); -} 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 b032bb6a7b5..f93debc8d66 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl @@ -13,7 +13,6 @@ layout(std140) uniform world_block { WorldData world_data; }; - void main() { ivec2 texel = ivec2(gl_FragCoord.xy); @@ -22,7 +21,7 @@ void main() #ifndef V3D_DRAWOPTION_OBJECT_OVERLAP if (depth == 1.0) { - fragColor = vec4(linearrgb_to_srgb(background_color(world_data, uv_viewport.y)), 0.0); + fragColor = vec4(background_color(world_data, uv_viewport.y), 0.0); return; } #else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */ @@ -32,9 +31,9 @@ void main() if (object_id == NO_OBJECT_ID) { vec3 background = background_color(world_data, uv_viewport.y); if (object_overlap == 0.0) { - fragColor = vec4(linearrgb_to_srgb(background), 0.0); + fragColor = vec4(background, 0.0); } else { - fragColor = vec4(linearrgb_to_srgb(mix(objectOverlapColor, background, object_overlap)), 1.0-object_overlap); + fragColor = vec4(mix(objectOverlapColor, background, object_overlap), 1.0-object_overlap); } return; } @@ -64,5 +63,5 @@ void main() shaded_color = mix(objectOverlapColor, shaded_color, object_overlap); #endif /* V3D_DRAWOPTION_OBJECT_OVERLAP */ - fragColor = vec4(linearrgb_to_srgb(shaded_color), 1.0); + fragColor = vec4(shaded_color, 1.0); } diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 052ea75a7ff..a7f21223c22 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -50,6 +50,7 @@ static struct { struct GPUTexture *object_id_tx; /* ref only, not alloced */ struct GPUTexture *color_buffer_tx; /* ref only, not alloced */ struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */ + struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */ float light_direction[3]; /* world light direction for shadows */ int next_object_id; @@ -137,7 +138,9 @@ static char *workbench_build_prepass_frag(void) static int get_shader_index(WORKBENCH_PrivateData *wpd) { const int DRAWOPTIONS_MASK = V3D_DRAWOPTION_OBJECT_OVERLAP; - return ((wpd->drawtype_options & DRAWOPTIONS_MASK) << 2) + wpd->drawtype_lighting; + int index = (wpd->drawtype_options & DRAWOPTIONS_MASK); + index = (index << 2) + wpd->drawtype_lighting; + return index; } static void select_deferred_shaders(WORKBENCH_PrivateData *wpd) @@ -237,6 +240,7 @@ 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], GPU_R32UI, &draw_engine_workbench_solid); e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA8, &draw_engine_workbench_solid); + e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_solid); #ifdef WORKBENCH_ENCODE_NORMALS e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RG8, &draw_engine_workbench_solid); #else @@ -249,6 +253,10 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata) GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx), GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx), }); + GPU_framebuffer_ensure_config(&fbl->composite_fb, { + GPU_ATTACHMENT_TEXTURE(dtxl->depth), + GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx), + }); } /* Prepass */ @@ -524,16 +532,19 @@ void workbench_materials_draw_scene(WORKBENCH_Data *vedata) #else GPU_framebuffer_bind(dfbl->depth_only_fb); DRW_draw_pass(psl->shadow_pass); - GPU_framebuffer_bind(dfbl->default_fb); + GPU_framebuffer_bind(fbl->composite_fb); DRW_draw_pass(psl->composite_pass); DRW_draw_pass(psl->composite_shadow_pass); #endif } else { - GPU_framebuffer_bind(dfbl->default_fb); + GPU_framebuffer_bind(fbl->composite_fb); DRW_draw_pass(psl->composite_pass); } + GPU_framebuffer_bind(dfbl->color_only_fb); + DRW_transform_to_display(e_data.composite_buffer_tx); + BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN); DRW_UBO_FREE_SAFE(wpd->world_ubo); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 6b8acaebc82..6f1d833a551 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -36,6 +36,7 @@ typedef struct WORKBENCH_FramebufferList { struct GPUFrameBuffer *prepass_fb; + struct GPUFrameBuffer *composite_fb; } WORKBENCH_FramebufferList; typedef struct WORKBENCH_StorageList { -- cgit v1.2.3