1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-27 17:42:17 +00:00

vo_opengl: blend alpha components by default

Improves display of images and video with alpha channel, especially if
the transparent regions contain (supposed to be invisible) garbage
color values.
This commit is contained in:
wm4 2013-09-19 16:55:56 +02:00
parent 69e272dad7
commit 93feffad15
5 changed files with 29 additions and 13 deletions

View File

@ -454,13 +454,20 @@ Available video output drivers are:
Default is 128x256x64.
Sizes must be a power of two, and 256 at most.
``alpha``
Try to create a framebuffer with alpha component. This only makes sense
if the video contains alpha information (which is extremely rare). May
not be supported on all platforms. If alpha framebuffers are
unavailable, it silently falls back on a normal framebuffer. Note
that when using FBO indirections (such as with ``opengl-hq``), an FBO
format with alpha must be specified with the ``fbo-format`` option.
``alpha=<blend|yes|no>``
Decides what to do if the input has an alpha component (default: blend).
blend
Blend the frame against a black background.
yes
Try to create a framebuffer with alpha component. This only makes sense
if the video contains alpha information (which is extremely rare). May
not be supported on all platforms. If alpha framebuffers are
unavailable, it silently falls back on a normal framebuffer. Note
that when using FBO indirections (such as with ``opengl-hq``), an FBO
format with alpha must be specified with the ``fbo-format`` option.
no
Ignore alpha component.
``chroma-location=<auto|center|left>``
Set the YUV chroma sample location. auto means use the bitstream

View File

@ -271,6 +271,7 @@ static const struct gl_video_opts gl_video_opts_def = {
.scale_sep = 1,
.scalers = { "bilinear", "bilinear" },
.scaler_params = {NAN, NAN},
.alpha_mode = 2,
};
@ -319,7 +320,10 @@ const struct m_sub_options gl_video_conf = {
({"auto", MP_CHROMA_AUTO},
{"center", MP_CHROMA_CENTER},
{"left", MP_CHROMA_LEFT})),
OPT_FLAG("alpha", enable_alpha, 0),
OPT_CHOICE("alpha", alpha_mode, M_OPT_OPTIONAL_PARAM,
({"no", 0},
{"yes", 1}, {"", 1},
{"blend", 2})),
{0}
},
.size = sizeof(struct gl_video_opts),
@ -779,8 +783,8 @@ static void compile_shaders(struct gl_video *p)
shader_prelude, PRELUDE_END);
// Need to pass alpha through the whole chain. (Not needed for OSD shaders.)
bool use_alpha = p->opts.enable_alpha && p->has_alpha;
shader_def_opt(&header, "USE_ALPHA", use_alpha);
if (p->opts.alpha_mode == 1)
shader_def_opt(&header, "USE_ALPHA", p->has_alpha);
char *header_osd = talloc_strdup(tmp, header);
shader_def_opt(&header_osd, "USE_OSD_LINEAR_CONV", p->opts.srgb &&
@ -831,8 +835,10 @@ static void compile_shaders(struct gl_video *p)
shader_def_opt(&header_conv, "USE_INPUT_GAMMA", convert_input_gamma);
shader_def_opt(&header_conv, "USE_COLORMATRIX", !p->is_rgb);
shader_def_opt(&header_conv, "USE_CONV_GAMMA", convert_input_to_linear);
if (use_alpha && p->plane_count > 3)
if (p->opts.alpha_mode > 0 && p->has_alpha && p->plane_count > 3)
shader_def(&header_conv, "USE_ALPHA_PLANE", "3");
if (p->opts.alpha_mode == 2 && p->has_alpha)
shader_def(&header_conv, "USE_ALPHA_BLEND", "1");
shader_def_opt(&header_final, "USE_LINEAR_CONV_INV", p->use_lut_3d);
shader_def_opt(&header_final, "USE_GAMMA_POW", p->opts.gamma);

View File

@ -44,7 +44,7 @@ struct gl_video_opts {
int temporal_dither;
int fbo_format;
int stereo_mode;
int enable_alpha;
int alpha_mode;
int chroma_location;
};

View File

@ -387,6 +387,9 @@ void main() {
color = floor(color * dither_quantization + dither_value + dither_center) /
dither_quantization;
#endif
#ifdef USE_ALPHA_BLEND
color = color * alpha;
#endif
#ifdef USE_ALPHA
out_color = vec4(color, alpha);
#else

View File

@ -144,7 +144,7 @@ static bool config_window(struct gl_priv *p, uint32_t d_width,
if (p->renderer_opts->stereo_mode == GL_3D_QUADBUFFER)
flags |= VOFLAG_STEREO;
if (p->renderer_opts->enable_alpha)
if (p->renderer_opts->alpha_mode == 1)
flags |= VOFLAG_ALPHA;
if (p->use_gl_debug)