From 3e80fff18e2be3f28dbb8b8ebe591dfcab2cbf0f Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sat, 1 Apr 2023 03:19:49 -0700 Subject: [PATCH] libobs: Add DrawAlphaDivide variant shaders Useful for future 10-bit HDR DeckLink playback support. --- libobs/data/default.effect | 45 +++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/libobs/data/default.effect b/libobs/data/default.effect index 8c8eadbb6..644a90153 100644 --- a/libobs/data/default.effect +++ b/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