Open Shading Language

Open Shading Language (OSL) – это программируемая система шейдинга, разработанная для продвинутых движков рендеринга. Она позволяет техническим художникам и разработчикам писать собственный код шейдера с использованием языка сценариев, похожего на „C“.

В Blender’е OSL может использоваться в Cycles для определения пользовательских шейдеров для поверхности, объёма и смещения. Это даёт пользователям полный контроль над поведением затенения, позволяя использовать процедурные эффекты, расширенные модели освещения и пользовательскую материальную логику на основе геометрии, что может быть невозможно с использованием только встроенных шейдерных нод.

В отличие от материалов на основе нод, шейдеры OSL создаются как текстовые скрипты с использованием внутреннего текстового редактора Blender’а или загружаются из внешних файлов .osl или .oso. Затем эти скрипты компилируются и используются в редакторе шейдеров через ноду Script.

Совет

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

Использование

Чтобы использовать Open Shading Language (OSL) в Blender’е, выполните следующие действия:

  1. Включите OSL рендеринг

    В свойствах рендеринга включите „Open Shading Language“.

  2. Добавьте ноду Script

    В редакторе шейдеров добавьте ноду Script, затем в свойствах узла:

    • Установите режим на „Internal“, чтобы использовать текстовый блок данных Blender’а, или

    • Установите на „External“, чтобы загрузить файл шейдера с диска (.osl или скомпилированный .oso).

    Для „встроенного“ режима, – создайте новый текстовый блок данных в текстовом редакторе, затем напишите или вставьте туда свой код OSL.

    Blender автоматически скомпилирует исходный файл OSL. Если исходным файлом является файл .osl, он будет скомпилирован в байт-код .oso. Ошибки компиляции будут отображаться в системной консоли.

  3. Используйте выходы шейдера

    После компиляции выходные данные узла будут отражать параметры output, определённые в коде OSL. Эти выходные данные могут быть подключены к любой части нодового дерева материала.

Написание шейдеров

Более подробную информацию о написании шейдеров можно найти в «документации OSL».

Вот простой пример:

shader simple_material(
    color Diffuse_Color = color(0.6, 0.8, 0.6),
    float Noise_Factor = 0.5,
    output closure color BSDF = diffuse(N))
{
    color material_color = Diffuse_Color * mix(1.0, noise(P * 10.0), Noise_Factor);
    BSDF = material_color * diffuse(N);
}

Замыкания

OSL отличается, например, от RSL или GLSL тем, что не имеет светового цикла. У вас нет доступа к источникам света в сцене, а материалы должны быть построены из замыканий, которые реализованы в самом движке рендеринга. Этот подход более ограничен, однако при этом он позволяет рендереру проводить некоторые оптимизации и гарантировать, что все шейдеры могут быть сэмплированы по важности.

Доступные замыкания в Cycles соответствуют нодам шейдера и их сокетам; более подробную информацию об их функциях и значении параметров см. в разделе руководства по нодам шейдера.

См. также

Документацию по встроенным замыканиям OSL.

BSDF

  • diffuse(N)

  • oren_nayar(N, roughness)

  • diffuse_ramp(N, colors[8])

  • phong_ramp(N, exponent, colors[8])

  • diffuse_toon(N, size, smooth)

  • glossy_toon(N, size, smooth)

  • translucent(N)

  • reflection(N)

  • refraction(N, ior)

  • transparent()

  • microfacet_ggx(N, roughness)

  • microfacet_ggx_aniso(N, T, ax, ay)

  • microfacet_ggx_refraction(N, roughness, ior)

  • microfacet_beckmann(N, roughness)

  • microfacet_beckmann_aniso(N, T, ax, ay)

  • microfacet_beckmann_refraction(N, roughness, ior)

  • ashikhmin_shirley(N, T, ax, ay)

  • ashikhmin_velvet(N, roughness)

Волосы (hair)

  • hair_reflection(N, roughnessu, roughnessv, T, offset)

  • hair_transmission(N, roughnessu, roughnessv, T, offset)

  • principled_hair(N, absorption, roughness, radial_roughness, coat, offset, IOR)

BSSRDF

Используется для моделирования подповерхностного рассеивания.

bssrdf(method, N, radius, albedo)
Параметры:
  • method (string) – Метод рендеринга для имитации подповерхностного рассеивания. - burley: Приближение к физически обоснованному объёмному рассеиванию. Этот метод менее точен, чем random_walk, однако в некоторых ситуациях этот метод позволяет устранять шум быстрее. - random_walk_skin: Обеспечивает точные результаты для тонких и изогнутых объектов. Random Walk использует истинное объёмное рассеивание внутри меша, что означает, что он лучше всего подходит для закрытых мешей. Перекрывающиеся грани и отверстия в меше могут вызвать проблемы. - random_walk: Ведёт себя аналогично random_walk_skin, но модулирует Radius на основе Color, Anisotropy и IOR. Таким образом, этот метод пытается сохранить бо́льшую детализацию поверхности и цвета, чем random_walk_skin.

  • N (vector) – Вектор нормали затеняемой точки поверхности.

  • radius (vector) – Среднее расстояние, на которое рассеивается свет под поверхностью. Более высокий радиус даёт более мягкий вид, поскольку свет просачивается в тени и сквозь объект. Расстояние рассеивания указывается отдельно для каждого из каналов RGB, чтобы визуализировать такие материалы, как кожа, где красный свет рассеивается глубже. Значения X, Y и Z сопоставляются со значениями R, G и B соответственно.

  • albedo (color) – Цвет поверхности, или, говоря языком физики, вероятность (для каждой длины волны) того, что свет отразится от поверхности.

