Этот шейдер содержит несколько уникальных возможностей, а процесс его со-'здания описан в кандидатской диссертации Фрейденберга [6]. Шейдер штриховки основан на шейдере деревянных полосок, разработанном Скоттом Джонстоном и описанном в книге «Углубленный RenderMan: создание CGI для анимации».

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

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

15.1.1. Настройка приложения

Приложение должно задавать координаты вершин, нормали и простой набор текстурных координат. Нормали нужны для довольно простого вычисления освещения, а текстурные координаты - в качестве основы для процедурного шаблона штрихов. Координаты источника освещения передаются в uniform-переменшй, приложение также должно обновлять значение переменной Тi me для каждого кадра, так что поведение шейдера можно менять от кадра к кадру. Для придания каждому штриху индивидуальности можно использовать функцию шума. В этом случае приложение будет создавать несколько значений шума и сохранять результаты в трехмерной текстуре. Значение uniform-переменной типа sampl er3D будет устанавливаться приложением, чтобы фрагментный шейдер обращался к соответствующему текстурному модулю, чтобы получить значения шума.

15.1.2. Вершинный шейдер

Вершинный шейдер штриховки приведен в листинге 15.1. Varying-переменная ObjPos нужна как основа для вычислений штриховки во фрагментном шейдере. Чтобы выполнять анимацию штрихов, вершинный шейдер прибавляет uniform-переменную Time к координате 2 входных координат вершины. Это создаст впечатление, что штрихи «плывут» вдоль оси z. Коэффициент масштабирования учитывает видимый размер объекта на экране. (Чтобы применять его к различным объектам, константное значение нужно заменить uniform-переменной.) Остальная часть вершинного шейдера выполняет простые вычисления диффузного освещения, копирует координату t текстурных координат в varying-переменную V и вычисляет значение встроенной переменной gl_Position.


⇐ вернуться назад | | далее ⇒