Skip to content

Commit c2c3f0d

Browse files
committed
Add previous texture options
1 parent 74a31a4 commit c2c3f0d

File tree

5 files changed

+51
-7
lines changed

5 files changed

+51
-7
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ else()
66
cmake_minimum_required(VERSION 3.18)
77
endif()
88

9-
project(obs-shaderfilter VERSION 2.4.4)
9+
project(obs-shaderfilter VERSION 2.5.0)
1010
set(PROJECT_FULL_NAME "OBS Shaderfilter")
1111

1212
# Set new UUIDs when you start to create a new plugin.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ handle these variables being missing, but the shader may malfunction.)
111111
* **`ViewProj`** (`float4x4`)—The view/projection matrix. (Standard for all OBS filters.)
112112
* **`image`** (`texture2d`)—The image to which the filter is being applied, either the original output of
113113
the source or the output of the previous filter in the chain. (Standard for all OBS filters.)
114+
* **`prevous_image`** (`texture2d`)—The previous image to which the filter is being applied (2.5.0)
114115
* **`elapsed_time`** (`float`)—The time in seconds which has elapsed since the filter was created. Useful for
115116
creating animations.
116117
* **`elapsed_time_start`** (`float`)—The time in seconds which has elapsed since the shader was loaded (2.4.0).
@@ -140,6 +141,7 @@ handle these variables being missing, but the shader may malfunction.)
140141
* **`uv_pixel_interval`** (`float2`)—This is the size in UV coordinates of an individual texel. You can use
141142
this to convert the UV coordinates of the pixel being processed to the coordinates of that texel in the source
142143
texture, or otherwise scale UV coordinate distances into texel distances.
144+
* **`prevous_output`** (`texture2d`)—The previous output of the filter (2.5.0)
143145

144146
### Optional Preprocessing Macros
145147

buildspec.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@
7979
}
8080
},
8181
"name": "obs-shaderfilter",
82-
"version": "2.4.4"
82+
"version": "2.5.0"
8383
}

data/examples/motion_blur.shader

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
uniform texture2d previous_output;
2+
uniform float strength<
3+
string label = "strength";
4+
string widget_type = "slider";
5+
float minimum = 0.0;
6+
float maximum = 1.0;
7+
float step = 0.001;
8+
> = 0.0;
9+
10+
float4 mainImage(VertData v_in) : TARGET
11+
{
12+
return lerp(image.Sample(textureSampler, v_in.uv), previous_output.Sample(textureSampler, v_in.uv), 1.0 - pow(2, -7 * strength));
13+
}

