Відкрита Мова Відтінювання – Open Shading Language

Cycles Only

Також можливо створювати власні вузли за допомогою Відкритої Мови Відтінювання – Open Shading Language (OSL). Зауважте, що такі вузли працюють для рендерингу тільки на центральному процесорі CPU; наразі відсутня жодна підтримка запуску коду OSL на відеокарті GPU.

Для вмикання цього увімкніть стяг Open Shading Language у властивостях рендера, що дасть її використання як системи відтінення.

Примітка

На Linux засоби компілятора C/C++ (зокрема, /usr/bin/cpp) повинні бути інстальовані для компілювання скриптів OSL.

Вузол «Скрипт» – Script Node

../../_images/render_shader-nodes_osl_script-node.png

Вузол «Скрипт» – Script.

OSL було розроблено для базованого на вузлах відтінювання й кожен шейдер OSL відповідає одному вузлу в укладі вузлів. Для додання шейдера OSL в уклад додайте вузол «Скрипт» – Script node та пов’яжіть його з блоком даних тексту або зовнішнім файлом. Увідні та вивідні роз’єми будуть створені на основі параметрів цього шейдера після клацання на кнопці оновлення у редакторі Вузлів або Тексту.

Шейдери OSL можуть бути підв’язані до цього вузла кількома різними способами. За допомогою внутрішнього режиму – Internal блок даних тексту використовується для збереження шейдера OSL та байт-код OSO зберігається на самому вузлі. Це корисно для розповсюдження blend-файлу з усім, що запаковано у ньому.

Зовнішній режим – External може використовуватися для визначення файлу .osl з диска, вміст якого далі буде автоматично компільований у файл .oso у тому ж каталогу. Також є можливим визначити шлях до файлу .oso, який далі буде використовуватися безпосередньо, з компіляцією, зробленою вручну користувачем. Третій варіант – визначити тільки ім’я модуля, який буде шукатися по шляху пошуку шейдерів.

Шлях пошуку шейдерів розміщується у тому ж місці, де і шлях для скриптів або конфігурації:

Linux
$HOME/.config/blender/2.82/shaders/
Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.82\shaders\
macOS
/Users/$USER/Library/Application Support/Blender/2.82/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.

Ця функція не може використовуватися замість освітлювання; головне її призначення дозволити шейдерам «пробувати» найближчу геометрію, наприклад, для застосування проектованої текстури, що може бути блокована геометрією, застосувати більше «зношення» до виставленої геометрії або зробити інші ефекти подібні на загороду оточення.