Применение шейдера к объекту фреймбуфера для получения эффекта «рыбий глаз»

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

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

Если можно применить шейдер к FBO, возможно ли получить эффект «рыбий глаз»? (например, так: http://idea.hosting.lv/a/gfx/quakeshots.html )

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

Спасибо


person Adham    schedule 24.11.2010    source источник


Ответы (2)


Объект кадрового буфера инкапсулирует несколько других буферов, особенно те, которые неявно индексируются по местоположению фрагмента. Таким образом, один объект кадрового буфера может объединять буфер цвета, буфер глубины, буфер трафарета и множество других. Отдельные буферы известны как буферы рендеринга.

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

Если ваш графический процессор имеет поддержку рендеринга в текстуру (первоначально это было расширение примерно OpenGL 1.3, но в настоящее время вам будет трудно найти графический процессор без него, даже в мобильных телефонах), то вы можете связать текстуру как буфер рендеринга внутри фреймбуфера. Таким образом, код рендеринга выглядит точно так же, как и обычно, но заканчивается записью результатов в текстуру, которую затем можно использовать в качестве источника для рисования.

Фрагментные шейдеры могут программно решить, какое местоположение карты текстуры использовать для выборки, чтобы создать свой вывод. Таким образом, вы можете написать фрагментный шейдер, который применяет линзу «рыбий глаз», хотя, очевидно, вы ограничены полем зрения, отображаемым в исходной текстуре. Что, вероятно, было бы тем, что вы получили бы в своем примере с Quake, если бы у вас была доступна только одна из сторон куба, а не шесть.

Подводя итог: ответ «да» на все ваши вопросы. Краткое введение в объекты фреймбуфера здесь.

person Tommy    schedule 24.11.2010
comment
Итак, после того, как вы создали объект буфера рендеринга, захватили отрендеренный вывод приложения для использования в качестве текстуры, какова цель фрагментного шейдера? Вы упомянули, что фрагментный шейдер может программно решать, из какого места следует производить выборку. Не могли бы вы объяснить, что вы имели в виду под этим в контексте этой проблемы? - person Adham; 24.11.2010
comment
Что вы можете сделать, так это нарисовать один четырехугольник, содержащий линзу «рыбий глаз». Каждый фрагмент получит ввод (x, y), но вместо того, чтобы просто искать пиксель в (x, y) в исходном изображении и устанавливать его в качестве выходного цвета, он выполнит расчет, чтобы определить, где получить введите цвет из, чтобы изображение выглядело как рыбий глаз (вероятно, что-то вроде переключения на полярные координаты и добавления косинуса к расстоянию?) — точно так же, как это сделал бы Photoshop. Затем вы отправляете только один четырехугольник и получаете идеальный рыбий глаз. - person Tommy; 24.11.2010

Посмотрите здесь для некоторой соответствующей информации:

http://www.opengl.org/wiki/Framebuffer_Object

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

person Obnoxious Hood Ornament    schedule 24.11.2010