Преобразование eMFCC_ARGB32 в eMFCC_NV12 делает изображение светлее - PullRequest
0 голосов
/ 17 февраля 2020

В нашем СУЩЕСТВУЮЩЕМ коде у нас есть два шейдера, применяемых один за другим для преобразования из пиксельного формата eMFCC_ARGB32 в eMFCC_NV12.

Первый шейдер:

Texture2D tx_top : register( t0 );
Texture2D tx_bottom : register( t1 );
SamplerState sampler_in : register( s0 );
cbuffer PS_CONVERT : register (b0)
{
    float4 size;
    float4 vecY;
    float4 vecU;
    float4 vecV;
};
struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
};
float4 PS(PS_INPUT input) : SV_Target
{
    float4 p1 = tx_top.Sample( sampler_in, float2(input.Tex.x - 0.5/size.x, input.Tex.y) );
    float4 p2 = tx_top.Sample( sampler_in, float2(input.Tex.x + 0.5/size.x, input.Tex.y) );
    float4 pm = (p1 + p2) * 0.5;
    float4 yuv;
    yuv.b = dot(pm.rgb, vecU.rgb) + vecY.a;
    yuv.g = dot(p1.rgb, vecY.rgb) + vecY.a;
    yuv.r = dot(pm.rgb, vecV.rgb) + vecU.a;
    yuv.a = dot(p2.rgb, vecY.rgb) + vecY.a;
   yuv = clamp(yuv, float4(0.0625, 0.0625, 0.0625, 0.0625), float4(0.9375, 0.9180, 0.9375, 0.9180));
    return yuv;
}

Второй шейдер:

Texture2D tx : register( t0 );
SamplerState sampler_in : register( s0 );
cbuffer PS_CONVERT : register (b0)
{
    float4 size;
};
struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
};
float4 PS(PS_INPUT input) : SV_Target
{
    float luma_flag = step(input.Tex.y, 0.666666);
    float pos_y = luma_flag * input.Tex.y / 0.666666 + (1 - luma_flag) * (input.Tex.y - 0.666666) / 0.333333;
    float4 pix1 = tx.Sample(sampler_in, float2(input.Tex.x - 0.5 / size.x, pos_y - 0.5 * (1.0 - luma_flag) / size.y) );
    float4 pix2 = tx.Sample(sampler_in, float2(input.Tex.x + 0.5 / size.x, pos_y - 0.5 * (1.0 - luma_flag) / size.y) );
    float4 pix3 = tx.Sample(sampler_in, float2(input.Tex.x - 0.5 / size.x, pos_y + 0.5 * (1.0 - luma_flag) / size.y) );
    float4 pix4 = tx.Sample(sampler_in, float2(input.Tex.x + 0.5 / size.x, pos_y + 0.5 * (1.0 - luma_flag) / size.y) );
    pix1 = (pix1 + pix3) * 0.5;
    pix2 = (pix2 + pix4) * 0.5;
    return float4(pix2.g, pix1.a, pix1.g, pix2.a) * luma_flag + float4(pix2.b, pix1.r, pix1.b, pix2.r) * (1.0 - luma_flag);
}

Но изображение получилось светлее оригинала.

Оригинал:

enter image description here

После обработки:

enter image description here

...