Объём (volume)

  • henyey_greenstein(g)

  • absorption()

Другое (other)

  • emission()

  • ambient_occlusion()

  • holdout()

  • background()

Атрибуты (attributes)

Атрибуты геометрии можно считывать через функцию getattribute(). Сюда входят UV-карты, атрибуты цвета и любые атрибуты, выводимые из нод геометрии.

Следующие встроенные атрибуты также доступны через getattribute().

geom:generated

Автоматически сгенерированные координаты текстуры из недеформированного меша.

geom:uv

UV-развёртка рендеринга «по умолчанию».

geom:tangent

Касательный вектор «по умолчанию» вдоль поверхности в пространстве объектов.

geom:undisplaced

Положение до смещения в пространстве объектов.

geom:dupli_generated

Для экземпляров – сгенерированные координаты из дублирующего объекта.

geom:dupli_uv

Для экземпляров – UV-координаты из дублирующего объекта.

geom:trianglevertices

Три координаты вершин треугольника.

geom:numpolyvertices

Количество вершим в многоугольнике (на текущий момент всегда возвращает три вершины).

geom:polyvertices

Массив с координатами вершин многоугольника (на текущий момент в массиве всегда три вершины).

geom:name

Имя объекта.

geom:is_smooth

Является ли поверхность меша с гладким или плоским шейдингом.

geom:is_curve

Является ли объект «кривой» или нет.

geom:curve_intercept

Координата 0..1 для точки вдоль кривой, от корня до кончика.

geom:curve_thickness

Толщина кривой в пространстве объектов.

geom:curve_length

Длина кривой в пространстве объектов.

geom:curve_tangent_normal

Касательная нормали пряди.

geom:is_point

Находится ли точка в облаке точек или нет.

geom:point_radius

Радиус точки в облаке точек.

geom:point_position

Центральное положение точки в облаке точек.

geom:point_random

Случайное число, разное для каждой точки в облаке точек.

path:ray_length

Расстояние, пройденное лучом с момента последнего попадания в препятствие.

object:random

Случайное число, разное для экземпляров объекта.

object:index

Уникальный индекс экземпляра объекта.

object:location

Местоположение объекта.

material:index

Уникальный индекс материала.

particle:index

Уникальный номер экземпляра частицы.

particle:age

Возраст частицы в кадрах.

particle:lifetime

Общее время жизни частицы в кадрах.

particle:location

Местоположение частицы.

particle:size

Размер частицы.

particle:velocity

Скорость частицы.

particle:angular_velocity

Угловая скорость частицы.

Трассировка

Только CPU

Мы поддерживаем функцию trace(point pos, vector dir, ...) для трассировки лучей из шейдеров OSL. Параметр «shade» на текущий момент не поддерживается, но атрибуты объекта, с которым произошло столкновение луча, могут быть получены через функцию getmessage("trace", ..). Подробности по использованию этого механизма смотрите в спецификации OSL.

Эта функция не может использоваться вместо освещения; основная её цель – позволить шейдерам «щупать» ближайшую геометрию, например, чтобы применить проецируемую текстуру, которая может быть заблокирована геометрией, сделать открытую геометрию более «изношенной» или применить ещё какие-нибудь эффекты, подобные Ambient Occlusion.

Метаданные (metadata)

Метаданные параметров управляют их отображением в пользовательском интерфейсе. Поддерживаются следующие метаданные:

[[ string label = "My Label" ]]

Имя параметра в пользовательском интерфейсе

[[ string widget = "null" ]]

Скрыть параметр в пользовательском интерфейсе.

[[ string widget = "boolean" ]] и [[ string widget = "checkbox" ]]

Показывать числовой параметр в виде логического флажка.

Ограничения

Важно

OSL не поддерживается при рендеринге на GPU, если не используется бэкэнд OptiX.

Некоторые функции OSL недоступны при использовании бэкэнда OptiX. Примеры включают:

  • Снижение использования памяти, обеспечиваемое такими функциями, как загрузка текстур по запросу и

    mip-текстурирование, – недоступно.

  • Для поиска текстур, – OSL необходимо иметь возможность определять постоянный путь к файлу изображения для каждого

    вызова текстуры.

  • Некоторые функции шума недоступны. Например, Cell, Simplex и Gabor.

  • Функция трассировки не работает.

    В результате этого не работают ноды Ambient Occlusion и Bevel.