Как использовать фрагментный шейдер OpenGL для конвертации RGB в YUV420 - PullRequest
5 голосов
/ 26 октября 2011

Я знаю, как кодировать шейдер, который преобразует плоские данные (изображение YUV420) в упакованные данные (изображение RGB), используя фрагментный шейдер, но как мне кодировать RGB в YUV420.Мне не нужно изображение YUV420 для рендеринга, но чтобы передать его в код сжатия h264.

Ответы [ 2 ]

8 голосов
/ 26 октября 2011

С http://www.fourcc.org/fccyvrgb.php:

Преобразование RGB в YUV

Y = (0,257 * R) + (0,504 * G) + (0,098 * B) + 16

Cr = V = (0,439 * R) - (0,368 * G) - (0,071 * B) + 128

Cb = U = - (0,148 * R) - (0,291 * G) + (0,439 * B) + 128

В шейдере OpenGL эти постоянные смещения в конце необходимо умножить на 1/256. Также, если вы посмотрите внимательно, это умножение вектора на матрицу. Вы можете выразить это

mat4 RGBtoYUV(0.257,  0.439, -0.148, 0.0,
              0.504, -0.368, -0.291, 0.0,
              0.098, -0.071,  0.439, 0.0,
              0.0625, 0.500,  0.500, 1.0 );

YUV = RGBtoYUV * RGB;

Некоторые другие формулы приведены в http://en.wikipedia.org/wiki/YUV

3 голосов
/ 26 октября 2011

Поскольку пиксель YUV не упакован, вы должны прикрепить несколько цветовых буферов к программе шейдеров (т. Е. Один для яркости и два для цветности).

Размеры выходных буферов цветности отличаются от яркости один, из-за выборки цветности.По этой причине вы должны проверить расширение ARB_framebuffer_object.Если не доступно, вы должны вычислить несоответствующие значения цветности и сэмплировать их после рендеринга.Также обратите внимание, что сэмплирование в шейдере не так просто, так как вы должны знать исходное положение пикселя, и быть осторожным с координатами текстуры.

Итак, создайте объект кадрового буфера, присоедините 3 объекта renderbuffer (или текстуры), иобъявите выходную переменную фрагмента шейдера как массив длиной 3 vec4.

Присоединенные буферы могут иметь КРАСНЫЙ внутренний формат, поскольку они хранят только один компонент.

После визуализации извлекайте данные рендеринга (или текстуры)данные), чередуйте слой YUV по мере необходимости (возможно, используя SSE), и вы сделали свою работу.

Возможно, вы хотите сгенерировать несэмплированные значения цветности.В этом случае вы должны самостоятельно сэмплировать буферы цветности, возможно, смешивая смежные значения цветности.

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