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.
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:uvUV-развёртка рендеринга «по умолчанию».
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" ]]Показывать числовой параметр в виде логического флажка.