Можно ли получить этот эффект «хроматического сдвига» с помощью шейдеров OpenGL? - PullRequest
4 голосов
/ 23 ноября 2011

Я хотел бы иметь возможность производить этот эффект, а именно, цвет-сканирование / изменение цвета.

color shift

Возможно ли это с шейдерами OpenGL,или мне нужно использовать другую технику?

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

К вашему сведению, я использую Cinder в качестве моей платформы OpenGL.

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

Ответы [ 3 ]

4 голосов
/ 23 ноября 2011

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

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

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

Это хорошее руководство по сверточной фильтрации с GLSL.Вы также можете использовать для циклов вместо того, чтобы развернуть циклы.http://www.ozone3d.net/tutorials/image_filtering_p2.php

Я предлагаю вам использовать некоторые ядра в форме Гаусса, причем размытие для красного и синего цветов сильнее зеленого, и, конечно, слегка смещенные центральные точки.

4 голосов
/ 23 ноября 2011

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

black and white image

Шаги для получения нужного изображения

  1. Получить исходное черно-белое изображение в текстуре.Если это результат другого рендеринга, скопируйте его в текстуру.
  2. Рендеринг полноэкранного четырехугольника (или нужного размера) с координатами текстуры от (0,0) до (1,1) и стекстура прикреплена.
  3. Примените фрагментный шейдер, который в 3 раза сэмплирует входную текстуру с другим сдвигом координат текстуры.например, -2 текселя, 0 текселей и +2 текселя смещения.Вы можете истечь срок действия и попробовать больше семплов, если хотите, и с разными смещениями.
  4. Объедините эти 3 семпла, сохранив только один компонент цвета каждого.или шейдеры недоступны

    Не используйте пиксельный шейдер, а вместо этого при смешивании OpenGL с функцией ADD.Визуализируйте 3 раза один и тот же полноэкранный квад с прикрепленной текстурой и используйте матрицу текстур для смещения поисков каждый раз.Маскируйте выходную цветовую маску по-разному для каждого прохода, и вы получите один и тот же результат: проход 1 => красный, проход 2 => зеленый, проход 3 => синий.

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

GeexLab имеет демо Chromatic Abberation с источником в своей библиотеке шейдеров здесь .

...