通过片段着色器进行YUV转换
时间:2020-03-06 14:50:18 来源:igfitidea点击:
我已经通过用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规范化的讨论。