Шейдер объектива / Искажение изображения

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


person Valerij    schedule 06.11.2011    source источник


Ответы (2)


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

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

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

person NickLH    schedule 06.11.2011
comment
перевернутый маленький прямоугольник — это только первый шаг в создании шейдера, предназначенный для иллюстрации того, что я буду архивировать в первую очередь. - person Valerij; 13.11.2011

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

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

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

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

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

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

person datenwolf    schedule 06.11.2011