diff --git a/libobs/data/default_rect.effect b/libobs/data/default_rect.effect new file mode 100644 index 000000000..b9660b262 --- /dev/null +++ b/libobs/data/default_rect.effect @@ -0,0 +1,55 @@ +uniform float4x4 ViewProj; +uniform float4x4 color_matrix; +uniform float3 color_range_min = {0.0, 0.0, 0.0}; +uniform float3 color_range_max = {1.0, 1.0, 1.0}; +uniform texture_rect image; + +sampler_state def_sampler { + Filter = Linear; + AddressU = Clamp; + AddressV = Clamp; +}; + +struct VertInOut { + float4 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +VertInOut VSDefault(VertInOut vert_in) +{ + VertInOut vert_out; + vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj); + vert_out.uv = vert_in.uv; + return vert_out; +} + +float4 PSDrawBare(VertInOut vert_in) : TARGET +{ + return image.Sample(def_sampler, vert_in.uv); +} + +float4 PSDrawMatrix(VertInOut vert_in) : TARGET +{ + float4 yuv = image.Sample(def_sampler, vert_in.uv); + yuv.xyz = clamp(yuv.xyz, color_range_min, color_range_max); + return saturate(mul(float4(yuv.xyz, 1.0), color_matrix)); +} + +technique Draw +{ + pass + { + vertex_shader = VSDefault(vert_in); + pixel_shader = PSDrawBare(vert_in); + } +} + +technique DrawMatrix +{ + pass + { + vertex_shader = VSDefault(vert_in); + pixel_shader = PSDrawMatrix(vert_in); + } +} + diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index eb83746e4..7a73b3063 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -141,6 +141,7 @@ struct obs_core_video { bool textures_converted[NUM_TEXTURES]; struct obs_source_frame convert_frames[NUM_TEXTURES]; gs_effect_t *default_effect; + gs_effect_t *default_rect_effect; gs_effect_t *solid_effect; gs_effect_t *conversion_effect; gs_stagesurf_t *mapped_surface; diff --git a/libobs/obs.c b/libobs/obs.c index 4aa575f7c..ab7bd0a02 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -224,6 +224,11 @@ static int obs_init_graphics(struct obs_video_info *ovi) NULL); bfree(filename); + filename = find_libobs_data_file("default_rect.effect"); + video->default_rect_effect = gs_effect_create_from_file(filename, + NULL); + bfree(filename); + filename = find_libobs_data_file("solid.effect"); video->solid_effect = gs_effect_create_from_file(filename, NULL); @@ -236,6 +241,8 @@ static int obs_init_graphics(struct obs_video_info *ovi) if (!video->default_effect) success = false; + if (!video->default_rect_effect) + success = false; if (!video->solid_effect) success = false; if (!video->conversion_effect) @@ -356,6 +363,7 @@ static void obs_free_graphics(void) gs_enter_context(video->graphics); gs_effect_destroy(video->default_effect); + gs_effect_destroy(video->default_rect_effect); gs_effect_destroy(video->solid_effect); gs_effect_destroy(video->conversion_effect); video->default_effect = NULL; @@ -1065,6 +1073,12 @@ gs_effect_t *obs_get_default_effect(void) return obs->video.default_effect; } +gs_effect_t *obs_get_default_rect_effect(void) +{ + if (!obs) return NULL; + return obs->video.default_rect_effect; +} + gs_effect_t *obs_get_solid_effect(void) { if (!obs) return NULL; diff --git a/libobs/obs.h b/libobs/obs.h index f40646841..533482ace 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -459,6 +459,9 @@ EXPORT obs_service_t *obs_get_service_by_name(const char *name); /** Returns the default effect for generic RGB/YUV drawing */ EXPORT gs_effect_t *obs_get_default_effect(void); +/** Returns the default effect for generic RGB/YUV drawing using texture_rect */ +EXPORT gs_effect_t *obs_get_default_rect_effect(void); + /** Returns the solid effect for drawing solid colors */ EXPORT gs_effect_t *obs_get_solid_effect(void);