netlib.narod.ru< Назад | Оглавление | Далее >

Размытие движущихся объектов

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

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

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

СОВЕТ
Экранный эффект размытия движущихся объектов может служить двум целям. Первая очевидна: простая имитация эффекта размытия движущихся объектов из реальной жизни. Вторая — применение эффекта к сцене, что помогает уравновесить ступенчатость изображения, могущую возникнуть при визуализации, а это служит недорогой альтернативой в тех случаях, когда аппаратная поддержка сглаживания недоступна.

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

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


Рис. 5.17. Схема процесса для эффекта размытия движущихся объектов

Рис. 5.17. Схема процесса для эффекта размытия движущихся объектов


Построение шейдера размытия движущихся объектов

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

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

Сейчас объекты сцены визуализируются в RenderTexture и ваш проход смешивания почти готов. Поскольку вы хотите смешивать две цели визуализации между собой, следует добавить к эффекту переменную, управляющую тем, как будут комбинироваться две текстуры. Добавьте к вашему эффекту переменную типа FLOAT, назовите ее blend_factor и присвойте ей значение 0.5. Поскольку проход смешивания по сути смешивает две цели визуализации в одну, основная задача во многом похожа на обычное копирование цели визуализации. Так что для начала просто скопируем код вершинного и пиксельного шейдера из обычного прохода копирования в наш новый только что созданный проход смешивания.

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

После этих базовых настроек вершинный шейдер уже делает все, что нужно; требуется только внести изменения в пиксельный шейдер. Главные настройки — это добавление выборки для второй цели визуализации и переменной blend_factor. Добавьте их к пиксельному шейдеру, как вы уже делали раньше. Помните, что вам также надо скопировать ссылки на модель и текстуру из прохода копирования в проход смешивания, чтобы визуализировалась правильная геометрия и текстура.

Текущий код пиксельного шейдера просто осуществляет выборку первой текстуры и выводит ее в RenderTarget2. Но теперь вам надо смешивать вместе две текстуры. Для данного эффекта вы просто выполняете выборку для двух текстур, используя одни и те же координаты, и выполняете интерполяцию двух значений на основании переменной коэффициента смешивания. В HLSL вы можете просто воспользоваться функцией lerp, которая выполняет простую линейную интерполяцию между двумя значениями. Код пиксельного шейдера для интерполяции двух целей визуализации выглядит так:

float blur_factor;
sampler Texture0;
sampler Texture1;

float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR
{
    float4 col1 = tex2D(Texture0, texCoord);
    float4 col2 = tex2D(Texture1, texCoord);

    // Интерполяция двух целей визуализации
    return lerp(col1,col2,blur_factor);
}

Почти все готово; осталось только внести изменения в финальный проход копирования. Этот проход по прежнему копирует на экран первую цель визуализации. Это необходимо изменить, чтобы он использовал результат, находящийся в RenderTarget2. Скомпилируйте эффект, и все готово! Если вы попробуете перемещать объект, то увидите формируемые эффектом следы, как показано на рис. 5.18. Вы можете также поэкспериментировать со значениями переменной blur_factor, которая контролирует степень размывания. Полный код шейдера находится в файле shader_7.rfx на CD-ROM.


Рис. 5.18. Рабочее пространство и окно предварительного просмотра для эффекта размытия движущихся объектов

Рис. 5.18. Рабочее пространство и окно предварительного просмотра для эффекта размытия движущихся объектов



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz