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:
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl17
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl9
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c17
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h1
4 files changed, 19 insertions, 25 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 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 {