Open Shading Language#

Только Cycles

Также возможно создавать собственные ноды с помощью Open Shading Language (OSL). Эти ноды будут работать только с CPU и бэкэндом рендеринга OptiX.

Для включения этой возможности отметьте галочку Open Shading Language в панели «Render».

Примечание

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

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

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

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

  • Функция «трассировки» не работает. В результате этого ноды Ambient Occlusion и Bevel не работают.

Нода «Скрипт» (script node)#

Нода ":abbr:`Скрипт (Script)`".

OSL был разработан для шейдинга, основанного на нодах, так что каждый шейдер OSL соответствует одной ноде в конструкции нод. Для добавления шейдера OSL, добавьте ноду Script и свяжите её с текстовым блоком данных или внешним файлом. Входные и выходные сокеты будут созданы из параметров шейдера после нажатия на кнопку обновления в ноде или текстовом редакторе.

Шейдеры OSL могут быть связаны с нодой несколькими различными способами. При использовании режима Internal для хранения шейдера OSL будет использоваться текстовый блок данных, а байт-код OSO будет сохранён в самой ноде. Это полезно для распространения blend-файла без зависимостей.

Режим External может использоваться для указания файла .osl на диске, который будет автоматически скомпилирован в файл .oso и помещён в тот же каталог. Так же можно определить путь непосредственно к файлу .oso, который, в таком случае, будет использоваться напрямую и должен будет компилироваться пользователем самостоятельно. Третий вариант – указать только имя модуля, которое можно будет найти в пути поиска шейдера.

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

Linux
$HOME/.config/blender/4.2/shaders/
Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\4.2\shaders\
macOS
/Users/$USER/Library/Application Support/Blender/4.2/shaders/

Совет

Для использования в реальной работе мы предлагаем использовать группу нод для обёртывания нод скрипта шейдера для лёгкого обращения к ним из других blend-файлов. Это упростит внесение изменений в ноду впоследствии по мере добавления или удаления сокетов, без необходимости обновления нод скрипта во всех файлах.

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

Более подробную информацию о написании шейдеров можно найти в «документации 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’s.

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()

Другие#

  • 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" ]]

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