Откуда взялось преобразование шейдера YUV420P в RGB? - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь понять эти вычисления для преобразования YUV420P в RGB на фрагментном шейдере OpenGL. На 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;

Это может быть специальное преобразование цвета для какой-то конкретной c цветовой схемы YUV, но я ничего не нашел в inte rnet.

1 Ответ

2 голосов
/ 11 июля 2020

Зачем брать [...] 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 из канала красного цвета является просто оптимизацией. Таким образом, его не нужно вычитать отдельно в каждом выражении позже.

Алгоритм такой же, как в Как преобразовать RGB -> YUV -> RGB (в обоих направлениях) или различные книги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...