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

Cycles Only

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

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

Примітка

On Linux, C/C++ compiler tools (in particular /usr/bin/cpp) must be installed to compile OSL scripts.

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

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

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

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

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

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

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

Linux
$HOME/.config/blender/2.80/shaders/
Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.80\shaders\
macOS
/Users/$USER/Library/Application Support/Blender/2.80/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 is different from, for example, RSL or GLSL, in that it does not have a light loop. There is no access to lights in the scene, and the material must be built from closures that are implemented in the renderer itself. This is more limited, but also makes it possible for the renderer to do optimizations and ensure all shaders can be importance sampled.

The available closures in Cycles correspond to the shader nodes and their sockets; for more details on what they do and the meaning of the parameters, see the 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()

Інше

  • 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.

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