Вы не «передаете FBO как текстуру».
Вместо этого происходит то, что вы создаете FBO, используя текстуры в качестве вложений (в частности, для вложений цветов); тогда вы можете рисовать обычным образом (для цели FBO по умолчанию, обычно экрана), используя содержимое такой текстуры.
Для типичных полноэкранных эффектов постобработки обычно рисуется полноэкранный четырехугольник, но, конечно, вы в значительной степени ограничены своим собственным воображением (например, вы можете нарисовать содержимое FBO на сетке телевизора, чтобы имитировать живую камеру. ). В то же время вы можете выполнять любую постобработку во фрагментном шейдере.
Итак, самый простой из возможных вариантов:
- Создайте текстуру нужного размера и типа (например, того же размера, что и область просмотра, и 8-битный RGB)
- Create a FBO by
- creating the FBO object itself
- прикрепление к ней ранее созданной текстуры к прикреплению цвета (
GL_COLOR_ATTACHMENT0
) через glFramebufferTexture2D
потом
- Свяжите свой FBO
- Нарисуйте содержимое, которое хотите постобработать
- Привязать FBO по умолчанию (т.е. экран)
- Свяжите свою шейдерную программу постобработки
- (Необязательно) Свяжите свою текстуру (теперь содержащую цветовое содержимое FBO) как активную в текстурном блоке и установите индекс текстурного блока как
sampler2D
униформу в вашей шейдерной программе.
- Нарисуйте полноэкранный четырехугольник. В фрагментном шейдере вы можете выбрать текстуру и применить любую фильтрацию.
Обратите внимание, что операции, выполненные выше, не предназначены для "дублирования буфера кадра". Блиттинг означает возможность копирования подпрямоугольника одного FBO в подпрямоугольник другого FBO (конечно, вы можете просто копировать всю область). Используемый здесь FBO может включать FBO по умолчанию (то есть экран). Невозможно выполнить постобработку с помощью блит-кода, поскольку шейдеры не задействованы.
Блиттинг в основном полезен в конкретном сценарии: копирование содержимого FBO с множественной выборкой в FBO без множественной выборки, а затем использование последнего для выполнения постобработки или в качестве источника текстуры. Причина этого в том, что использование в основном историческое - более старые версии GL (‹3.2) предоставляли способ создания FBO с множественной выборкой путем присоединения мультисэмплированного цветного Renderbuffer, но не имели возможности прочитать значения обратно в шейдер (Renderbuffer - это буфер, который вы можете присоединить к FBO, как и текстуры, но в отличие от текстуры, вы не можете сэмплировать его содержимое). Следовательно, было создано два FBO - один объект с множественной выборкой для выполнения отрисовки, который затем преобразовался во второй FBO без множественной выборки посредством операции блит-операции. К этому второму FBO была прикреплена текстура в качестве прикрепления цвета, и вы могли затем сэмплировать из нее.
В наши дни (> = 3.2 или с GL_ARB_texture_multisample
) OpenGL предлагает способ создания мультисэмплированных текстур, которые можно использовать непосредственно в шейдерах (через sampler2DMS
сэмплеры). Никакого блит-шага не требуется.
06.07.2014