DisplacementShaders

Глобальная переменнаяТипСодержит в себе
PpointПозиция точки шейдинга W
NnormalНормаль точки шейдинга W

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


Задача шейдера дисплейсмента состоит в том, чтобы изменять позиции и/или нормали точек поверхности,
содержащихся соответственно в P и N. Когда вы применяете шейдер дисплейсмента к объекту, убедитесь, что вы также задали границы дисплейсмента для поверхности объекта соответсвующим вызовом из RIB:


Attribute “displacementbound” “sphere” [#]

где # – максимальное расстояние, на которое ваша поверхность будет смещена.
Если это значение будет слишком маленьким, на смещенной поверхности появятся дырки;
если этот параметр будет слишком большим, будет задействовано слишком много памяти для рендера.
Так как displacementbound это атрибут, вы можете задавать разное значение для разных объектов.




Pt – точка поверхности, существующая в пространстве объекта. По умолчанию, точки находятся
в пространстве камеры; таким образом, если мы используем P вместо Pt в функции шума (noise),
текстура дисплейсмента будет плыть по поверхности объекта, когда объект будет перемещаться относительно камеры.


Цикл for в шейдере создает фрактал. Фрактал – текстура, составленная из постепенно уменьшающихся
копий себя и очень похожая на многие природные явления (горы, побережье, пятна грязи).


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




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


Приведём далее другой пример – шейдер, эмулирующий фактуру кожи рептилий.
Он использует так называемую технику «бомбежки», которую мы обсудим в статье shading techniques.
Заметьте, что шейдер использует u и v для расчетов, поэтому его нужно применять только к сплайновым патчам.




В шейдере используется функция cellnoise. Возможно, вы захотите просмотреть
описание этой функции в Maths and Concepts.


Немного изменив этот шейдер, мы сможем его использовать для эмуляции перьев (или текущей лавы?).




Здесь вы впервые видите использование глобальных переменных dPdu и dPdv,
которые содержат направление (в пространстве) параметров u и v.
В данном случае я использую их для смещения точек вдоль u и v; таким образом
получается эффект «слоености».


Последний пример показывает, что, используя Renderman, вы можете смещать точки
поверхности в любом направлении. Большинство других пакетов рендеринга, если они
вообще поддерживают дисплейсмент-шейдинг, смещают точки поверхности только
в направлении нормали. Но единственное предупреждение: так как кажется, что
вы можете придать объекту любую форму, на практике радикальный дисплейсмент
при рендеринге использует огромное количество памяти. Таким образом, лучше
использовать дисплейсмент только для добавления деталей к поверхности;
изменения поверхности в больших масштабах могут быть сделаны в программах моделинга/анимации.