View Single Post
Old 21st June 2014, 19:47   #100  |  Link
cyberbeing
Broadband Junkie
 
Join Date: Oct 2005
Posts: 1,859
Quote:
Originally Posted by Shiandow View Post
Edit: Using the shaders with the YCbCr hack seems to remove all chroma aliasing, and changes the colour. I'm guessing that the BT.601 part of the RGB <-> YCbCr shaders doesn't work correctly.
If you think those shaders are incorrect, you could try adapting NVIDIA's sample vertex/pixel shaders for RGB <-> YCbCr conversions which I'd assume should be accurate.

NVIDIA RGBA to YUVA sample | NVIDIA YUVA to RGBA sample

The actual pixel shader portion of these samples seems to be the following, but would need to be made MPC-HC compatible:
Code:
#define QUAD_REAL float
#define QUAD_REAL2 float2
#define QUAD_REAL3 float3
#define QUAD_REAL4 float4

QUAD_REAL4 ToYUV(QuadVertexOutput IN,
		    uniform sampler2D SceneSampler) : COLOR
{   
    QUAD_REAL4 rgba = tex2D(SceneSampler, IN.UV);
    QUAD_REAL3 ctr = QUAD_REAL3(0,.5,.5);
    return QUAD_REAL4(rgb_to_yuv(rgba.xyz)+ctr,rgba.w); // don't lose alpha
}

QUAD_REAL3 rgb_to_yuv(QUAD_REAL3 RGB)
{
    QUAD_REAL y = dot(RGB,QUAD_REAL3(0.299,0.587,0.114));
    QUAD_REAL u = (RGB.z - y) * 0.565;
    QUAD_REAL v = (RGB.x - y) * 0.713;
    return QUAD_REAL3(y,u,v);
}

QUAD_REAL4 FromYUV(QuadVertexOutput IN,
		    uniform sampler2D SceneSampler) : COLOR
{   
    QUAD_REAL4 yuva = tex2D(SceneSampler, IN.UV) - QUAD_REAL4(0,.5,.5,0);
    return QUAD_REAL4(yuv_to_rgb(yuva.xyz),yuva.w); // don't lose alpha
}

QUAD_REAL3 yuv_to_rgb(QUAD_REAL3 YUV)
{
   QUAD_REAL u = YUV.y;
   QUAD_REAL v = YUV.z;
   QUAD_REAL r = YUV.x + 1.403*v;
   QUAD_REAL g = YUV.x - 0.344*u - 1.403*v;
   QUAD_REAL b = YUV.x + 1.770*u;
   return QUAD_REAL3(r,g,b);
}

Last edited by cyberbeing; 21st June 2014 at 19:53.
cyberbeing is offline   Reply With Quote