Jazyk otvoreného tieňovania

Len Cykly

Je tiež možné vytvárať vlastné uzly použitím jazyka Open Shading Language (OSL - Jazyk otvoreného tieňovania). Upozorňujeme, že tieto uzly budú fungovať len pri prekresľovaní na CPU; neexistuje podpora pre spustenie kódu OSL na GPU.

Pre povolenie, v nastaveniach Prekreslenie vyberte ako systém tieňovania Open Shading Language.

Uzol Skript

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

Uzol Skript.

OSL bol navrhnutý pre tieňovanie na základe uzlov a každý OSL tieňovač zodpovedá jednému uzlu v nastavení uzlov. Ak chcete pridať OSL tieňovač, pridajte uzol skriptu a prepojte ho s textovým blokom údajov alebo externým súborom. Vstupné a výstupné zásuvky sa vytvoria z parametrov tieňovača po kliknutí na tlačidlo aktualizácie v uzle alebo v textovom editore.

Tieňovače OSL je možné prepojiť s uzlom niekoľkými rôznymi spôsobmi. V režime Interný sa na uloženie tieňovača OSL používa textový blok údajov a bytový kód OSO je uložený v samotnom uzle. To je užitočné na distribúciu blend-súboru so všetkým, čo je v ňom zabalené.

Režim Externý možno použiť na zadanie súboru .osl z disku, ktorý sa potom automaticky skompiluje do súboru .oso v tom istom priečinku. Je tiež možné zadať cestu k súboru .oso, ktorý sa potom použije priamo, pričom kompiláciu vykoná užívateľ ručne. Treťou možnosťou je zadať len názov modulu, ktorý sa vyhľadá v ceste vyhľadávania tieňovačov.

Cesta vyhľadávania tieňovačov sa nachádza na rovnakom mieste ako cesta skriptov alebo konfigurácie, v časti:

Linux
$HOME/.config/blender/3.0/shaders/
Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\3.0\shaders\
macOS
/Users/$USER/Library/Application Support/Blender/3.0/shaders/

Tip

Na použitie v produkcii odporúčame použiť skupinu uzlov na zabalenie uzlov skriptu tieňovača a prepojiť ich s inými blend-súbormi. To uľahčuje následné vykonávanie zmien v uzle pri pridávaní alebo odstraňovaní zásuviek bez toho, aby bolo potrebné aktualizovať uzly skriptov vo všetkých súboroch.

Písanie tieňovačov

Ďalšie podrobnosti o tom, ako písať tieňovače, nájdete v špecifikácii OSL. Tu je jednoduchý príklad:

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);
}

Uzávery

OSL sa líši napríklad od RSL alebo GLSL tým, že nemá svetelnú slučku. V scéne nie je prístup k svetlám a materiál sa musí vytvoriť z uzáverov, ktoré sú implementované v samotnom prekresľovači. Je to obmedzenejšie, ale zároveň to umožňuje prekresľovaču vykonávať optimalizácie a zabezpečiť, aby všetky tieňovače mohli byť dôležitým spôsobom snímané.

Dostupné uzávery v Cykloch zodpovedajú uzlom tieňovača a ich zásuvkám; viac informácií o tom, čo robia, a o význame parametrov nájdete v príručke uzlov tieňovača.

BSDF

  • diffuse(N)

  • oren_nayar(N, zdrsnenie)

  • diffuse_ramp(N, farby[8])

  • phong_ramp(N, exponent, farby[8])

  • diffuse_toon(N, veľkosť, vyhladenie)

  • glossy_toon(N, veľkosť, vyhladenie)

  • translucent(N)

  • reflection(N)

  • refraction(N, ior)

  • transparent()

  • microfacet_ggx(N, zdrsnenie)

  • microfacet_ggx_aniso(N, T, ax, ay)

  • microfacet_ggx_refraction(N, zdrsnenie, index lomu)

  • microfacet_beckmann(N, zdrsnenie)

  • microfacet_beckmann_aniso(N, T, ax, ay)

  • microfacet_beckmann_refraction(N, zdrsnenie, index lomu)

  • ashikhmin_shirley(N, T, ax, ay)

  • ashikhmin_velvet(N, zdrsnenie)

Vlasy

  • hair_reflection(N, zdrsnenieU, zdrsnenieV, T, posuv)

  • hair_transmission(N, zdrsnenieU, zdrsnenieV, T, posuv)

  • principled_hair(N, pohlcovanie, zdrsnenie, radiálne zdrsnenie, obal, posuv, index lomu)

BSSRDF

  • bssrdf_cubic(N, polomer, rozostrenie_textúry, zostrenie)

  • bssrdf_gaussian(N, polomer, rozostrenie_textúry)

Objem (Hlasitosť)

  • henyey_greenstein(g)

  • absorption()

Ďalšie

  • emission()

  • ambient_occlusion()

  • holdout()

  • background()

Atribúty

Niektoré atribúty objektov, častíc a sietí sú k dispozícii vstavanej funkcii getattribute(). UV mapy a farby vrcholov možno získať použitím ich názvu. Ďalšie atribúty sú uvedené nižšie:

geom:generated

Vygenerované súradnice textúry.

geom:uv

Predvolená UV mapa prekreslenia.

geom:dupli_generated

Pre inštancie, vygenerovaná súradnica z objektu vzoru inštancie.

geom:dupli_uv

Pre inštancie, UV súradnica z objektu vzoru inštancie.

geom:trianglevertices

Súradnice troch vrcholov trojuholníka.

geom:numpolyvertices

Počet vrcholov na polygóne (v súčasnosti sa vždy vrátia tri).

geom:polyvertices

Pole súradníc vrcholov polygónu (v súčasnosti vždy tri vrcholy).

geom:name

Názov objektu.

geom:is_curve

Je objekt vlákno alebo nie.

geom:curve_intercept

Ukazujte pozdĺž vlákny od koreňa po špičku.

geom:curve_thickness

Hrúbka vlákna.

geom:curve_tangent_normal

Normál dotyčnice vlákna.

path:ray_length

Vzdialenosť lúča od posledného zásahu.

object:location

Umiestnenie objektu.

object:index

Indexové číslo objektu.

object:random

Náhodné číslo na objekt vygenerované z indexu a názvu objektu.

material:index

Indexové číslo materiálu.

particle:index

Číslo inštancie častice.

particle:age

Vek častíc v snímkach.

particle:lifetime

Celková životnosť častice v snímkach.

particle:location

Poloha častice.

particle:size

Veľkosť častice.

particle:velocity

Rýchlosť častice.

particle:angular_velocity

Uhlová rýchlosť častice.

Trasovanie

Podporujeme funkciu trace(point pos, vector dir, ...) na sledovanie lúčov z tieňovača OSL. Parameter „shade“ (tieň) nie je v súčasnosti podporovaný, ale atribúty možno získať z objektu, ktorý bol zasiahnutý, použitím funkcie getmessage("trace", ..). Podrobnosti o jej použití nájdete v špecifikácii OSL.

Táto funkcia sa nemôže používať namiesto osvetlenia; jej hlavným účelom je umožniť tieňovačom „skúmať“ blízku geometriu, napríklad použiť premietanú textúru, ktorá môže byť blokovaná geometriou, použiť väčšie „opotrebenie“ na odhalenú geometriu alebo vytvoriť iné efekty podobné pohlcovaniu okolím.