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)#
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" ]]
Показывать числовой параметр в виде логического флажка.