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:
parent
69e272dad7
commit
93feffad15
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user