Штриховой карандашный шейдер

Как-то это: нефотореалистично, - сказала она и подставила губы.
(Эпиграф)



Ну вот, еще ничего не сказал, а уже слышно про Шрека, Айс Эйдж, Файнл Фэнтэзи. Ша, как говорят в соседней с нами Одессе, пароход уже отплыл, или вы можете плавать?
Что если повернуться к морю своим фотореалистичным задом, а сюда передом. Так вот, как перед переду говорю - будем рисовать, а не фотографировать. Насколько я знаю, обычно рисуют карандашом. Вот и занятие нашлось - сымитировать карандашный рисунок. Коллеги художники с долей скептицизма поведали об основах ретуши - опираясь на эти познания, и начнем мытарства. Основа карандашного рисунка - штрих. Он может быть более или менее плотным, разной длины, кривизны и направления. Штриховка обязана подчеркнуть форму объекта, выявить его контур и нести налет случайности некоего провидения, или, если хотите, вдохновения, водящего живописца за руку. Вот и засунем вдохновение в рамку шейдера, оставив в покое фотошоповские фильтры.
Если взять некую двумерную структуру с точкой в ее центре, натянуть ее на объект и регулярно повторять n-ное количество раз V координату, то вполне возможно получить на объекте штрих (stroke) вдоль V координаты UV пространства длиной в n единиц.
Если вместо текстуры с точкой взять фрактальную структуру, то на объекте прорисуется некий массив штрихов случайной толщины, то есть штриховка (hatching).
А если всю фрактальную текстуру повернуть на некоторый угол, то и штриховка ляжет под неким углом к оси V. А это уже просто вдохновляющий факт. Судите сами, эти два простых шага дают возможность и положить штриховку, и выявить форму, и увидеть, что это еще далеко не конец, но путь проглядывается.
Теперь если связать полутоновое изображение объекта с цветом (читай яркостью) штриха, можно еще более выпукло проявить объемы. А можно использовать не тонировку в качестве источника управления цветом массива штрихов, а угол нормали объекта к продольной оси камеры. Больше угол - плотнее и темнее штриховка.

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

Чтобы запал не остыл, поглядим некоторые иллюстрации из известных работ по нефотореалистичному рендеру.

Стэнфордский кролик тонированный штриховкой с искривленным штрихом.

Полутоновое и точечное тонирование трехмерного бюста.

Модель тигра, тонированная штриховкой удлиненным искривленным штрихом для достижения иллюзии меха или шерсти.

Перекрестная штриховка с наложением рисунка на крыло мухи, по которому изменяется плотность штриховки.

Скорее за дело. Открываем Hypershade и создаем фрактальную структуру Create\2D Textures\Fractal. Для модулирования штриховки по цвету воспользуемся примитивным градиентом - Create\2D Textures\Ramp. Информацию об угле нормали к оси камеры получим от узла Create\General Utilites\Sampler Info. Связываем выход samplerInfo.facingRatio со входом ramp.vCoord, выход ramp.outColor со входом fractal.colorOffset.

Увеличить

Можно создать узел Crayon Create\Materials\Surface Shader и связать выход fractal.outColor со входом Crayon.outColor и, затем, побаловаться с градиентом с целью достижения наивыигрышного варианта тонировки.

Увеличить

Помнится, было желание управлять штрихами по длине, плотности и направлению. Добавим узлу Surface Shader Crayon дополнительные атрибуты и зададим им некоторые граничные значения и значения по умолчанию.

Например, атрибут strokeLength должен регулировать длину штриха, Direction и Density направление и плотность, соответственно. Есть и другая группа атрибутов, связанная с Ink Line, то есть с краевым контуром. Те же плотность, направление и длина штриха, но и еще и граничная толщина контура InkLineWidth. Как обычно для прорисовки InkLine воспользуемся узлом условия Create\General Unilites\Condition. Перенаправим fractal.outColor на вход condition.colorIfTrue. Выход samplerInfo.facingRatio продублируем на вход condition.firstTerm. На вход condition.secondTerm подадим толщину краевого контура crayon.InkLineWidth. Таким образом, все участки объекта, направление нормалей которых не ограничено толщиной краевого контура, будут заполнены созданной штриховкой. Свяжем Crayon.strokeDensity и fractal.frequencyRatio, и сможем регулировать плотность штриховки. Свяжем Crayon.strokeLength с фрактальной 2Dtexture.repeatV, а Crayon.strokeDirection с 2Dtexture.rotateFrame, и получим инструмент регулирования длины штриха и его направления.
Аналогичным образом строим градиентно-фрактальную структуру для краевого контура и связываем дополнительные атрибуты. Получается следующая картина:

Увеличить

А вот и тесты, отрендеренные с помощью такого шейдера.



Список источников:
1. Fast Primitive Distribution for Illustration. Adrian Secord, Wolfgang Heidrich, Lisa Streit, Department of Computer Science, The Universitz of British Columbia, Vancouver, Canada, 2002.
2. Creating Non-Photorealistic Images the Designer's Way. Nick Halper, Stefan Schletchtweg, Thomas Strothotte, Department of Simulation and Graphics, Otto-von-Guerichke University og Magdeburg
3. Illustrating Surface Shape in Volume Data via Principal Direction Driven 3D Line Integral Convolution. Victoria Interrante, Institute for Computer Applications in Science and Engineering (ICASE).
4. Hatcing by Example: a Statistical Approach. Pierre-Marc Jodoin, Emric Epstein, Martin Grander-Piche, Victor Ostromouchov, Universite de Montreal.
5. The Lit Sphere: A Model For Capturing NPR Shading from Art. Peter Pike J. Sloan, Microsoft Research, and others.
6. http://www.cs.utah.edu/npr/papers/
7. http://www.siggraph.org/s2002/conference/
8. http://www.alias.com
9. http://www.highend3d.com/maya/shaders/

342 0 850 5
1
2010-09-30
а можно примерчик выложить с реализацией этих сумасшедших шагов гения??? (ответе в личку, плиз!)
RENDER.RU