Для чего используются внеэкранные объекты кадрового буфера iOS OpenGL ES 2.0?

В iOS легко настроить рендеринг OpenGL ES 2.0 на текстуры, а затем использовать эти текстуры для проходов постобработки или в качестве текстур для последующих проходов рендеринга. Это кажется довольно распространенным подходом в реализациях OpenGL. Все хорошо.

В соответствии с Руководством по программированию Apple OpenGL ES для iOS (см. стр. 28 и 29) вы также можете создавать и рисовать несколько объектов внеэкранного буфера кадра. Они предполагают, что вы сделали бы это для того, чтобы выполнить обработку закадрового изображения. Однако я не могу найти описание того, как вы могли бы получить доступ к буферам для обработки изображений или любых других целей после их рендеринга.

Можно ли использовать эти внеэкранные буферы с платформами, отличными от OpenGL, для обработки изображений? Могут ли эти буферы быть прочитаны процессором?

У кого-нибудь есть указатели или примеры?


person Chuck    schedule 30.09.2012    source источник


Ответы (1)


Обработка изображений — одно из возможных применений внеэкранных объектов кадрового буфера (FBO), но для этого есть и другие приложения.

Для обработки изображений вы чаще всего выполняете рендеринг в FBO, который поддерживается текстурой. После того, как вы выполнили рендеринг этой текстуры, вы можете перенести ее на второй этап вашего конвейера обработки изображений или использовать ее в качестве текстуры в какой-либо части вашей трехмерной сцены. В качестве примера этого, моя инфраструктура с открытым исходным кодом GPUImage использует закадровый FBO с поддержкой текстуры для каждого этапа фильтрации, применяемого к входящим изображениям или видеокадрам. Затем на следующем этапе извлекается эта текстура и рендерится отфильтрованный результат в собственный FBO с поддержкой текстуры.

Как я уже сказал, могут быть и другие приложения для рендеринга за кадром. К ним относятся отложенное освещение (довольно впечатляющий пример которого у Apple есть в видеороликах WWDC OpenGL ES 2011 года) и вычисление кэшированных значений поиска для дальнейшего использования. Последнее я использую в качестве оптимизации в своем приложении Molecules, чтобы ускорить наложение текстур освещения окружающего затенения на поверхность моих атомных сфер. Вместо того, чтобы выполнять набор вычислений для каждого фрагмента каждого атома, я визуализирую их один раз для общей сферы, а затем ищу результаты в шейдере фрагментов атома.

person Brad Larson    schedule 01.10.2012
comment
Извините, возможно, я был неясен, хотя и не из-за того, что не пытался. Я, конечно, понимаю ценность рендеринга в текстуры и уже использую это для разных вещей, включая мою попытку SSAO. Что меня смущает, так это то, что вы можете рисовать в буферах рендеринга без текстуры, и я не понимаю, что вы можете с ними сделать. Взгляните на Руководство по программированию Apple OpenGL ES для iOS (стр. 28 и 29). Они присоединяют буферы внеэкранного рендеринга к буферу кадра, а не текстуры и не буфер рендеринга экрана EAGL. Я не могу сказать, для чего можно использовать эти закадровые буферы рендеринга. - person Chuck; 02.10.2012
comment
@ Чак, у меня тот же вопрос. Это то, что я нашел до сих пор. Основываясь на документации здесь, вы можете После отрисовки в закадровый буфер рендеринга вы можете вернуть его содержимое в ЦП для дальнейшей обработки с помощью функции glReadPixels. Он находится в конце этого раздела: developer.apple.com/library/ios/documentation/3DDrawing/ - person Zhao; 13.09.2015