LightShaders

Глобальная переменнаяТипСодержит в себе
Cl, OlcolorЦвет и прозрачность света (только внутри цикла illuminate() или solar() ) W
LvectorНаправление от источника света (только внутри цикла illuminate() или solar() ) R
PspointПозиция точки шейдинга R
PpointПозиция источника света P

Задача шейдера света – возвращать цвет и прозрачность луча, исходящего от источника.
Есть некоторые особенности переменных, используемых в шейдере света:


  • P содержит позицию источника света, а не позицию точки шейдинга.
  • для шейдера света L направлено от источника к поверхности, это противоположно определению переменной L, которое используется в шейдере поверхности.

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


Вот простейший шейдер света:



Этот шейдер просто возвращает цвет света без конкретного направления. Чтобы задать исходящему лучу
направление, вам нужно использовать конструкции illuminate или solar:



illuminate(position[,axis,spread])


solar([axis,spread])


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



Если указаны ось и пространство, свет будет светить только в конусе, направленном по заданной
оси и раскрытому на угол размером spread радиан.



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



Если вы замените в этом шейдере “shader” на “object”, то dir будет привязан к пространству
освещаемого объекта — и вращение объекта будет вызывать поворот направления света.
При освещении этим источником большого количества случайно повернутых объектов, каждый из них будет казаться
освещенным разным источником света.


Чтобы развить эту идею, вы можете заставить dir скручиваться и поворачиваться в пространстве:



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


Тени


Использование карты глубины (depth map) для создания теней. Описание процесса:


  • Камера помещается на место источника создающего тень и направлена так же как источник света. Используйте камеру с ортогональной проекцией

для направленного источника света (directional) или перспективную проекцию, если источник точечный. Проверьте, чтобы все объекты, отбрасывающие тень, были в поле зрения. Выключите антиэлиасинг и jittering.

  • Просчитайте изображение из камеры в файл формата “zfile”.
  • Используйте команду “txmake -shadow”, чтобы сконвертировать zfile в файл текстуры PRman.
  • В вашем источнике света используйте функцию тени, чтобы прочитать текстуру тени и смодулировать интенсивность света.

Вот еще один шейдер света, но теперь с возможностями затенения:



Проецирование текстуры