SurfaceShaders


Глобальная переменнаяТипСодержит в себе
Oi, CicolorРезультирующая прозрачность и цвет Запись
Os, CscolorИсходная прозрачность и цвет Чтение
PpointПозиция точки шейдинга Чтение
NnormalНормаль к поверхности в точке шейдинга Чтение
u, vfloatПараметры поверхности Чтение
s, tfloatТекстурные координаты Чтение
LvectorНаправление входящего света в цикле “illuminance” Чтение
ClcolorЦвет света в цикле “illuminance” Чтение
OlcolorПрозрачность света в цикле “illuminance” Чтение
EpointПоложение камеры Чтение
IvectorНаправление луча из камеры Чтение
du, dvfloatИзменение u и v по микрополигону Чтение
dPdu, dPdvvector3D направления по u и v Чтение

Назначение шейдера поверхности состоит в вычислении прозрачности и цвета поверхности в точке шейдинга, определяемых переменными Oi и Ci соответственно. Вот предельно простой шейдер поверхности:




Os и Cs – это прозрачность и цвет, переданные из определений Opacity и Color в RIB файле. Попробуйте изменить прозрачность в RIB, и Вы увидите, что случится с отрендереной картинкой. Теперь сделайте следующие изменения в шейдере, и попробуйте пересчитать изображение вновь.




Итак, как мы видим, рендер не предопределяет взаимосвязи между переменными — Вам необходимо установить эти взаимосвязи самим в исходном тексте шейдера.


Теперь давайте посмотрим на шейдинг.




Неосвещенная область объекта выглядит слишком темной, давайте добавим немного яркости отраженного света (ambient). Также давайте установим несколько параметров, чтобы нам не надо было компилировать шейдер снова если мы вдруг захотим изменить значения diffuse или ambient.




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




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


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




Процедурные текстуры


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




Обратите внимание на ступенчатость на крае круга. Это произошло от того, что поверхность поделена на микрополигоны, которые слишком велики, чтобы отображать текстуру – это всё равно, что разглядывать картинку на мониторе низкого разрешения. Позже мы обсудим пути к устранению этого артефакта.


Как упражнение, попробуйте изменить этот шейдер таким образом, чтобы он показал окружность вместо заполненного круга.


Вот другой пример — шейдер шахматной доски.




И, наконец, звезда.





Идея приведенного выше шейдера состоит в вычислении кратчайшего расстояния между точкой шейдинга (s0,t0) и линией, ограниченной конечными точками (s1,t1) и (s2,t2). Решение лежит в формуле расстояния от точки до линии


distance = ((t2-t1) * (s0-s1) - (s2-s1) * (t0-t1)) / sqrt((s2-s1)*(s2-s1) + (t2-t1)*(t2-t1))

Пунктирные стороны диаграммы звезды – просто копии первой закрашеной части, повернутые и вывернутые относительно центра. Таким образом эти скопированные стороны и точки шейдинга, поподающие в их влияние могут быть трансформированы в сектор, занятый первой частью, и потом вычеслены по той-же формуле. Вспомните раздел Maths And Concepts, где мы научились использовать функцию mod для повторения числа. Можете Вы описать как эта техника была использована в этом шейдере?