我试图理解 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 配色方案的特殊颜色转换,但我在互联网上找不到任何内容。
最佳答案
为什么在第一部分中采用 [...] 0.5 和 0.5?
U 和 V 存储在纹理的绿色和蓝色 channel 中。颜色 channel 中的值存储在 [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;
从红色 channel 中减去0.0625
只是一种优化。因此,以后不必在每个表达式中单独减去它。
该算法与 How to convert RGB -> YUV -> RGB (both ways) 中的算法相同或各种书籍。
关于image-processing - 这个 YUV420P 到 RGB 着色器的转换从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62846954/