0

使用 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 根本不谈论这些格式。

4

1 回答 1

0

Direct3D 不能直接处理视频格式,但它们都旨在“映射”到非视频格式。

例如DXGI_FORMAT_Y410

每通道 10 位打包 YUV 4:4:4 视频资源格式。此视频资源格式的有效视图格式为 DXGI_FORMAT_R10G10B10A2_UNORM 和 DXGI_FORMAT_R10G10B10A2_UINT。对于 UAV,另一种有效的视图格式是 DXGI_FORMAT_R32_UINT。通过将 DXGI_FORMAT_R32_UINT 用于 UAV,您可以读取和写入,而不仅仅是写入 DXGI_FORMAT_R10G10B10A2_UNORM 和 DXGI_FORMAT_R10G10B10A2_UINT。支持的视图类型是 SRV 和 UAV。一个视图提供了整个表面的直接映射。到视图通道的映射是 U->R10、Y->G10、V->B10 和 A->A2。

请参阅Microsoft 文档

于 2021-09-22T03:12:52.547 回答