Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gpu_shader_compositor_chroma_matte.glsl « library « shaders « realtime_compositor « compositor « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5d6bea0c9db7ed415eec68147cf7e5ea01979a66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma BLENDER_REQUIRE(gpu_shader_common_math_utils.glsl)
#pragma BLENDER_REQUIRE(gpu_shader_common_color_utils.glsl)

/* Algorithm from the book Video Demystified. Chapter 7. Chroma Keying. */
void node_composite_chroma_matte(vec4 color,
                                 vec4 key,
                                 float acceptance,
                                 float cutoff,
                                 float falloff,
                                 out vec4 result,
                                 out float matte)
{
  vec4 color_ycca;
  rgba_to_ycca_itu_709(color, color_ycca);
  vec4 key_ycca;
  rgba_to_ycca_itu_709(key, key_ycca);

  /* Normalize the CrCb components into the [-1, 1] range. */
  vec2 color_cc = color_ycca.yz * 2.0 - 1.0;
  vec2 key_cc = key_ycca.yz * 2.0 - 1.0;

  /* Rotate the color onto the space of the key such that x axis of the color space passes through
   * the key color. */
  color_cc = vector_to_rotation_matrix(key_cc * vec2(1.0, -1.0)) * color_cc;

  /* Compute foreground key. If positive, the value is in the [0, 1] range. */
  float foreground_key = color_cc.x - (abs(color_cc.y) / acceptance);

  /* Negative foreground key values retain the original alpha. Positive values are scaled by the
   * falloff, while colors that make an angle less than the cutoff angle get a zero alpha. */
  float alpha = color.a;
  if (foreground_key > 0.0) {
    alpha = 1.0 - (foreground_key / falloff);

    if (abs(atan(color_cc.y, color_cc.x)) < (cutoff / 2.0)) {
      alpha = 0.0;
    }
  }

  /* Compute output. */
  matte = min(alpha, color.a);
  result = color * matte;
}