这个 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.0625
和0.5
和0.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?
U 和 V 存储在纹理的绿色和蓝色通道中。颜色通道中的值存储在 [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 着色器的转换从何而来?的主要内容,如果未能解决你的问题,请参考以下文章
从 YUV420P 到 RGB 的 FFMPEG Api 转换产生奇怪的输出