Open Shading Language¶
Open Shading Language (OSL) – это программируемая система шейдинга, разработанная для продвинутых движков рендеринга. Она позволяет техническим художникам и разработчикам писать собственный код шейдера с использованием языка сценариев, похожего на „C“.
В Blender’е OSL может использоваться в Cycles для определения пользовательских шейдеров для поверхности, объёма и смещения. Это даёт пользователям полный контроль над поведением затенения, позволяя использовать процедурные эффекты, расширенные модели освещения и пользовательскую материальную логику на основе геометрии, что может быть невозможно с использованием только встроенных шейдерных нод.
В отличие от материалов на основе нод, шейдеры OSL создаются в виде текстовых скриптов с использованием внутреннего текстового редактора Blender’а или загружаются из внешних файлов .osl или .oso. Затем эти скрипты компилируются и используются в редакторе шейдеров через ноду Script.
Совет
OSL особенно полезен для создания процедурных текстур, пользовательских BRDF или реализации исследовательских прототипов. Он также позволяет совместно использовать шейдеры в совместимых приложениях рендеринга, которые поддерживают стандарт OSL.
Использование¶
Чтобы использовать Open Shading Language (OSL) в Blender’е, выполните следующие действия:
Включите OSL рендеринг
В включите Open Shading Language.
Добавьте ноду Script
В редакторе шейдеров добавьте ноду Script, затем в свойствах ноды:
Установите режим на „Internal“, чтобы использовать текстовый блок данных Blender’а, или
Установите на „External“, чтобы загрузить файл шейдера с диска (.osl или скомпилированный .oso).
Для „встроенного“ режима, – создайте новый текстовый блок данных в текстовом редакторе, затем напишите или вставьте туда свой код OSL.
Blender автоматически скомпилирует исходный файл OSL. Если исходным файлом является файл .osl, он будет скомпилирован в байт-код .oso. Ошибки компиляции будут отображаться в системной консоли.
Используйте выходы шейдера
После компиляции выходные данные узла будут отражать параметры
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: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)¶
Metadata on parameters controls how they are displayed in the user interface. The following metadata entries are supported:
[[ string label = "My Label" ]]Custom display name of the parameter in the user interface.
[[ string widget = "null" ]]Hides the parameter from the user interface.
[[ string widget = "boolean" ]]or[[ string widget = "checkbox" ]]Displays an integer parameter as a boolean checkbox.
[[ string widget = "filename" ]]Displays the parameter as a file path selector.
[[ string widget = "mapper", string options = "left:0|right:1" ]]Displays an integer parameter as an enumerated menu. The options string defines a list of label-value pairs separated by
|.[[ string vecsemantics = "POINT" ]]Marks a vector parameter as a translation input (position vector).
[[ string vecsemantics = "NORMAL" ]]Marks a vector parameter as a normal input (direction vector).
[[ string unit = "radians" ]]Marks a float parameter as an angle input, displayed in radians.
[[ string unit = "m" ]]Marks a float parameter as a distance input, displayed in meters.
[[ string unit = "mm" ]]Marks a float parameter as a distance input, displayed in millimeters.
[[ string unit = "s" ]]or[[ string unit = "sec" ]]Marks a float parameter as a time input, displayed in seconds.
Ограничения¶
Важно
OSL не поддерживается при рендеринге на GPU, если не используется бэкэнд OptiX.
Некоторые функции OSL недоступны при использовании бэкэнда OptiX. Примеры включают:
- Снижение использования памяти, обеспечиваемое такими функциями, как загрузка текстур по запросу и
mip-текстурирование, – недоступно.
- Для поиска текстур, – OSL необходимо иметь возможность определять постоянный путь к файлу изображения для каждого
вызова текстуры.
Некоторые функции шума недоступны. Например, Cell, Simplex и Gabor.
Функция трассировки не работает. В результате этого не работают ноды Ambient Occlusion и Bevel.