2015-03-22 4 views
3

У меня есть YUV для RGB преобразования шейдеров.YUV to RGB шейдер границы артефакт

struct Pixel_INPUT 
{ 
    float4 pos : SV_POSITION; 
    float2 tex : TEXCOORD0; 
}; 

Texture2D textureY : register(t0); 
Texture2D textureU : register(t1); 
Texture2D textureV : register(t2); 

SamplerState samstate 
{ 
    MinFilter  = Anisotropic; 
    MagFilter  = Anisotropic; 
AddressU = Clamp; 
AddressV = Clamp; 
}; 

float4 PS(Pixel_INPUT input) : SV_Target 
{ 
    float y = (1.1643f * textureY.Sample(samstate,input.tex) - 0.0625f); 
    float u = textureU.Sample(samstate,input.tex) - 0.5f; 
    float v = textureV.Sample(samstate,input.tex) - 0.5f; 

    float r = y + 1.5958f * v; 
    float g = y - 0.39173f * u - 0.81290f * v; 
    float b = y + 2.017f * u; 

    return float4(r,g,b,1); 
} 

Но у меня есть зеленая линия на правой стороне изображения, как, что: enter image description here

я использую режим Clamp адреса и изображение является более желтым цветом, чем оригинал.

+0

Не пиксельные центры 0,0 в D3D? – Robinson

+0

в D3D10 равны 0,5, 0,5 https://msdn.microsoft.com/en-us/library/windows/desktop/cc308049%28v=vs.85%29.aspx – Alatriste

+0

Есть ли у вас идеи? – Alatriste

ответ

1

У меня Sampler государству

samplerDesc.Filter = D3D10_FILTER_ANISOTROPIC; 
    samplerDesc.AddressU = D3D10_TEXTURE_ADDRESS_MIRROR; 
    samplerDesc.AddressV = D3D10_TEXTURE_ADDRESS_MIRROR; 
    samplerDesc.AddressW = D3D10_TEXTURE_ADDRESS_MIRROR; 
    samplerDesc.MaxAnisotropy = 8; 
    samplerDesc.ComparisonFunc = D3D10_COMPARISON_NEVER; 


    pDevice->CreateSamplerState(&samplerDesc,&SampState); 

О Y U и V разрешением текстур: U и V текстуры разрешения всегда составляют половину разрешения Y.

0

Я буду считать (так как вы используете три- планарной версии для YUV), что ваш FourCC является I420, как описано here

С SV_Position дает точные координаты пикселов, вы можете избежать использования Sampler (который технически должен в режиме Point для этого типа операций).

Вот простой пример, чтобы загрузить ваши данные в вашем случае использования (обратите внимание, что я предоставляю только код загрузки, а не само преобразование).

struct Pixel_INPUT 
{ 
    float4 pos : SV_POSITION; 
    float2 tex : TEXCOORD0; 
}; 

Texture2D textureY : register(t0); 
Texture2D textureU : register(t1); 
Texture2D textureV : register(t2); 

float4 PS(Pixel_INPUT input) : SV_Target 
{ 
    int3 pixelLocation = int3(input.pos.xy, 0)); //0 is miplevel 

    //Get y component 
    float y = textureY.Load(pixelLocation).r; 

    //now since u and v are half resolution, we need to divide location by 2 
    pixelLocation.xy /= 2; 

    //Load our u and v components 
    float u = textureU.Load(pixelLocation).r; 
    float v = textureV.Load(pixelLocation).r; 

    //Perform your conversion and return 
} 
Смежные вопросы