浏览代码

libobs: Add DrawAlphaDivide variant shaders

Useful for future 10-bit HDR DeckLink playback support.
jpark37 2 年之前
父节点
当前提交
3e80fff18e
共有 1 个文件被更改,包括 44 次插入1 次删除
  1. 44 1
      libobs/data/default.effect

+ 44 - 1
libobs/data/default.effect

@@ -31,10 +31,35 @@ float4 PSDrawBare(VertInOut vert_in) : TARGET
 float4 PSDrawAlphaDivide(VertInOut vert_in) : TARGET
 {
 	float4 rgba = image.Sample(def_sampler, vert_in.uv);
-	rgba.rgb *= max(1. / rgba.a, 0.);
+	rgba.rgb = (rgba.a > 0.) ? (rgba.rgb / rgba.a) : 0.;
 	return rgba;
 }
 
+float4 PSDrawAlphaDivideTonemap(VertInOut vert_in) : TARGET
+{
+	float4 rgba = image.Sample(def_sampler, vert_in.uv);
+	rgba.rgb = (rgba.a > 0.) ? (rgba.rgb / rgba.a) : 0.;
+	rgba.rgb = rec709_to_rec2020(rgba.rgb);
+	rgba.rgb = reinhard(rgba.rgb);
+	rgba.rgb = rec2020_to_rec709(rgba.rgb);
+	return rgba;
+}
+
+float4 PSDrawAlphaDivideR10L(VertInOut vert_in) : TARGET
+{
+	float4 rgba = image.Sample(def_sampler, vert_in.uv);
+	rgba.rgb = (rgba.a > 0.) ? (rgba.rgb / rgba.a) : 0.;
+	rgba.rgb *= multiplier;
+	rgba.rgb = rec709_to_rec2020(rgba.rgb);
+	rgba.rgb = linear_to_st2084(rgba.rgb);
+	uint3 rgb1023 = uint3(mad(rgba.rgb, 1023., .5));
+	uint b = (rgb1023.b & 0x3Fu) << 2;
+	uint g = ((rgb1023.b & 0x3C0u) >> 6) | ((rgb1023.g & 0xFu) << 4);
+	uint r = ((rgb1023.g & 0x3F0u) >> 4) | ((rgb1023.r & 0x3u) << 6);
+	uint a = ((rgb1023.r & 0x3FCu) >> 2);
+	return float4(uint4(r, g, b, a)) / 255.;
+}
+
 float4 PSDrawNonlinearAlpha(VertInOut vert_in) : TARGET
 {
 	float4 rgba = image.Sample(def_sampler, vert_in.uv);
@@ -130,6 +155,24 @@ technique DrawAlphaDivide
 	}
 }
 
+technique DrawAlphaDivideTonemap
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawAlphaDivideTonemap(vert_in);
+	}
+}
+
+technique DrawAlphaDivideR10L
+{
+	pass
+	{
+		vertex_shader = VSDefault(vert_in);
+		pixel_shader  = PSDrawAlphaDivideR10L(vert_in);
+	}
+}
+
 technique DrawNonlinearAlpha
 {
 	pass