From dceb2e533d38baffe511ab490e58c0486bc29f9e Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Thu, 6 Jul 2017 06:00:18 +0200 Subject: [PATCH] effects: Add RGB -> YUV, YUV -> RGB color converter This should help for filters requiring other color formats. --- data/effects/color-conversion.effect | 81 ++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 data/effects/color-conversion.effect diff --git a/data/effects/color-conversion.effect b/data/effects/color-conversion.effect new file mode 100644 index 0000000..d20e4be --- /dev/null +++ b/data/effects/color-conversion.effect @@ -0,0 +1,81 @@ +uniform float4x4 ViewProj; +uniform texture2d image; + +sampler_state primarySampler { + Filter = Linear; + AddressU = Clamp; + AddressV = Clamp; +}; + +struct VertDataIn { + float4 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +struct VertDataOut { + float4 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +VertDataOut VSDefault(VertDataIn v_in) { + VertDataOut vert_out; + vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj); + vert_out.uv = v_in.uv; + return vert_out; +} + +// ************************************************************************** // +// RGB <-> YUV +// ************************************************************************** // +float4 RGBtoYUV(float4 rgba, float3x3 yuv) { + return float4( + rgba.r * yuv._m00 + rgba.g * yuv._m01 + rgba.b * yuv._m02, + rgba.r * yuv._m10 + rgba.g * yuv._m11 + rgba.b * yuv._m12, + rgba.r * yuv._m20 + rgba.g * yuv._m21 + rgba.b * yuv._m22, + rgba.a + ) + float4(0,0.5,0.5,0); +} +float4 YUVtoRGB(float4 yuva, float3x3 yuvi) { + yuva.gb -= 0.5; + return float4( + yuva.r * yuvi._m00 + yuva.g * yuvi._m01 + yuva.b * yuvi._m02, + yuva.r * yuvi._m10 + yuva.g * yuvi._m11 + yuva.b * yuvi._m12, + yuva.r * yuvi._m20 + yuva.g * yuvi._m21 + yuva.b * yuvi._m22, + yuva.a); +} + +float4 RGBToYUV_Pass(VertDataOut v_in) : TARGET { + const float3x3 mYUV709 = { + 0.2126, 0.7152, 0.0722, + -0.2126, -0.7152, 0.9278, + 0.7874, -0.7152, -0.0722 + }; + const float3x3 mYUV709n = { // Normalized + 0.2126, 0.7152, 0.0722, + -0.1145721060573399, -0.3854278939426601, 0.5, + 0.5, -0.4541529083058166, -0.0458470916941834 + }; + return RGBtoYUV(image.Sample(primarySampler, v_in.uv), mYUV709n); +} + +float4 YUVToRGB_Pass(VertDataOut v_in) : TARGET { + const float3x3 mYUV709i = { // Inverse Normalized + 1, 0, 1.5748, + 1, -0.187324, -0.468124, + 1, 1.8556, 0 + }; + return YUVtoRGB(image.Sample(primarySampler, v_in.uv), mYUV709i); +} + +technique RGBToYUV { + pass { + vertex_shader = VSDefault(v_in); + pixel_shader = RGBToYUV_Pass(v_in); + } +} +technique YUVToRGB { + pass { + vertex_shader = VSDefault(v_in); + pixel_shader = YUVToRGB_Pass(v_in); + } +}