@@ -168,6 +168,7 @@ struct shader_filter_data {
168168 obs_source_t * context ;
169169 gs_effect_t * effect ;
170170 gs_effect_t * output_effect ;
171+ gs_vertbuffer_t * sprite_buffer ;
171172
172173 gs_texrender_t * input_texrender ;
173174 gs_texrender_t * previous_input_texrender ;
@@ -268,7 +269,6 @@ static unsigned int rand_interval(unsigned int min, unsigned int max)
268269
269270static char * load_shader_from_file (const char * file_name ) // add input of visited files
270271{
271-
272272 char * file_ptr = os_quick_read_utf8_file (file_name );
273273 if (file_ptr == NULL ) {
274274 blog (LOG_WARNING , "[obs-shaderfilter] failed to read file: %s" , file_name );
@@ -694,6 +694,18 @@ static void *shader_filter_create(obs_data_t *settings, obs_source_t *source)
694694
695695 da_init (filter -> stored_param_list );
696696 load_output_effect (filter );
697+ struct gs_vb_data * vbd = gs_vbdata_create ();
698+ vbd -> num = 4 ;
699+ vbd -> points = bmalloc (sizeof (struct vec3 ) * 4 );
700+ vbd -> num_tex = 1 ;
701+ vbd -> tvarray = bmalloc (sizeof (struct gs_tvertarray ));
702+ vbd -> tvarray [0 ].width = 2 ;
703+ vbd -> tvarray [0 ].array = bmalloc (sizeof (struct vec2 ) * 4 );
704+ memset (vbd -> points , 0 , sizeof (struct vec3 ) * 4 );
705+ memset (vbd -> tvarray [0 ].array , 0 , sizeof (struct vec2 ) * 4 );
706+ obs_enter_graphics ();
707+ filter -> sprite_buffer = gs_vertexbuffer_create (vbd , GS_DYNAMIC );
708+ obs_leave_graphics ();
697709 obs_source_update (source , settings );
698710
699711 return filter ;
@@ -717,7 +729,8 @@ static void shader_filter_destroy(void *data)
717729 gs_texrender_destroy (filter -> previous_input_texrender );
718730 if (filter -> previous_output_texrender )
719731 gs_texrender_destroy (filter -> previous_output_texrender );
720-
732+ if (filter -> sprite_buffer )
733+ gs_vertexbuffer_destroy (filter -> sprite_buffer );
721734 obs_leave_graphics ();
722735
723736 dstr_free (& filter -> last_path );
@@ -2914,6 +2927,25 @@ void shader_filter_set_effect_params(struct shader_filter_data *filter)
29142927 }
29152928}
29162929
2930+ static void build_sprite (struct gs_vb_data * data , float fcx , float fcy , float start_u , float end_u , float start_v , float end_v )
2931+ {
2932+ struct vec2 * tvarray = data -> tvarray [0 ].array ;
2933+
2934+ vec3_zero (data -> points );
2935+ vec3_set (data -> points + 1 , fcx , 0.0f , 0.0f );
2936+ vec3_set (data -> points + 2 , 0.0f , fcy , 0.0f );
2937+ vec3_set (data -> points + 3 , fcx , fcy , 0.0f );
2938+ vec2_set (tvarray , start_u , start_v );
2939+ vec2_set (tvarray + 1 , end_u , start_v );
2940+ vec2_set (tvarray + 2 , start_u , end_v );
2941+ vec2_set (tvarray + 3 , end_u , end_v );
2942+ }
2943+
2944+ static inline void build_sprite_norm (struct gs_vb_data * data , float fcx , float fcy )
2945+ {
2946+ build_sprite (data , fcx , fcy , 0.0f , 1.0f , 0.0f , 1.0f );
2947+ }
2948+
29172949static void render_shader (struct shader_filter_data * filter , float f , obs_source_t * filter_to )
29182950{
29192951 gs_texture_t * texture = gs_texrender_get_texture (filter -> input_texrender );
@@ -3045,8 +3077,15 @@ static void render_shader(struct shader_filter_data *filter, float f, obs_source
30453077
30463078 if (gs_texrender_begin (filter -> output_texrender , filter -> total_width , filter -> total_height )) {
30473079 gs_ortho (0.0f , (float )filter -> total_width , 0.0f , (float )filter -> total_height , -100.0f , 100.0f );
3048- while (gs_effect_loop (filter -> effect , "Draw" ))
3049- gs_draw_sprite (texture , 0 , filter -> total_width , filter -> total_height );
3080+ while (gs_effect_loop (filter -> effect , "Draw" )) {
3081+ struct gs_vb_data * data = gs_vertexbuffer_get_data (filter -> sprite_buffer );
3082+ build_sprite_norm (data , (float )filter -> total_width , (float )filter -> total_height );
3083+ gs_vertexbuffer_flush (filter -> sprite_buffer );
3084+ gs_load_vertexbuffer (filter -> sprite_buffer );
3085+ gs_load_indexbuffer (NULL );
3086+
3087+ gs_draw (GS_TRISTRIP , 0 , 0 );
3088+ }
30503089 gs_texrender_end (filter -> output_texrender );
30513090 }
30523091
0 commit comments