2016-07-01 1 views
0

Мне нужно извлечь маленький прямоугольник (200x200) из большой текстуры (2048x2048) и поместить пиксели RGBA в память. Там, кажется, два способа сделать это:glReadPixels vs. glGetTexImage

а) использовать glGetTexImage и передать в буфер, который получает всю текстуру, и прочитать соответствующие пиксели из этого

б) создать видеобуфер, втянуть в него с помощью текстуру с только необходимой частью и извлечь пиксели, созданные с помощью glReadPixels.

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

Стив

ответ

3

Учитывая, что данные изображения в текстуре, есть несколько возможных решений. Заказал из наиболее желательном наименее:

  • Наймите glGetTextureSubImage (требуется OpenGL 4.5 или ARB_get_texture_sub_image) просто сделать работу непосредственно.

  • Использование glCopyImageSubData (требует OpenGL 4.3 или ARB_copy_image. Или NV_copy_image. Последнее implemented on more hardware than just NVIDIAs) к copy the desired rectangle в текстуру соответствующего размера, а затем использовать glGetTexImage на этом.

  • Прикрепите большую текстуру к FBO, затем прикрепите небольшую текстуру к другому FBO. Используйте glBlitFramebuffer (требуется OpenGL 3.0 или ARB_framebuffer_objects) to copy the desired section of the large texture to the small one. Затем используйте glGetTexImage на небольшой текстуре.

Визуализация текстуры к фреймбуферу с треугольниками будет необходим только в случае работы в очень старых OpenGL реализаций.

+0

Увы, для a) Я имел в виду glGetTexImage, а не glTexImage2d. – stevenkucera

+0

@stevenkucera: Тогда, пожалуйста, отредактируйте свой вопрос. –

+0

OK Я закодировал решение b), и это колоссально в 50 раз быстрее (100 микросекунд по сравнению с 5 миллисекундами). Оглядываясь назад, 20/20. – stevenkucera

Смежные вопросы