Open Shading Language
Только Cycles
It is also possible to create your own nodes using Open Shading Language (OSL). Note that these nodes will only work for CPU rendering; there is no support for running OSL code on the GPU.
Для включения этой возможности отметьте галочку Open Shading Language в панели «Render».
Нода «Скрипт» (script node)
OSL был разработан для шейдинга, основанного на нодах, так что каждый шейдер OSL соответствует одной ноде в конструкции нод. Для добавления шейдера OSL, добавьте ноду Script и свяжите её с текстовым блоком данных или внешним файлом. Входные и выходные сокеты будут созданы из параметров шейдера после нажатия на кнопку обновления в ноде или текстовом редакторе.
Шейдеры OSL могут быть связаны с нодой несколькими различными способами. При использовании режима Internal для хранения шейдера OSL будет использоваться текстовый блок данных, а байт-код OSO будет сохранён в самой ноде. Это полезно для распространения blend-файла без зависимостей.
Режим External может использоваться для указания файла .osl
на диске, который будет автоматически скомпилирован в файл .oso
и помещён в тот же каталог. Так же можно определить путь непосредственно к файлу .oso
, который, в таком случае, будет использоваться напрямую и должен будет компилироваться пользователем самостоятельно. Третий вариант – указать только имя модуля, которое можно будет найти в пути поиска шейдера.
Путь поиска шейдеров находится там же, где и скрипты или путь конфигурации, а именно:
- Linux
$HOME/.config/blender/3.3/shaders/
- Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\3.3\shaders\
- macOS
/Users/$USER/Library/Application Support/Blender/3.3/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()
Другие
emission()
ambient_occlusion()
holdout()
background()
Атрибуты (attributes)
Some object, particle and mesh attributes are available to the built-in getattribute()
function.
UV maps and Color Attributes can be retrieved using their name.
Other attributes are listed below:
geom:generated
Generated texture coordinates.
geom:uv
UV-развёртка рендеринга «по умолчанию».
geom:dupli_generated
Для экземпляров – сгенерированные координаты из дублирующего объекта.
geom:dupli_uv
Для экземпляров – UV-координаты из дублирующего объекта.
geom:trianglevertices
Три координаты вершин треугольника.
geom:numpolyvertices
Количество вершим в многоугольнике (на текущий момент всегда возвращает три вершины).
geom:polyvertices
Массив с координатами вершин многоугольника (на текущий момент в массиве всегда три вершины).
geom:name
Имя объекта.
geom:is_curve
Is object a strand or not.
geom:curve_intercept
Point along the strand, from root to tip.
geom:curve_thickness
Thickness of the strand.
geom:curve_tangent_normal
Касательная нормали пряди.
path:ray_length
Расстояние, пройденное лучом с момента последнего попадания в препятствие.
object:location
Местоположение объекта.
object:index
Object index number.
object:random
Per object random number generated from object index and name.
material:index
Material index number.
particle:index
Particle instance number.
particle:age
Возраст частицы в кадрах.
particle:lifetime
Общее время жизни частицы в кадрах.
particle:location
Местоположение частицы.
particle:size
Размер частицы.
particle:velocity
Скорость частицы.
particle:angular_velocity
Угловая скорость частицы.
Трассировка
Мы поддерживаем функцию trace(point pos, vector dir, ...)
для трассировки лучей из шейдеров OSL. Параметр «shade» на текущий момент не поддерживается, но атрибуты объекта, с которым произошло столкновение луча, могут быть получены через функцию getmessage("trace", ..)
. Подробности по использованию этого механизма смотрите в спецификации OSL.
Эта функция не может использоваться вместо освещения; основная её цель – позволить шейдерам «щупать» ближайшую геометрию, например, чтобы применить проецируемую текстуру, которая может быть заблокирована геометрией, сделать открытую геометрию более «изношенной» или применить ещё какие-нибудь эффекты, подобные Ambient Occlusion.