1
0
Эх сурвалжийг харах

Add obs_get_default_rect_effect

This provides a default effect for users of GL_TEXTURE_RECTANGLE/textures
that return true for gs_texture_is_rect
Palana 11 жил өмнө
parent
commit
0f15cc143e

+ 55 - 0
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);
+	}
+}
+

+ 1 - 0
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;

+ 14 - 0
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;

+ 3 - 0
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);