[Bf-blender-cvs] [2616a0a9d6e] draw-colormanagement: GPUViewport: Add fallback colormanagment

Clément Foucault noreply at git.blender.org
Sun Jan 26 21:08:49 CET 2020


Commit: 2616a0a9d6eba0b48164cf592488b83c7a7aa83c
Author: Clément Foucault
Date:   Sun Jan 26 17:32:53 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rB2616a0a9d6eba0b48164cf592488b83c7a7aa83c

GPUViewport: Add fallback colormanagment

Just assume sRGB display and no color correction.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_shader.c
M	source/blender/gpu/intern/gpu_viewport.c
R067	source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl	source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 8daeda67c80..0cd8cbb3bc2 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -167,7 +167,7 @@ data_to_c_simple(shaders/gpu_shader_2D_image_rect_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_image_multi_rect_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_desaturate_frag.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_image_linear_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_image_overlays_merge_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_shuffle_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_mask_uniform_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_modulate_alpha_frag.glsl SRC)
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index e877646310b..1339873ec67 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -183,7 +183,7 @@ typedef enum eGPUBuiltinShader {
   GPU_SHADER_3D_DEPTH_ONLY,
   GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR,
   /* basic image drawing */
-  GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB,
+  GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE,
   GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR,
   GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR,
   /**
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index ae2c7864e36..c950a1daaa5 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -80,7 +80,7 @@ extern char datatoc_gpu_shader_2D_nodelink_vert_glsl[];
 
 extern char datatoc_gpu_shader_3D_image_vert_glsl[];
 extern char datatoc_gpu_shader_image_frag_glsl[];
-extern char datatoc_gpu_shader_image_linear_frag_glsl[];
+extern char datatoc_gpu_shader_image_overlays_merge_frag_glsl[];
 extern char datatoc_gpu_shader_image_color_frag_glsl[];
 extern char datatoc_gpu_shader_image_desaturate_frag_glsl[];
 extern char datatoc_gpu_shader_image_varying_color_frag_glsl[];
@@ -1008,10 +1008,10 @@ static const GPUShaderStages builtin_shader_stages[GPU_SHADER_BUILTIN_LEN] = {
             .vert = datatoc_gpu_shader_2D_smooth_color_vert_glsl,
             .frag = datatoc_gpu_shader_2D_smooth_color_dithered_frag_glsl,
         },
-    [GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB] =
+    [GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE] =
         {
             .vert = datatoc_gpu_shader_2D_image_vert_glsl,
-            .frag = datatoc_gpu_shader_image_linear_frag_glsl,
+            .frag = datatoc_gpu_shader_image_overlays_merge_frag_glsl,
         },
     [GPU_SHADER_2D_IMAGE] =
         {
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index d459e38e1df..7daa0087091 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -522,34 +522,35 @@ void GPU_viewport_draw_to_screen(GPUViewport *viewport, const rcti *rect)
   }
 
   if (!use_ocio) {
-    /* TODO fallback. */
+    immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE);
+    immUniform1i("image_texture", 0);
+    immUniform1i("overlays_texture", 1);
   }
-  else {
-    GPU_texture_bind(color, 0);
-    GPU_texture_bind(color_overlay, 1);
 
-    immBegin(GPU_PRIM_TRI_STRIP, 4);
+  GPU_texture_bind(color, 0);
+  GPU_texture_bind(color_overlay, 1);
 
-    immAttr2f(texco, halfx, halfy);
-    immVertex2f(pos, x1, y1);
-    immAttr2f(texco, halfx + 1.0f, halfy);
-    immVertex2f(pos, x2, y1);
-    immAttr2f(texco, halfx, halfy + 1.0f);
-    immVertex2f(pos, x1, y2);
-    immAttr2f(texco, halfx + 1.0f, halfy + 1.0f);
-    immVertex2f(pos, x2, y2);
+  immBegin(GPU_PRIM_TRI_STRIP, 4);
 
-    immEnd();
+  immAttr2f(texco, halfx, halfy);
+  immVertex2f(pos, x1, y1);
+  immAttr2f(texco, halfx + 1.0f, halfy);
+  immVertex2f(pos, x2, y1);
+  immAttr2f(texco, halfx, halfy + 1.0f);
+  immVertex2f(pos, x1, y2);
+  immAttr2f(texco, halfx + 1.0f, halfy + 1.0f);
+  immVertex2f(pos, x2, y2);
 
-    GPU_texture_unbind(color);
-    GPU_texture_unbind(color_overlay);
-  }
+  immEnd();
+
+  GPU_texture_unbind(color);
+  GPU_texture_unbind(color_overlay);
 
   if (use_ocio) {
     IMB_colormanagement_finish_glsl_draw();
   }
   else {
-    /* TODO fallback. */
+    immUnbindProgram();
   }
 }
 
diff --git a/source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl b/source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
similarity index 67%
rename from source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl
rename to source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
index e6acdd446d3..0147a270aaa 100644
--- a/source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
@@ -1,7 +1,8 @@
 
 /* Display a linear image texture into sRGB space */
 
-uniform sampler2D image;
+uniform sampler2D image_texture;
+uniform sampler2D overlays_texture;
 
 in vec2 texCoord_interp;
 
@@ -27,7 +28,12 @@ void linearrgb_to_srgb(vec4 col_from, out vec4 col_to)
 
 void main()
 {
-  fragColor = texture(image, texCoord_interp.st);
+  fragColor = texture(image_texture, texCoord_interp.st);
+
+  vec4 overlay_col = texture(overlays_texture, texCoord_interp.st);
+
+  fragColor *= 1.0 - overlay_col.a;
+  fragColor += overlay_col;
 
   linearrgb_to_srgb(fragColor, fragColor);
 }



More information about the Bf-blender-cvs mailing list