diff --git a/src/accelerator/ogl/image/image_kernel.cpp b/src/accelerator/ogl/image/image_kernel.cpp index ad9ce38043..52021912eb 100644 --- a/src/accelerator/ogl/image/image_kernel.cpp +++ b/src/accelerator/ogl/image/image_kernel.cpp @@ -308,6 +308,7 @@ struct image_kernel::impl // Setup shader shader_->use(); + shader_->set("is_straight_alpha", params.pix_desc.is_straight_alpha); shader_->set("plane[0]", texture_id::plane0); shader_->set("plane[1]", texture_id::plane1); shader_->set("plane[2]", texture_id::plane2); diff --git a/src/accelerator/ogl/image/shader.frag b/src/accelerator/ogl/image/shader.frag index af04f283af..b64b39c164 100644 --- a/src/accelerator/ogl/image/shader.frag +++ b/src/accelerator/ogl/image/shader.frag @@ -8,6 +8,8 @@ uniform sampler2D plane[4]; uniform sampler2D local_key; uniform sampler2D layer_key; +uniform bool is_straight_alpha; + uniform mat3 color_matrix; uniform vec3 luma_coeff; uniform bool has_local_key; @@ -495,7 +497,7 @@ vec4 get_rgba_color() { float y = get_sample(plane[0], TexCoord.st / TexCoord.q).g * precision_factor[0]; float cb = get_sample(plane[1], TexCoord.st / TexCoord.q).b * precision_factor[1]; - float cr = get_sample(plane[1], TexCoord.st / TexCoord.q).r * precision_factor[1]; + float cr = get_sample(plane[1], TexCoord.st / TexCoord.q).r * precision_factor[1]; return ycbcra_to_rgba(y, cb, cr, 1.0); } } @@ -505,6 +507,8 @@ vec4 get_rgba_color() void main() { vec4 color = get_rgba_color(); + if (is_straight_alpha) + color.rgb *= color.a; if (chroma) color = chroma_key(color); if(levels) diff --git a/src/core/frame/pixel_format.h b/src/core/frame/pixel_format.h index 520e24c0bd..9f083ab691 100644 --- a/src/core/frame/pixel_format.h +++ b/src/core/frame/pixel_format.h @@ -83,7 +83,8 @@ struct pixel_format_desc final { } - pixel_format format = pixel_format::invalid; + pixel_format format = pixel_format::invalid; + bool is_straight_alpha = false; std::vector planes; core::color_space color_space = core::color_space::bt709; };