Explorar o código

libobs: Add more color handling to default/opaque

jpark37 %!s(int64=3) %!d(string=hai) anos
pai
achega
08f50a7d22
Modificáronse 2 ficheiros con 176 adicións e 0 borrados
  1. 52 0
      libobs/data/default.effect
  2. 124 0
      libobs/data/opaque.effect

+ 52 - 0
libobs/data/default.effect

@@ -62,6 +62,14 @@ float4 PSDrawSrgbDecompress(VertInOut vert_in) : TARGET
 	return rgba;
 }
 
+float4 PSDrawSrgbDecompressMultiply(VertInOut vert_in) : TARGET
+{
+	float4 rgba = image.Sample(def_sampler, vert_in.uv);
+	rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
+	rgba.rgb *= multiplier;
+	return rgba;
+}
+
 float4 PSDrawMultiply(VertInOut vert_in) : TARGET
 {
 	float4 rgba = image.Sample(def_sampler, vert_in.uv);
@@ -88,6 +96,23 @@ float4 PSDrawMultiplyTonemap(VertInOut vert_in) : TARGET
 	return rgba;
 }
 
+float4 PSDrawPQ(VertInOut vert_in) : TARGET
+{
+	float4 rgba = image.Sample(def_sampler, vert_in.uv);
+	rgba.rgb = st2084_to_linear(rgba.rgb) * multiplier;
+	rgba.rgb = rec2020_to_rec709(rgba.rgb);
+	return rgba;
+}
+
+float4 PSDrawTonemapPQ(VertInOut vert_in) : TARGET
+{
+	float4 rgba = image.Sample(def_sampler, vert_in.uv);
+	rgba.rgb = st2084_to_linear(rgba.rgb) * multiplier;
+	rgba.rgb = reinhard(rgba.rgb);
+	rgba.rgb = rec2020_to_rec709(rgba.rgb);
+	return rgba;
+}
+
 technique Draw
 {
 	pass
@@ -133,6 +158,15 @@ technique DrawSrgbDecompress
 	}
 }
 
+technique DrawSrgbDecompressMultiply
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawSrgbDecompressMultiply(vert_in);
+	}
+}
+
 technique DrawMultiply
 {
 	pass
@@ -159,3 +193,21 @@ technique DrawMultiplyTonemap
 		pixel_shader  = PSDrawMultiplyTonemap(vert_in);
 	}
 }
+
+technique DrawPQ
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawPQ(vert_in);
+	}
+}
+
+technique DrawTonemapPQ
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawTonemapPQ(vert_in);
+	}
+}

+ 124 - 0
libobs/data/opaque.effect

@@ -1,5 +1,8 @@
+#include "color.effect"
+
 uniform float4x4 ViewProj;
 uniform texture2d image;
+uniform float multiplier;
 
 sampler_state def_sampler {
 	Filter   = Linear;
@@ -25,6 +28,64 @@ float4 PSDraw(VertInOut vert_in) : TARGET
 	return float4(image.Sample(def_sampler, vert_in.uv).rgb, 1.0);
 }
 
+float4 PSDrawSrgbDecompress(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb = srgb_nonlinear_to_linear(rgb);
+	return float4(rgb, 1.0);
+}
+
+float4 PSDrawSrgbDecompressMultiply(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb = srgb_nonlinear_to_linear(rgb);
+	rgb *= multiplier;
+	return float4(rgb, 1.0);
+}
+
+float4 PSDrawMultiply(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb *= multiplier;
+	return float4(rgb, 1.0);
+}
+
+float4 PSDrawTonemap(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb = rec709_to_rec2020(rgb);
+	rgb = reinhard(rgb);
+	rgb = rec2020_to_rec709(rgb);
+	return float4(rgb, 1.0);
+}
+
+float4 PSDrawMultiplyTonemap(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb *= multiplier;
+	rgb = rec709_to_rec2020(rgb);
+	rgb = reinhard(rgb);
+	rgb = rec2020_to_rec709(rgb);
+	return float4(rgb, 1.0);
+}
+
+float4 PSDrawPQ(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb = st2084_to_linear(rgb) * multiplier;
+	rgb = rec2020_to_rec709(rgb);
+	return float4(rgb, 1.0);
+}
+
+float4 PSDrawTonemapPQ(VertInOut vert_in) : TARGET
+{
+	float3 rgb = image.Sample(def_sampler, vert_in.uv).rgb;
+	rgb = st2084_to_linear(rgb) * multiplier;
+	rgb = reinhard(rgb);
+	rgb = rec2020_to_rec709(rgb);
+	return float4(rgb, 1.0);
+}
+
 technique Draw
 {
 	pass
@@ -33,3 +94,66 @@ technique Draw
 		pixel_shader  = PSDraw(vert_in);
 	}
 }
+
+technique DrawSrgbDecompress
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawSrgbDecompress(vert_in);
+	}
+}
+
+technique DrawSrgbDecompressMultiply
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawSrgbDecompressMultiply(vert_in);
+	}
+}
+
+technique DrawMultiply
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawMultiply(vert_in);
+	}
+}
+
+technique DrawTonemap
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawTonemap(vert_in);
+	}
+}
+
+technique DrawMultiplyTonemap
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawMultiplyTonemap(vert_in);
+	}
+}
+
+technique DrawPQ
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawPQ(vert_in);
+	}
+}
+
+technique DrawTonemapPQ
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawTonemapPQ(vert_in);
+	}
+}