【问题标题】:Does Direct3D11 include color space conversion?Direct3D11 是否包含色彩空间转换?
【发布时间】:2014-06-08 20:06:21
【问题描述】:

我正在研究 Direct3D11 以显示视频输出;特别是,我试图弄清楚是否有办法为 Direct3D11 提供 YUV 表面并让它自动(即在硬件中)将其转换为 RGB 并以这种方式呈现。 DXGI_MODE_DESC 的文档指出:

由于 Direct3D 11 放宽了渲染目标创建规则 对于后台缓冲区,应用程序可以创建一个 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB 渲染目标视图 DXGI_FORMAT_B8G8R8A8_UNORM 交换链,因此它们可以使用自动颜色 渲染交换链时的空间转换。

这个“自动色彩空间转换”指的是什么? Direct3D11 中是否有任何东西可以满足我的需求,或者必须通过预渲染或通过着色器执行此操作?

【问题讨论】:

  • AFAIK,这种“自动”色彩空间转换是指 sRGB 和线性到伽马空间的转换,而不是 YUV 到 RGB。另外,我自己考虑使用尽可能接近“硬件”的简单片段着色器。

标签: c++ directx direct3d


【解决方案1】:

在 DX11 中创建纹理时,您可以选择多种格式来通知着色器有关数据结构的信息。这些格式属于 DXGI_FORMAT 枚举。它们基本上是 ARGB 颜色格式的各种配置,因此它们允许您指定例如 B8G8R8A8 或 R16G16B16A16。但是,没有 YUV 格式的选项。

您能做的最好的事情就是将您的 YUV 数据传递给着色器管道,“假装”它们是 RGB。然后在像素着色器中执行转换为真正的 RGB 格式。此解决方案应该足够高效,因为转换将在 GPU 上执行,并针对纹理的每个可见像素并行执行。

【讨论】:

  • 是的,这就是我一直在尝试做的事情 (stackoverflow.com/questions/24093491/…),但是谢谢!
  • @Elvithadri,我知道这个问题在 3 年前就已经回答过了,但是您能否提供一些关于如何使用着色器来实现这一目标的提示?
  • @moose,这不是太复杂。这个站点:equasys.de/colorconversion.html 提供了矩阵方程来计算给定 YUV 的 RGB 颜色。如果您的纹理实际上是 YUV,并且您需要将其显示为 RGB,请在像素着色器中应用此变换。
  • @Elvithari,我熟悉 YUV->RGB 数学,但不熟悉着色器。我可以在这里问一个关于如何使用着色器的新问题。例如,我需要顶点着色器和像素着色器,还是只需要后者?我将用 YUV 值填充 RGBA 表面,因为我无法创建 YUV 表面。因此,着色器可能会收到 float4 的颜色,因为它认为它是 RGBA。我应该将其转换为 RGBA,但返回值应该是 2 x float4,因为 YUYV == 2 像素等......如果您能对此提供帮助,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2019-11-28
  • 2013-10-12
相关资源
最近更新 更多