From 73d8220f1671d9e6cb4fcbadb58a9b32502c801b Mon Sep 17 00:00:00 2001 From: Alex Anderson Date: Sat, 21 Jul 2018 10:45:24 -0700 Subject: [PATCH 1/2] obs-filters: Optimize chroma key's box filter Reduces number of samples taken for same effect. --- .../obs-filters/data/chroma_key_filter.effect | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/plugins/obs-filters/data/chroma_key_filter.effect b/plugins/obs-filters/data/chroma_key_filter.effect index 8a75968d7..5e0e382e8 100644 --- a/plugins/obs-filters/data/chroma_key_filter.effect +++ b/plugins/obs-filters/data/chroma_key_filter.effect @@ -55,17 +55,15 @@ float4 SampleTexture(float2 uv) float GetBoxFilteredChromaDist(float3 rgb, float2 texCoord) { - float distVal = GetChromaDist(rgb); - distVal += GetChromaDist(SampleTexture(texCoord-pixel_size).rgb); - distVal += GetChromaDist(SampleTexture(texCoord-float2(pixel_size.x, 0.0)).rgb); - distVal += GetChromaDist(SampleTexture(texCoord-float2(pixel_size.x, -pixel_size.y)).rgb); - - distVal += GetChromaDist(SampleTexture(texCoord-float2(0.0, pixel_size.y)).rgb); - distVal += GetChromaDist(SampleTexture(texCoord+float2(0.0, pixel_size.y)).rgb); - - distVal += GetChromaDist(SampleTexture(texCoord+float2(pixel_size.x, -pixel_size.y)).rgb); - distVal += GetChromaDist(SampleTexture(texCoord+float2(pixel_size.x, 0.0)).rgb); - distVal += GetChromaDist(SampleTexture(texCoord+pixel_size).rgb); + float2 h_pixel_size = pixel_size / 2.0; + float2 point_0 = float2(pixel_size.x, h_pixel_size.y); + float2 point_1 = float2(h_pixel_size.x, -pixel_size.y); + float distVal = GetChromaDist(SampleTexture(texCoord-point_0).rgb); + distVal += GetChromaDist(SampleTexture(texCoord+point_0).rgb); + distVal += GetChromaDist(SampleTexture(texCoord-point_1).rgb); + distVal += GetChromaDist(SampleTexture(texCoord+point_1).rgb); + distVal *= 2.0; + distVal += GetChromaDist(rgb); return distVal / 9.0; } From 72cf77102c9e0d48566c5ff31cda7e1bc58d59fd Mon Sep 17 00:00:00 2001 From: Alex Anderson Date: Sat, 28 Jul 2018 00:27:20 -0700 Subject: [PATCH 2/2] obs-filters: Avoid skewing chroma key's box filter average Passes the sample directly to the box filter before it is multiplied by color. --- plugins/obs-filters/data/chroma_key_filter.effect | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/obs-filters/data/chroma_key_filter.effect b/plugins/obs-filters/data/chroma_key_filter.effect index 5e0e382e8..86280702d 100644 --- a/plugins/obs-filters/data/chroma_key_filter.effect +++ b/plugins/obs-filters/data/chroma_key_filter.effect @@ -74,6 +74,7 @@ float4 ProcessChromaKey(float4 rgba, VertData v_in) float fullMask = pow(saturate(baseMask / smoothness), 1.5); float spillVal = pow(saturate(baseMask / spill), 1.5); + rgba.rgba *= color; rgba.a *= fullMask; float desat = (rgba.r * 0.2126 + rgba.g * 0.7152 + rgba.b * 0.0722); @@ -84,7 +85,7 @@ float4 ProcessChromaKey(float4 rgba, VertData v_in) float4 PSChromaKeyRGBA(VertData v_in) : TARGET { - float4 rgba = image.Sample(textureSampler, v_in.uv) * color; + float4 rgba = image.Sample(textureSampler, v_in.uv); return ProcessChromaKey(rgba, v_in); }