Объектив шейдера / искажение изображения - PullRequest
3 голосов
/ 06 ноября 2011

Ну, у меня сейчас есть 3D-сцена с квадратом (рисованием) с текстурой. Между картиной и «камерой» у меня есть другой квад, который я хотел бы вести себя как оптическая линза: искажение изображения «под» scene i want to archive как можно было бы достичь этого предпочтительно с помощью шейдера и нескольких пиксельных буферов?

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Вот пример, который я недавно обнаружил и который делает нечто очень похожее на то, что вы хотите. http://www.paulsprojects.net/opengl/refract/refract.html

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

Edit: Кстати, вам не понадобится второе изображение (перевернутый маленький прямоугольник). Просто используйте одно фоновое изображение и шейдер.

2 голосов
/ 07 ноября 2011

Между картиной и "камерой" у меня есть места, где я бы хотел вести себя как оптический объектив:

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

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

Действительно, к OpenGL нужно относиться так, как художник относится к его инструментам. Поэтому любой оптический «эффект», который вы хотите создать, должен быть реализован путем овладения различными техниками рисования, возможными с помощью инструментов, предлагаемых OpenGL. Чтобы создать желаемый эффект, вы должны реализовать многоступенчатый процесс.

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

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

...