Відкрита Мова Відтінення – 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¶
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.
Ця функція не може використовуватися замість освітлення; головне її призначення дозволити відтінювачу «пробувати» найближчу геометрію, наприклад, для застосування проектованої текстури, що може бути блокована геометрією, застосувати більше «зношення» до проявленої геометрії або зробити інші ефекти подібні на загороду оточення.