IntroductionToWritingSurfaceShaders

Введение


В рендермене существуют различия между,

  • ФИГУРОЙ – геометрией объекта, конечным результатом моделинга, и 
  • ЗАТЕНЕНИЕМ – внешним видом объекта, процессом визуализации.

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

  • шейдеры источников света(light shader)
  • шейдеры поверхностей(surface shader)
  • деформирующие шейдеры(displacement shader)
  • шейдеры объёмов(volume shader)
  • шейдеры трансформаций(tramsformation shader), и 
  • шейдеры отображения(imager shader)

Отдельный шейдеры, это маленькие подпрограммки, написанные на специализированном языке программирования, называемом Pixar Shading Language. Этот язык позволяет расширять стандартные возможности рендерера; он позволяет художникам самим отыскивать и воплощать бесконечное количество способов управления внешним видом трёхмерной сцены – с помощью создаваемых ими шейдеров. Единственное ограничение – воображение артиста, его способность писать новые или перерабатывать и использовать уже существующие шейдера и его креативные способности к настройке параметров этих шейдеров.


Хотя, в общем, шейдера разных типов независимы друг от друга, то есть сурфейс-шейдер может быть использован в паре с любым дисплейсмент-шейдером, каждый тип шейдеров играет свою собственную особенную роль в процессе рендера, то есть тот же сурфейс-шейдер не может быть использован в качестве дисплейсмент-шейдера. Например, prman – собственный пиксаровский рендермен-совместимый рендерер откажется использовать шейдер 'plastic' следующим образом: , потому что 'plastic' – это сурфейс-шейдер, а не дисплейсмент.


Обзор процесса шейдинга


Написание шейдеров на Shading Language похоже на написание программ на языке 'C'. Так же как и исходный текст программы на 'C' (файлы .c), код шейдеров пишется в обычном текстовом редакторе, только файлы имеют расширение .sl.


Хотя Shading Language внешне похож на 'C', это НЕ 'C'. Shading Language – язык разработанный и ориентированный исключительно для задач в области рендеринга.

Компиляция шейдеров


Компиляция файла с именем mushader.sl осуществляется командой

Переменные в Shading Language


Так же как и в 'C', Shading Language использует переменные для хранения данных. Каждый раз при вызове шейдера рендерером он получает данные из нескольких источников:


  • значения параметров по умолчанию, называемые instance variables, для шейдера (вы можете устанавливать эти значения в ваших шейдерах),
  • модифицированые значения instance variables (пользователи вашего шейдера могут переназначить значения по умолчанию), и,
  • от самого рендера.

Рендер, PhotoRMan (Macintosh) или prman (UNIX и Windows), публикует некоторые свои данные для использования шейдером через глобальные переменные. Шейдеры используют глобальные переменные для чтения данных, предоставляемых рендером (shader input), например, цвет поверхности. Шейдеры также используют некоторые глобальные переменные для записи данных в рендер (shader output), например, цвет поверхности, полученный в результате ее освещения.


Т.к. различные типы шейдеров имеют доступ к разным спискам глобальных переменных, нижеприведенная таблица показывает те из них, которые доступны для шейдеров поверхностей (Surface shaders).

Глобальная переменнаяЗначение
Ciявный цвет поверхности (output)
Oiявный коэффициент непрозрачности поверхности (output)
Csнастоящий цвет поверхности (input)
Osнастоящий коэффициент непрозрачности поверхности (input)
Nзашейденая нормаль к поверхности
s, tтекстурные координаты поверхности
Pточка поверхности
Ngгеометрическая нормаль к поверхности
u,vпараметры поверхности
du, dvизменения вдоль u, v по поверхности
dPdu,dPdvизменения вдоль u и v в точке поверхности
Lвектор направления от поверхности к источнику света
Clцвет источника света
Iвектор луча, указывающего на точку поверхности из камеры
Eпозиция камеры

Шейдеры также используют их собственные локальные переменные.


Типы данных в Shading language


На платформе Macintosh Shading Language использует четыре типа данных:


  • float, формат с плавающей точкой, такой же как в языке 'C',
  • string, строка, похожа на массив символов в языке 'C',
  • point, содержит координаты x, y и z для отображения позиции или направления в пространстве,
  • color, отображает цвет и интенсивность света, или отражаемую способность или прозрачность поверхности.

Обратите внимаение, что целочисленный (integer) тип данных в этом языке отсутствует, так что все значения должны быть объявлены как float. Также, локальные переменные не могут использовать тип данных string.


Версия Shading Language для UNIX платформы использует несколько дополнительных типов, на данный момент не поддерживающихся платформой Macintosh (Shader App? version 2.1).


Геометрия шейдинга



Компоненты освещения (сфера освещена далеким точечным источником света)



Алгоритм шейдинга поверхности


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


Назначение шейдера поверхности заключается в

  • вычислении явного цвета поверхности, т.е. цвета света покидающего поверхность в направлении камеры,
  • вычислении явной прозрачности поверхности.

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


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


  1. Сделать копию нормали к поверхности (N) и использовать угол зрения (I) для того чтобы быть уверенным что нормаль смотрит в направлении к камере .
  2. Установить явное значение непрозрачности поверхности (Oi).
  3. Найти цвета источников света, достигающих этой поверхности и установить 'реакцию' поверхности на эти цвета. Общий цвет будет найден с помощью трех отдельных операций для вычисления освещения:
    • добавить цвет всех источников, влияющих на отраженное (ambient) освещение,
    • добавить цвет всех источников, влияющих на рассеянное (diffuse) освещение поверхности,
    • добавить цвет всех источников, влияющих на зеркальные (specular, shiny) блики на поверхности.
    • Перед сложением, отраженные, рассеянные и зеркальные цвета должны быть скорректированы значениями по умолчанию, либо специфичными коэффициентами, установленными пользователем шейдера. Обычно эти параметры называются соответственно “Ka”, “Kd” и “Ks”.
  4. Установить явный цвет (Ci) поверхности как комбинацию цвета, найденного на шаге 3 и явной прозрачности, найденной на шаге 2.