diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 87d8b5cd9..f5d9538a1 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -2056,17 +2056,30 @@ static void obs_source_draw_async_texture(struct obs_source *source) { gs_effect_t *effect = gs_get_effect(); bool def_draw = (!effect); + bool premultiplied = false; gs_technique_t *tech = NULL; if (def_draw) { effect = obs_get_base_effect(OBS_EFFECT_DEFAULT); - tech = gs_effect_get_technique(effect, "Draw"); + const bool linear = gs_get_linear_srgb(); + const char *tech_name = linear ? "DrawNonlinearAlpha" : "Draw"; + premultiplied = linear; + tech = gs_effect_get_technique(effect, tech_name); gs_technique_begin(tech); gs_technique_begin_pass(tech, 0); } + if (premultiplied) { + gs_blend_state_push(); + gs_blend_function(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA); + } + obs_source_draw_texture(source, effect); + if (premultiplied) { + gs_blend_state_pop(); + } + if (def_draw) { gs_technique_end_pass(tech); gs_technique_end(tech);