小编Bal*_*ati的帖子

使用DirectX11像素着色器将BGRA转换为YUV444的绿色图像

在此输入图像描述
  我是HLSL的新手.我正在尝试将使用DXGI桌面复制API从BGRA捕获的图像的色彩空间转换为使用纹理作为渲染目标的YUV444.
  我已设置像素着色器以执行所需的转换.从渲染目标纹理中取4:2:0子采样YUV并使用ffmpeg将其编码为H264,我可以看到图像.
  问题是 - 它是绿色的.
  着色器的输入颜色信息是浮点数据类型,但RGB到YUV转换的系数矩阵假定整数颜色信息.
  如果我使用钳位功能并将整数从输入颜色中取出,我将失去准确性.
  欢迎任何建议和指示.如果有任何其他信息有帮助,请告诉我.
  我怀疑我写的Pixel着色器,因为我第一次使用它.这是像素着色器.

float3 rgb_to_yuv(float3 RGB)
{
    float y = dot(RGB, float3(0.29900f, -0.16874f, 0.50000f));
    float u = dot(RGB, float3(0.58700f, -0.33126f, -0.41869f));
    float v = dot(RGB, float3(0.11400f, 0.50000f, -0.08131f));
    return float3(y, u, v);
}
float4 PS(PS_INPUT input) : SV_Target
{
    float4 rgba, yuva;
    rgba = tx.Sample(samLinear, input.Tex);
    float3 ctr = float3(0, 0, .5f);
    return float4(rgb_to_yuv(rgba.rgb) + ctr, rgba.a);
}
Run Code Online (Sandbox Code Playgroud)

  渲染目标映射到CPU可读纹理,并将YUV444数据复制到3个BYTE阵列并提供给ffmpeg libx264编码器.编码器将编码的数据包写入视频文件.
  在这里,我考虑每个2X2像素矩阵一个U(Cb)和一个V(Cr)和4个Y值.
  我从纹理中检索yuv420数据: …

yuv hlsl directx-11 pixel-shader rgba

7
推荐指数
1
解决办法
761
查看次数

标签 统计

directx-11 ×1

hlsl ×1

pixel-shader ×1

rgba ×1

yuv ×1