2010-11-21 1 views
5

Я пытаюсь прочитать значения альфа-пикселей с помощью glReadPixels. Первое, что я сделал, - это прочитать отдельные пиксели. Для того, чтобы попытаться ускорить процесс, я пытался читать все пиксели сразу:glReadPixels и GL_ALPHA

GLubyte *pixels = new GLubyte[w*h*4]; 
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

, и она работала, но очень медленно. Теперь я пытаюсь просто получить альфа-значение, не теряя пространства для компонентов RGB:

GLubyte *pixels = new GLubyte[w*h]; 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei(GL_PACK_ALIGNMENT, 1); 
glReadPixels(0, 0, w, h, GL_ALPHA, GL_UNSIGNED_BYTE, pixels); 

Но я получаю: OpenGL error 0x0500 in -[EAGLView swapBuffers].

Любая идея относительно того, почему выбрано INVALID_ENUM (0x0500)?

ответ

6

В соответствии с documentation on glReadPixels() for OpenGL ES действительными значениями перечисления для параметра формата являются GL_RGBA и GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES. Вам нужно будет проверить и посмотреть, что GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES означает формат для iPhone, но он может не поддерживать GL_ALPHA.

В любом случае, я сомневаюсь, что переход на этот маршрут значительно ускорит ваши чтения, потому что все, что будет сделано, - это отбросить компоненты RGB. Проблемы с производительностью с glReadPixels(), вероятно, лежат в другом месте. Хорошее обсуждение причин этого можно найти в обсуждении темы here.

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

+0

Благодарим вас за это. Что касается вашего последнего предложения, есть ли у вас какие-либо указания относительно того, как это реализовать? – sharvey

+0

@sharvey - Смотрите мою запись здесь: http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios. Пример приложения, который у меня есть: http://www.sunsetlakesoftware.com/sites/default/files/ColorTracking.zip использует внеэкранный фреймбуфер для рендеринга текстуры, хотя я втягиваю результат с помощью 'glReadPixels()', потому что я не удалось закончить усреднение цвета на графическом процессоре, которое я хотел. В итоге я использовал более медленную процедуру C для этого. В какой-то момент я это завершу. –