mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-05-19 05:51:16 -04:00
libobs: Filter using premultiplied alpha
Convert incoming straight alpha color to premultiplied at filter begin, and process premultiplied value at filter end. If direct rendering is allowed, we assume the input source outputs premultiiplied alpha. If not, that source will need to be updated.
This commit is contained in:
@@ -3701,10 +3701,11 @@ bool obs_source_process_filter_begin(obs_source_t *filter,
|
||||
filter->filter_texrender =
|
||||
gs_texrender_create(format, GS_ZS_NONE);
|
||||
|
||||
gs_blend_state_push();
|
||||
gs_blend_function(GS_BLEND_ONE, GS_BLEND_ZERO);
|
||||
|
||||
if (gs_texrender_begin(filter->filter_texrender, cx, cy)) {
|
||||
gs_blend_state_push();
|
||||
gs_blend_function_separate(GS_BLEND_SRCALPHA, GS_BLEND_ZERO,
|
||||
GS_BLEND_ONE, GS_BLEND_ZERO);
|
||||
|
||||
bool custom_draw = (parent_flags & OBS_SOURCE_CUSTOM_DRAW) != 0;
|
||||
bool async = (parent_flags & OBS_SOURCE_ASYNC) != 0;
|
||||
struct vec4 clear_color;
|
||||
@@ -3718,10 +3719,10 @@ bool obs_source_process_filter_begin(obs_source_t *filter,
|
||||
else
|
||||
obs_source_video_render(target);
|
||||
|
||||
gs_blend_state_pop();
|
||||
|
||||
gs_texrender_end(filter->filter_texrender);
|
||||
}
|
||||
|
||||
gs_blend_state_pop();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3748,6 +3749,9 @@ static void obs_source_process_filter_tech_end_internal(
|
||||
|
||||
const char *tech = tech_name ? tech_name : "Draw";
|
||||
|
||||
gs_blend_state_push();
|
||||
gs_blend_function(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA);
|
||||
|
||||
if (can_bypass(target, parent, parent_flags, filter->allow_direct)) {
|
||||
render_filter_bypass(target, effect, tech);
|
||||
} else {
|
||||
@@ -3757,6 +3761,8 @@ static void obs_source_process_filter_tech_end_internal(
|
||||
}
|
||||
}
|
||||
|
||||
gs_blend_state_pop();
|
||||
|
||||
gs_set_linear_srgb(previous);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user