static void scale_filter_render(void *data, gs_effect_t *effect) { struct scale_filter_data *filter = data; const char *technique = filter->undistort ? "DrawUndistort" : "Draw"; if (!filter->valid || !filter->target_valid) { obs_source_skip_video_filter(filter->context); return; } if (!obs_source_process_filter_begin(filter->context, GS_RGBA, OBS_NO_DIRECT_RENDERING)) return; if (filter->dimension_param) gs_effect_set_vec2(filter->dimension_param, &filter->dimension_i); if (filter->undistort_factor_param) gs_effect_set_float(filter->undistort_factor_param, (float)filter->undistort_factor); if (filter->sampling == OBS_SCALE_POINT) gs_effect_set_next_sampler(filter->image_param, filter->point_sampler); obs_source_process_filter_tech_end(filter->context, filter->effect, filter->cx_out, filter->cy_out, technique); UNUSED_PARAMETER(effect); }
static void render_item_texture(struct obs_scene_item *item) { gs_texture_t *tex = gs_texrender_get_texture(item->item_render); gs_effect_t *effect = obs->video.default_effect; enum obs_scale_type type = item->scale_filter; uint32_t cx = gs_texture_get_width(tex); uint32_t cy = gs_texture_get_height(tex); if (type != OBS_SCALE_DISABLE) { if (type == OBS_SCALE_POINT) { gs_eparam_t *image = gs_effect_get_param_by_name( effect, "image"); gs_effect_set_next_sampler(image, obs->video.point_sampler); } else if (!close_float(item->output_scale.x, 1.0f, EPSILON) || !close_float(item->output_scale.y, 1.0f, EPSILON)) { gs_eparam_t *scale_param; if (item->output_scale.x < 0.5f || item->output_scale.y < 0.5f) { effect = obs->video.bilinear_lowres_effect; } else if (type == OBS_SCALE_BICUBIC) { effect = obs->video.bicubic_effect; } else if (type == OBS_SCALE_LANCZOS) { effect = obs->video.lanczos_effect; } scale_param = gs_effect_get_param_by_name(effect, "base_dimension_i"); if (scale_param) { struct vec2 base_res_i = { 1.0f / (float)cx, 1.0f / (float)cy }; gs_effect_set_vec2(scale_param, &base_res_i); } } } while (gs_effect_loop(effect, "Draw")) obs_source_draw(tex, 0, 0, 0, 0, 0); }