YUV转RGB着色器边缘伪影问题

3

我有一种将YUV转换为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地址模式,图像比原始图像更黄。

在D3D中,像素中心不是0,0吗? - Robinson
在D3D10中是0.5,0.5。 - Alatriste
可能需要更多信息。为什么你的图片是桌面的图片? - Robinson
我使用一些RGB转YUV工具将这个图像转换了,现在我想要检查我的YUV到RGB着色器。 您能否看出我的像素着色器中是否有任何错误? - Alatriste
1
这显然是HLSL,所有的标签是什么意思? - Andon M. Coleman
显示剩余5条评论
2个回答

1
我有采样器状态。
  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 给出了精确的像素坐标,您可以避免使用采样器(在这种类型的操作中应该在点模式下)。

以下是一个简单的示例,用于在您的用例中加载数据(请注意,我只提供加载代码,而不涉及转换本身)。

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接