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/3.6/shaders/
- Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\3.6\shaders\
- macOS
/Users/$USER/Library/Application Support/Blender/3.6/shaders/
Совет
Для использования в производстве мы предлагаем использовать группу нод для обёртывания нод скрипта шейдера для лёгкого обращения к ним из других blend-файлов при установлении ссылок. Это упростит внесение изменений в ноду впоследствии по мере добавления или удаления сокетов, без необходимости обновления нод скрипта во всех файлах.
Написание шейдеров
For more details on how to write shaders, see the OSL specification. Here is a simple example:
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 соответствуют нодам шейдера и их сокетам; более подробную информацию об их функциях и значении параметров см. в разделе руководства по нодам шейдера.
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_cubic(N, radius, texture_blur, sharpness)bssrdf_gaussian(N, radius, texture_blur)
Объём (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" ]]Показывать числовой параметр в виде логического флажка.