obs-shaderfilter.c

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,9 @@ struct shader_filter_data {
171171
gs_effect_t *output_effect;
172172

173173
gs_texrender_t *input_texrender;
174+
gs_texrender_t *previous_input_texrender;
174175
gs_texrender_t *output_texrender;
176+
gs_texrender_t *previous_output_texrender;
175177
gs_eparam_t *param_output_image;
176178

177179
bool reload_effect;
@@ -215,10 +217,12 @@ struct shader_filter_data {
215217
gs_eparam_t *param_rand_instance_f;
216218
gs_eparam_t *param_rand_activation_f;
217219
gs_eparam_t *param_image;
220+
gs_eparam_t *param_previous_image;
218221
gs_eparam_t *param_image_a;
219222
gs_eparam_t *param_image_b;
220223
gs_eparam_t *param_transition_time;
221224
gs_eparam_t *param_convert_linear;
225+
gs_eparam_t *param_previous_output;
222226

223227
int expand_left;
224228
int expand_right;
@@ -347,10 +351,12 @@ static void shader_filter_clear_params(struct shader_filter_data *filter)
347351
filter->param_loop_second = NULL;
348352
filter->param_local_time = NULL;
349353
filter->param_image = NULL;
354+
filter->param_previous_image = NULL;
350355
filter->param_image_a = NULL;
351356
filter->param_image_b = NULL;
352357
filter->param_transition_time = NULL;
353358
filter->param_convert_linear = NULL;
359+
filter->param_previous_output = NULL;
354360

355361
size_t param_count = filter->stored_param_list.num;
356362
for (size_t param_index = 0; param_index < param_count; param_index++) {
@@ -593,6 +599,10 @@ static void shader_filter_reload_effect(struct shader_filter_data *filter)
593599
// Nothing.
594600
} else if (strcmp(info.name, "image") == 0) {
595601
filter->param_image = param;
602+
} else if (strcmp(info.name, "previous_image") == 0) {
603+
filter->param_previous_image = param;
604+
} else if (strcmp(info.name, "previous_output") == 0) {
605+
filter->param_previous_output = param;
596606
} else if (filter->transition && strcmp(info.name, "image_a") == 0) {
597607
filter->param_image_a = param;
598608
} else if (filter->transition && strcmp(info.name, "image_b") == 0) {
@@ -704,6 +714,10 @@ static void shader_filter_destroy(void *data)
704714
gs_texrender_destroy(filter->input_texrender);
705715
if (filter->output_texrender)
706716
gs_texrender_destroy(filter->output_texrender);
717+
if (filter->previous_input_texrender)
718+
gs_texrender_destroy(filter->previous_input_texrender);
719+
if (filter->previous_output_texrender)
720+
gs_texrender_destroy(filter->previous_output_texrender);
707721

708722
obs_leave_graphics();
709723

@@ -2662,6 +2676,12 @@ static void get_input_source(struct shader_filter_data *filter)
26622676

26632677
const enum gs_color_format format = gs_get_format_from_space(source_space);
26642678

2679+
if (filter->param_previous_image) {
2680+
gs_texrender_t *temp = filter->input_texrender;
2681+
filter->input_texrender = filter->previous_input_texrender;
2682+
filter->previous_input_texrender = temp;
2683+
}
2684+
26652685
// Set up our input_texrender to catch the output texture.
26662686
filter->input_texrender = create_or_reset_texrender(filter->input_texrender);
26672687

@@ -2897,11 +2917,20 @@ static void render_shader(struct shader_filter_data *filter, float f, obs_source
28972917
return;
28982918
}
28992919

2920+
if (filter->param_previous_output) {
2921+
gs_texrender_t *temp = filter->output_texrender;
2922+
filter->output_texrender = filter->previous_output_texrender;
2923+
filter->previous_output_texrender = temp;
2924+
}
29002925
filter->output_texrender = create_or_reset_texrender(filter->output_texrender);
29012926

2902-
if (filter->param_image) {
2927+
if (filter->param_image)
29032928
gs_effect_set_texture(filter->param_image, texture);
2904-
}
2929+
if (filter->param_previous_image)
2930+
gs_effect_set_texture(filter->param_previous_image, gs_texrender_get_texture(filter->previous_input_texrender));
2931+
if (filter->param_previous_output)
2932+
gs_effect_set_texture(filter->param_previous_output, gs_texrender_get_texture(filter->previous_output_texrender));
2933+
29052934
shader_filter_set_effect_params(filter);
29062935

29072936
if (f > 0.0f) {
@@ -2968,11 +2997,11 @@ static void render_shader(struct shader_filter_data *filter, float f, obs_source
29682997

29692998
switch (param->type) {
29702999
case GS_SHADER_PARAM_FLOAT:
2971-
gs_effect_set_float(param->param, (float)param->default_value.f * f + (float)param->value.f * (1.0f - f));
3000+
gs_effect_set_float(param->param,
3001+
(float)param->default_value.f * f + (float)param->value.f * (1.0f - f));
29723002
break;
29733003
case GS_SHADER_PARAM_INT:
2974-
gs_effect_set_int(param->param,
2975-
(int)((double)param->default_value.i * f +
3004+
gs_effect_set_int(param->param, (int)((double)param->default_value.i * f +
29763005
(double)param->value.i * (1.0f - f)));
29773006
break;
29783007
case GS_SHADER_PARAM_VEC2: {

0 commit comments

Comments
 (0)