使用 DirectX 11、DXGI DDA 和 NvEnc。我必须支持 YUV420、YUV444、8bit 和 10bit。我的转换适用于 YUV420、YUV444 和 8bit。使用 10 位时,我遇到了 DXGI_FORMAT 与 NV_ENC_BUFFER_FORMATS 的兼容性问题。
我有计算着色器将 DDA 捕获格式(DXGI_FORMAT_B8G8R8A8_UNORM 用于 8 位,DXGI_FORMAT_R16G16B16A16_FLOAT 用于 10 位)转换为 NvEnc 的 YUV 格式。在 NvEnc 中使用内置 RGB 格式似乎不起作用,因为它们都在内部转换为 YUV420(没有 YUV444)并且我无法控制色度坐标(例如 BT.601、BT.709)
DXGI 支持的 YUV444 10bit 格式有:
DXGI_FORMAT_Y410(10 位压缩,2 位 alpha,每像素 32 位)
DXGI_FORMAT_Y416(10 位解压缩为每通道 16 位,16 位 alpha,每像素 64 位)
NvEnc 支持的 YUV444 10bit 格式有:
NV_ENC_BUFFER_FORMAT_YUV444_10BIT(10bit 解压为每通道 16bit,无 alpha,每像素 48bit)
所以这就是问题所在。这里没有兼容的格式。看来我在两者之间转换的唯一选择是结构化缓冲区(并做更多的手动工作),或 DXGI_FORMAT_R16_FLOAT 格式,并使尺寸成为我框架尺寸的 3 倍。它还需要我建立另一个管道。每次转换我已经有 4 个,因为我还必须将鼠标指针(颜色、蒙版颜色或单色)写入图像。这只会让我的系统比现在更令人讨厌和臃肿。
我有更好的选择吗?这些格式有什么我遗漏的吗?除了在定义它们的 NvEncodeApi.h 标头中之外,Nvidia 根本不谈论这些格式。