Хобрук: Ваш путь к мастерству в программировании

Использование объекта фреймбуфера в качестве текстуры в шейдере

Могу ли я использовать копирование FBO https://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt, чтобы передать обработанный FBO в виде текстуры на вход шейдера разрешения?

Могу ли я использовать FBO в качестве входных данных для шейдера "sampler2D"?

То есть я что-то рендерю в fbo. Теперь я хочу выполнить постобработку изображения, могу ли я передать FBO в качестве текстуры шейдеру?

06.07.2014

  • Извините, ваш вопрос как таковой не имеет особого смысла, не могли бы вы уточнить? 06.07.2014
  • @peppe Сейчас лучше? 06.07.2014

Ответы:


1

Вы не «передаете FBO как текстуру».

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

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

Итак, самый простой из возможных вариантов:

  1. Создайте текстуру нужного размера и типа (например, того же размера, что и область просмотра, и 8-битный RGB)
  2. Create a FBO by
    1. creating the FBO object itself
    2. прикрепление к ней ранее созданной текстуры к прикреплению цвета (GL_COLOR_ATTACHMENT0) через glFramebufferTexture2D​

потом

  1. Свяжите свой FBO
  2. Нарисуйте содержимое, которое хотите постобработать
  3. Привязать FBO по умолчанию (т.е. экран)
  4. Свяжите свою шейдерную программу постобработки
  5. (Необязательно) Свяжите свою текстуру (теперь содержащую цветовое содержимое FBO) как активную в текстурном блоке и установите индекс текстурного блока как sampler2D униформу в вашей шейдерной программе.
  6. Нарисуйте полноэкранный четырехугольник. В фрагментном шейдере вы можете выбрать текстуру и применить любую фильтрацию.

Обратите внимание, что операции, выполненные выше, не предназначены для "дублирования буфера кадра". Блиттинг означает возможность копирования подпрямоугольника одного 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
  • Итак, что означает блиттинг FBO? 06.07.2014
  • Доработан в кузове. 06.07.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..