Этот шейдер содержит несколько уникальных возможностей, а процесс его со-'здания описан в кандидатской диссертации Фрейденберга [6]. Шейдер штриховки основан на шейдере деревянных полосок, разработанном Скоттом Джонсто-ном и описанном в книге «Углубленный RenderMan: создание CGI для анимации».
Шейдер штриховки должен создавать поверхность объекта так, чтобы она выглядела нарисованной вручную, например, чтобы видны были полоски от чернильной ручки. Каждый штрих способствует зрительному восприятию тона, текстуры
Нефотореалистичные шейдеры
и формы объекта. Эффект, получаемый с помощью этого шейдера, - гравюра, то есть рисунок, имитирующий оттиск изображения, вырезанного на деревянной доске. Если на дереве в каком-нибудь месте была бороздка, на объекте в этом месте не будет чернил. Освещение имитируется изменением ширины бороздок в соответствии с интенсивностью освещения.
У разработчика, желающего создать такой шейдер, сразу возникает несколько проблем. Первая из них - та, что нужно рисовать штрихи, с помощью которых определяются тон и текстура объекта. Простые чередующиеся черные и белые линии создают контрастность на краях, то есть источник неровностей, так что сглаживание придется выполнять в первую очередь. Штрихи на объекте должны оставаться в одном и том же положении при анимации. И наконец, штрихи на гравюре не всегда идеально прямые и одинаковые, как их рисует компьютер. Поэтому нужно создать впечатление, что изображение нарисовано настоящим художником.
15.1.1. Настройка приложения Приложение должно задавать координаты вершин, нормали и простой набор текстурных координат. Нормали нужны для довольно простого вычисления освещения, а текстурные координаты - в качестве основы для процедурного шаблона штрихов. Координаты источника освещения передаются в uniform-переменной, приложение также должно обновлять значение переменной Ti me для каждого кадра, так что поведение шейдера можно менять от кадра к кадру. Для придания каждому штриху индивидуальности можно использовать функцию шума. В этом случае приложение будет создавать несколько значений шума и сохранять результаты в трехмерной текстуре. Значение uniform-переменной типа sampler3D будет устанавливаться приложением, чтобы фрагментный шейдер обращался к соответствующему текстурному модулю, чтобы получить значения шума.