GLSL Shader Effects: как сделать размытие в движении?

16

У меня есть полноценная 2D-среда, со спрайтами в виде ландшафта, персонажами и т. Д.

Чтобы сделать его более современным, я хочу реализовать эффект размытия в движении, подобный размытию в современных играх FPS (например, Crysis), при быстром перемещении камеры.

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

Гримшоу
источник
Храните несколько копий вашего обработанного буфера. Например, размыть четыре из предыдущих кадров, чтобы создать текущий кадр. Это должно создать эффект, который вы хотите.
knight666
@ knight666 было бы лучше (память, конечно, скорость, в которой я не уверен) сохранить 1 дополнительный буфер (назовите его A) и чем смешать часть (скажем, 0,75) этого с выходным буфером (переходя к экрану, назовите это B) и затем скопируйте B к A впоследствии. Это создаст скользящее среднее, и увеличение размытия в движении не будет стоить ничего лишнего.
Эльва
1
Я хотел сделать это комментарием, но не смог найти кнопку комментария. В любом случае, то, что говорит Дейв О., это, вероятно, лучший выбор и то, что используется в играх, таких как Crysis. Это работает примерно так. Во время рендеринга объекта, Рендеринг скорости объекта в отдельный буфер. MRT сделает это немного быстрее, и есть несколько способов вычислить скорости, но вы хотите получить дополнительный буфер, который имеет скорости для всего буфера рендеринга. Затем в шейдере постобработки, основанном на скорости в каждом пикселе, вы
выбираете
Код HLSL / Cg в листинге 27-1 использует предыдущие уравнения в полноэкранном пиксельном шейдере постобработки, чтобы вычислить мировое положение объектов, визуализированных в данном пикселе, используя буфер глубины и обратное значение текущего матрица проекции вида. ... HLSL .... В вашем коде это не GLSL .....

Ответы:

6

Сохраните копию последнего кадрового буфера. Получить вектор движения камеры и инвертировать его. Нарисуйте свою сцену как обычно, затем нарисуйте последний кадровый буфер с небольшим смещением (дельта камеры, которую вы только что рассчитали) и 0,75 альфа. Повторите столько раз, сколько хотите, чтобы получить эффект размытия движения.

r2d2rigo
источник
1
Этот подход очень прост в реализации, но его очень сложно настроить (он может выглядеть как объекты, оставляющие следы, а не размытые). Другой также простой подход состоит в том, чтобы «размывать» пиксели в инвертированном направлении движения камеры в пиксельном шейдере постобработки.
Дейв О.
6
Основная проблема этого подхода заключается в том, что он зависит от частоты кадров - он будет выглядеть совсем иначе, если вы работаете на скорости 20 кадров в секунду по сравнению с тем, как он выглядит, если вы работаете на скорости 100 кадров в секунду. Пока вы знаете об этом и получаете желаемый результат на частоте кадров, на которой вы работаете, это нормально, но вы должны знать об этом.
Максимус Минимус
19

Я бы порекомендовал использовать этот метод: Motion Blur как эффект пост-обработки

Очень простой в реализации, это тот, который я использовал на моей демоверсии glsl Ruin island [ссылка]

kragniz
источник
Этот метод намного превосходит смешивание в прошлых кадрах ...
Стивен Лу
Как и сейчас, этот ответ просто дает ссылку. Если в будущем связь прекратится, никто не узнает, как на самом деле решить свою проблему. Попробуйте хотя бы включить необходимую информацию, которую дает вам ссылка
Да, давайте сделаем копию Интернета, потому что эта копия не сломается в любой день: J
SasQ