这个 YUV420P 到 RGB 着色器的转换从何而来?

Posted

技术标签:

【中文标题】这个 YUV420P 到 RGB 着色器的转换从何而来?【英文标题】:Where did this YUV420P to RGB shader conversion come from? 【发布时间】:2020-07-11 08:33:26 【问题描述】:

我正在尝试了解这些计算,以便在 OpenGL 片段着色器上将 YUV420P 转换为 RGB。在https://en.wikipedia.org/wiki/YUV 上有很多计算,但没有一个看起来像下面的那个。为什么要在第一部分使用0.06250.50.5?第二部分是从哪里来的?

yuv.r = texture(tex_y, TexCoord).r - 0.0625;
yuv.g = texture(tex_u, TexCoord).r - 0.5;
yuv.b = texture(tex_v, TexCoord).r - 0.5;

rgba.r = yuv.r + 1.596 * yuv.b
rgba.g = yuv.r - 0.813 * yuv.b - 0.391 * yuv.g;
rgba.b = yuv.r + 2.018 * yuv.g;

这可能是某些特定 YUV 配色方案的特殊颜色转换,但我在互联网上找不到任何东西。

【问题讨论】:

【参考方案1】:

为什么在第一部分取 [...] 0.5 和 0.5?

UV 存储在纹理的绿色和蓝色通道中。颜色通道中的值存储在 [0.0, 1.0] 范围内。对于计算,值必须映射到范围 [-0.5, 0.5]:

yuv.g = texture(tex_u, TexCoord).r - 0.5;
yuv.b = texture(tex_v, TexCoord).r - 0.5;

从红色通道中减去0.0625 只是一种优化。因此,以后不必在每个表达式中单独减去它。

算法与How to convert RGB -> YUV -> RGB (both ways)或各种书籍中的算法相同。

【讨论】:

我只是没有在***.com/a/17934865/6655884 上得到1.164*Y。我的没有 (yuv.r) @LucasZanella 有不同的公式。见Color Conversion。色彩空间没有唯一的变换可以有不同的解释。

以上是关于这个 YUV420P 到 RGB 着色器的转换从何而来?的主要内容,如果未能解决你的问题,请参考以下文章

AVFrame转换到Mat,yuv420p转换到RGB

从 YUV420P 到 RGB 的 FFMPEG Api 转换产生奇怪的输出

yuv420p 转rgb计算

如何将yuv420p数据旋转90

视频学习笔记:Android OpenGL渲染YUV420P图像

D3D三层Texture纹理经像素着色器实现渲染YUV420P