Відкрита Мова Відтінювання – Open Shading Language¶
Cycles Only
Також можливо створювати власні вузли за допомогою Відкритої Мови Відтінювання – Open Shading Language (OSL). Зауважте, що такі вузли працюють для рендерингу тільки на центральному процесорі CPU; наразі відсутня жодна підтримка запуску коду OSL на відеокарті GPU.
Для вмикання цього увімкніть стяг Open Shading Language у властивостях рендера, що дасть її використання як системи відтінення.
Вузол «Скрипт» – Script Node¶
OSL було розроблено для базованого на вузлах відтінювання й кожен шейдер OSL відповідає одному вузлу в укладі вузлів. Для додання шейдера OSL в уклад додайте вузол «Скрипт» – Script node та пов’яжіть його з блоком даних тексту або зовнішнім файлом. Увідні та вивідні роз’єми будуть створені на основі параметрів цього шейдера після клацання на кнопці оновлення у редакторі Вузлів або Тексту.
Шейдери OSL можуть бути підв’язані до цього вузла кількома різними способами. За допомогою внутрішнього режиму – Internal блок даних тексту використовується для збереження шейдера OSL та байт-код OSO зберігається на самому вузлі. Це корисно для розповсюдження blend-файлу з усім, що запаковано у ньому.
Зовнішній режим – External може використовуватися для визначення файлу .osl
з диска, вміст якого далі буде автоматично компільований у файл .oso
у тому ж каталогу. Також є можливим визначити шлях до файлу .oso
, який далі буде використовуватися безпосередньо, з компіляцією, зробленою вручну користувачем. Третій варіант – визначити тільки ім’я модуля, який буде шукатися по шляху пошуку шейдерів.
Шлях пошуку шейдерів розміщується у тому ж місці, де і шлях для скриптів або конфігурації:
- Linux
$HOME/.config/blender/2.83/shaders/
- Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.83\shaders\
- macOS
/Users/$USER/Library/Application Support/Blender/2.83/shaders/
Порада
Для використання у виробництві ми рекомендуємо використовувати групу вузлів для вміщення у ньому вузлів скриптових шейдерів та підв’язувати його в інші blend-файли. Це полегшує внесення змін у вузол після того, як додаються або вилучаються роз’єми, без потреби оновлювати вузли скриптів у всіх файлах.
Написання Шейдерів – Writing Shaders¶
Детальніше про те, як писати шейдери, дивіться – OSL specification. Ось простий приклад:
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);
}
Замикання – Closures¶
OSL відрізняється, наприклад, від RSL або GLSL у тому, що вона не має петлі освітлення. Там немає жодного доступу до освітлювачів у сцені та матеріал повинен будуватися із замикань, що імплементовані у самому рендерері. Це є більш обмеженим, але також робить можливим для рендерера здійснення оптимізацій та гарантує, що усі шейдери можуть бути відібрані за важливістю.
Доступні замикання – closures у Cycles відповідають вузлам шейдерів та їх роз’ємам; детальніше про те, що вони роблять та значення цих параметрів, дивіться shader nodes manual.
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 та кольори вершин можуть бути отримані за допомогою їх імен. Інші атрибути перелічені нижче:
geom:generated
Генеровані координати текстур.
geom:uv
Стандартна розкладка UV для рендера.
geom:dupli_generated
Для примірників, генерована координата з об’єкта дублікатора.
geom:dupli_uv
Для примірників, координата UV з об’єкта дублікатора.
geom:trianglevertices
3 координати вершин трикутника.
geom:numpolyvertices
Кількість вершин полігона (завжди повертає три поточні).
geom:polyvertices
Масив координат вершин полігона (завжди поточно три вершини).
geom:name
Ім’я об’єкта.
geom:is_curve
Чи є об’єкт пасмом або ні.
geom:curve_intercept
Вказування уздовж пасма від кореня до верхівки.
geom:curve_thickness
Товщина пасма.
geom:curve_tangent_normal
Нормаль Тангенса пасма.
path:ray_length
Відстань променя з моменту останнього потрапляння.
object:location
Локація об’єкта.
object:index
Номер індексу об’єкта.
object:random
Випадкове число для об’єкта, генероване з індексу та імені об’єкта.
material:index
Номер індексу матеріалу.
particle:index
Номер примірника частинки.
particle:age
Вік частинки у кадрах.
particle:lifetime
Загальна тривалість життя частинки у кадрах.
particle:location
Локація частинки.
particle:size
Розмір частинки.
particle:velocity
Скорість частинки.
particle:angular_velocity
Кутова скорість частинки.
Простеження – Trace¶
Ми підтримуємо функцію trace(point pos, vector dir, ...)
для простеження променів з шейдера OSL. Параметр «shade» поточно не підтримується, але атрибути можуть бути отримані з об’єкта, на який відбулося потрапляння, за допомогою функції getmessage("trace", ..)
. Дивіться детальніше про те, як це використовувати, специфікацію OSL.
Ця функція не може використовуватися замість освітлювання; головне її призначення дозволити шейдерам «пробувати» найближчу геометрію, наприклад, для застосування проектованої текстури, що може бути блокована геометрією, застосувати більше «зношення» до виставленої геометрії або зробити інші ефекти подібні на загороду оточення.