Применение шейдера к объекту кадрового буфера для получения эффекта «рыбий глаз» - PullRequest
2 голосов
/ 24 ноября 2010

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

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

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

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 24 ноября 2010

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

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

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

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

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

2 голосов
/ 24 ноября 2010

Ищите здесь соответствующую информацию:

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

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

...