Відкрита Мова Відтінювання – Open Shading Language¶
Cycles Only
Також можливо створювати власні вузли за допомогою Відкритої Мови Відтінювання – Open Shading Language (OSL). Зауважте, що такі вузли працюють для рендерингу тільки на центральному процесорі CPU; наразі відсутня жодна підтримка запуску коду OSL на відеокарті GPU.
Для вмикання цього увімкніть стяг Open Shading Language у властивостях рендера, що дасть її використання як системи відтінення.
Примітка
На Linux засоби компілятора C/C++ (зокрема, /usr/bin/cpp
) повинні бути інстальовані для компілювання скриптів OSL.
Вузол «Скрипт» – Script Node¶
OSL було розроблено для базованого на вузлах відтінювання й кожен шейдер OSL відповідає одному вузлу в укладі вузлів. Для додання шейдера OSL в уклад додайте вузол «Скрипт» – Script node та пов’яжіть його з блоком даних тексту або зовнішнім файлом. Увідні та вивідні роз’єми будуть створені на основі параметрів цього шейдера після клацання на кнопці оновлення у редакторі Вузлів або Тексту.
Шейдери OSL можуть бути підв’язані до цього вузла кількома різними способами. За допомогою внутрішнього режиму – Internal блок даних тексту використовується для збереження шейдера OSL та байт-код OSO зберігається на самому вузлі. Це корисно для розповсюдження blend-файлу з усім, що запаковано у ньому.
Зовнішній режим – External може використовуватися для визначення файлу .osl
з диска, вміст якого далі буде автоматично компільований у файл .oso
у тому ж каталогу. Також є можливим визначити шлях до файлу .oso
, який далі буде використовуватися безпосередньо, з компіляцією, зробленою вручну користувачем. Третій варіант – визначити тільки ім’я модуля, який буде шукатися по шляху пошуку шейдерів.
Шлях пошуку шейдерів розміщується у тому ж місці, де і шлях для скриптів або конфігурації:
- Linux
$HOME/.config/blender/2.81/shaders/
- Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.81\shaders\
- macOS
/Users/$USER/Library/Application Support/Blender/2.81/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.
Ця функція не може використовуватися замість освітлювання; головне її призначення дозволити шейдерам «пробувати» найближчу геометрію, наприклад, для застосування проектованої текстури, що може бути блокована геометрією, застосувати більше «зношення» до виставленої геометрії або зробити інші ефекти подібні на загороду оточення.