我正在研究 Direct3D11 用于显示视频输出;特别是,我试图弄清楚是否有一种方法可以将 YUV 表面提供给 Direct3D11 并让它自动(即在硬件中)将其转换为 RGB 并按原样呈现。 DXGI_MODE_DESC的文档状态:
Because of the relaxed render target creation rules that Direct3D 11 has for back buffers, applications can create a DXGI_FORMAT_B8G8R8A8_UNORM_SRGB render target view from a DXGI_FORMAT_B8G8R8A8_UNORM swap chain so they can use automatic color space conversion when they render the swap chain.
这个“自动色彩空间转换”指的是什么? Direct3D11 中是否有任何内容可以满足我的要求,或者必须通过预渲染或通过着色器执行此操作?
最佳答案
在 DX11 中创建纹理时,您可以选择多种格式来告知着色器有关数据结构的信息。这些格式属于 DXGI_FORMAT 枚举。它们基本上是 ARGB 颜色格式的各种配置,因此它们允许您指定 B8G8R8A8 或 R16G16B16A16 等。但是没有 YUV 格式的选项。
您能做的最好的事情是将 YUV 数据传递到着色器管道,“假装”它们是 RGB。然后在像素着色器中执行到真实 RGB 格式的转换。该解决方案应该足够高效,因为转换将在 GPU 上针对纹理的每个可见像素并行执行。
关于c++ - Direct3D11 是否包含色彩空间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071360/