
我是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数据: …