ExperimentingWithSurfaceShading

Экспериментируем с surface шейдерами


Назначение шейдера поверхности – задание цвета и прозрачности поверхности объекта (точнее, света, отраженного из точки поверхности объекта).
В этом разделе мы рассмотрим использование некоторых всроенных функций SL. В частности, узнаем как:


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

ПРОСТОЙ ШЕЙДЕР


Для экспериментирования с шейдингом поверхностей мы будем использовать код, представленный ниже.
За исключением нескольких переменных этот шейдер аналогичен стандартному 'пластику' поставляемому Pixar с Mac Render Man?.





ПРОСТОЙ RIB ФАЙЛ ДЛЯ ТЕСТИРОВАНИЯ ШЕЙДЕРА


Мы используем этот RIB файл для тестирования шейдера.





НАЗНАЧЕНИЕ ЦВЕТА


Цвет может быть назначен как одно значение или три разных.


В первом примере, значение 0.8 назначается всем трем компонентам цвета. Во втором, используется функция color() для задания каждой компоненты цвета отдельно. Цветовым пространством по умолчанию для шейдеров поверхности является пространство RGB. Цвет также может быть изменен путем присваивания значения каждой компоненте отдельно.


В этом примере используется функция setcomp() для изменения значения красного цвета c 0.3 на 0.8

ИСПОЛЬЗОВАНИЕ ТЕКСТУРНЫХ КООРДИНАТ ДЛЯ ЗАДАНИЯ ЦВЕТА ПОВЕРХНОСТИ


Как каждый объект (в данном случае в сцене) имеет координаты x,y,z, так каждая точка на поверхности объекта имеет s,t координаты. Когда объект текстурируется с использованием s,t координат, каждая 3D точка, которая шейдится, используется для нахождения соответствующей ей области текстуры. Цвет этой области используется как цвет поверхности на 3D объекте. На изображении ниже показано соответствие между принятыми по умолчанию текстурными координатами цилиндра и изображением, использованным для текстурирования.


Когда вызывается шейдер поверхности (surface shader) глобальные переменные s и t запоминают текструрные координаты точки, которая визуализируется. После этого их можно использовать для любых целей. Пример ниже показывает как можно использовать st координаты для создания причудливого узора на поверхности.


Переправьте Surface выражение в тестовом RIB файле на Surface “bizarre”


ИСПОЛЬЗОВАНИЕ ТЕКСТУР ДЛЯ ИЗМЕНЕНИЯ ЦВЕТА И ПРОЗРАЧНОСТИ


SL(shading language) функция texture() используется для извлечения данных из файлов текстур. Она может возвращать цвет или число, характеризующие среднее значение красной, зеленой и синей компонент пиксела(ов) соответствующих s и t координатам точки, которая шейдится. В следующем примере texture() используется для превращения обычного шейдера в шейдер-текстуровщик.


Переправьте Surface выражение в тестовом RIB файле на:
Surface “texturemapper” “texname” ["swazi_princess.tx”]
+раскомментируйте строку Make Texture? в начале RIB файла. И конечно подготовьте свою собственную картинку для текстурирования.


В следующем примере функция texture() возвращает одно число, которое используется для изменения прозрачности шейдящейся точки. И опять надо исправить в тестовом RIB файле строку с определением шейдера поверхности на:
Surface “opacitymapper” “traname” ["swazi_princess.tx”].


Обратите внимание на то, что мы вынуждаем texture() вернуть нам число – среднее значение красной, зеленой и синей компонент цвета gо координатам s и t файла текстуры. Это 'среднее' (монохромное) значение задает прозрачность поверхности.

ИСПОЛЬЗОВАНИЕ ФУНКЦИИ NOISE()


Функция noise() похожа на rand() из языка 'C', но может принимать один или два параметра разных типов – первый параметр должен быть числом. Например,


noiseValue = noise (1.2); /* один числовой (float) параметр*/
noiseValue = noise §; /* один параметр точка (point) */


Функция noise() может возвращать как число(float), так и трехкомпонентное значение, такое как точка(point) или цвет(color)
Например,
noisyColor = color noise §;
noisyPoint = point noise (s, t);


В следующем примере noise() задает компоненты цвета, который используется вместо цвета поверхности 'Cs'.



ТЕКСТУРНЫЕ КООРДИНАТЫ И СПЕЦЭФФЕКТЫ I


Глобальные переменные “s” и “t” хранят текстурные координаты точки поверхности, которая рендерится. Первый шейдер, stripes.sl, иллюстрирует использование функции mod для создания повторяющихся прозрачных полос. Функция mod возвращает дробную часть («s * frequency”/1.0).


Например,
предположим что шейдящаяся точка имеет “s” координату равную 0.8, а “frequency”(частота) установлена в 4, тогда 0.8 x 4 = 3.2. Деля это число на 1.0 функция mod вернет 0.2, т.е. дробную часть числа 3.2. Общая идея состоит в разделении текстурноог пространства на 4 равных подпространства («sLocation”), которые имеют значения в диапазоне от 0.0 до 0.9999. Проверяя, находится ли шейдящаяся точка внутри половины подпространства (0.5) устанавливается прозрачность поверхности.



К сожалению этот шейдер болен ступенчатостью. Попробуйте например установить в тестовом RIB файле:

Surface “stripes” “frequency” 50





ТЕКСТУРНЫЕ КООРДИНАТЫ И СПЕЦЭФФЕКТЫ II


В следующем примере и “s” и “t” переводятся в подпространства, т.е. делятся на полосы, и на основе проверок значение “Oi” устанавливается в «прозрачный» или настоящая непрозрачность (Os). В результате вырезаем треугольные дырки в поверхности.





ТЕКСТУРНЫЕ КООРДИНАТЫ И СПЕЦЭФФЕКТЫ III


В этом примере проверяется расстояние от шейдящейся точки до центра подпространства. Цель – получить круглые дырки в поверхности.





ОБЗОР

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

использовать некоторые встроенные функции, в частности как


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

English:

A BASIC SHADER


The experiments on surface shading in this section are based the 
following source code. Apart from using several intermediate variables
this shader is identical to the standard 'plastic' shader supplied by 
Pixar with Mac Render Man?.


In the following examples new or modified code will
be shown in purple.

A BASIC RIB FILE FOR TESTING A SHADER


The following RIB file will be used to test a shader.


ASSIGNING COLORS


Colors may be assigned as a single value or three individual values,


In the first example, 0.8 is assigned to all the components of the color.
In the second example, the function color() is used to set individual
values for each of the red, green and blue components. The rgb color
space is the default for surface shaders. Colors may also be modified by 
assigning a value to an individual component of a color,


In this example, the function setcomp() has been used to change the red
component from 0.3 to 0.9. The color components are, 0 red,1 green,
2 blue.