我已经通过用 Nvidia 着色器语言编写的片段着色器实现了 YUV 到 RGB 的转换。 (Y、U 和 V 存储在单独的纹理中,这些纹理通过我的片段着色器中的多重纹理组合在一起)。它在 OpenGL 下工作得很好,但在 Direct3D 下我就是无法让输出图像看起来正确。我开始怀疑 Direct3D 在我有机会进行 YUV 转换之前以某种方式修改了 Y、U 和 V 样本。有谁知道在片段着色器运行之前 Direct3D 是否对存储在纹理中的值进行任何修改以及如何禁用它们>?
最佳答案
我们想通了。 :) 基本上问题是,虽然我们的 YUV 到 RGB 方程是正确的,但我们没有正确采样 V 数据!因此,对方程进行再多的修改也无济于事!
最后,我会向任何尝试这样做的人推荐以下策略:
1) 将 R、G 和 B 设置为 Y 中的值。您应该得到一个灰度图像(因为 Y 仅包含亮度)。 2) 接下来,将 R、G 和 B 设置为 U。你应该会得到有趣的颜色! 3) 最后将 R、G 和 B 设置为 V。同样,您应该得到有趣的颜色。
此外,正确标准化值也至关重要。请查看我们的 fourcc.org,了解有关正确 YUV 标准化的讨论。
关于video - 通过片段着色器进行 YUV 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/145064/