BGRA на iPhone glTexImage2D и glReadPixels - PullRequest
       14

BGRA на iPhone glTexImage2D и glReadPixels

1 голос
/ 23 февраля 2011

Глядя на документы, я смогу использовать BGRA для внутреннего формата текстуры.Я предоставляю текстуру с данными BGRA (используя GL_RGBA8_OES для glRenderbufferStorage, так как кажется, что BGRA там не разрешен).Тем не менее, следующее не работает:

glTexImage2D(GL_TEXTURE_2D, 0, **GL_BGRA**, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
...
glReadPixels(0, 0, w,h, GL_BGRA, GL_UNSIGNED_BYTE,buffer, 0);

Хотя это дает мне черную рамку:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
...
glReadPixels(0, 0, w,h, **GL_BGRA**, GL_UNSIGNED_BYTE,buffer, 0);

И это работает, но блюз / красный инвертированы (я поставляю BGRAданные в текстуру):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
...
glReadPixels(0, 0, w,h, **GL_RGBA**, GL_UNSIGNED_BYTE,buffer, 0);

... почему я не могу просто использовать BGRA везде?Я заметил, что glRenderbufferStorage не поддерживает форматы BGRA ... Я действительно запутался.BGRA - единственный подходящий формат, в котором хранятся мои данные, поскольку он поступает с камеры iphone.

Ответы [ 2 ]

5 голосов
/ 25 февраля 2011

Третий параметр glTexImage2D() - это количество компонентов цвета в текстуре, а не порядок пикселей текстуры. Вы хотите использовать GL_RGBA здесь, или это просто не будет работать.

Я не верю, что GL_BGRA поддерживается на устройствах iOS в качестве цветового формата. Хотя предоставление пиксельных данных для текстур в формате BGRA рекомендуется Apple при обработке кадров видеоизображений, я думаю, что вы можете прочитать их обратно в формате RGBA и затем кодировать их на диск, как описано в другом месте.

Если вы хотите увидеть пример проекта, который принимает видеокадры камеры в BGRA, отправляет их в текстуру, обрабатывает их с помощью шейдеров, а затем считывает полученные пиксели обратно, вы можете посмотреть тот, который я построил здесь .

0 голосов
/ 15 июня 2013

Мои собственные поиски OpenGL ES2 указывают на то, что это работает для прямого порядка байтов BGRA под iOS. Здесь «пиксели» указывают на буфер 32-битной BGRA, который будет получен из CGBitmapContextCreate () или извлечет данные изображения из CGImageRef.

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);

См. Apple Ext для этого здесь . Хорошее обсуждение этого вопроса здесь

...