Quote:
Originally Posted by Shiandow
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);
}