Shader-noder

Cycles tillämpar ett antal optimeringar av shader-noder både vid kompileringen och under körningen. Genom att utnyttja dem är det möjligt att designa komplicerade nodgrupper i ”Uber Shader”-stil som ger minimalt renderingstidstillägg för oanvända funktioner.

Optimering av noder

Som ett första steg i förberedelsen av en nodshader för exekvering expanderar Cycles alla nodgrupper, som om man använde Ungroup-verktyget, och tar bort funktioner som bara finns i användargränssnittet, t.ex. ramar och omledningsnoder.

Efter det tillämpar den några uppenbara omvandlingar, till exempel kan den (listan är inte uttömmande):

  • Ersätt följande noder med det konstanta resultatet av deras utvärdering, om alla deras indata är konstanta:

    RGB, Value, Mix RGB, Math, Vector Math, RGB to BW, Gamma, Bright Contrast, Invert, Separate/Combine RGB/XYZ/HSV, Blackbody, RGB Curves, Vector Curves, Color Ramps.

  • Detektera Mix RGB-, Math- och Vector Math-noder som blir no-op (utan Clamp) eller utvärderas till 0 som ett resultat av addition, subtraktion, multiplikation, division eller punkt/kors-produkt med en känd konstant 0- eller 1-ingång, och ersätt med lämplig ingångslänk eller konstant resultat.

  • Eliminera noderna Mix RGB Mix (utan Clamp) och Mix Shader när det är känt att Factor är 0 eller 1 genom att ersätta dem med lämpligt ingångsvärde eller länk.

  • Eliminera noderna Mix RGB (utom Color Burn, Color Dodge, Lighten eller enabled Clamp), Invert, RGB Curves och Vector Curves med känd nollfaktor.

  • Eliminera Emission och Background shader-noder som inte avger något ljus, och Add Shader-noder som saknar ett eller båda indataargumenten.

  • Eliminera Bump med konstant höjdinmatning, använd istället dess Normal-ingång eller Geometri Normal. Detta är användbart för att implementera nodgruppsingångar som standard till normal via routing genom en no-op Bump innan du gör matematik.

  • Ersätt Attribute noder av typen View Layer med det utvärderade attributvärdet (det är konstant inom hela Render Layer).

  • Kombinera flera kopior av samma nod med samma indata till endast en instans.

Slutligen tas alla noder bort som inte är anslutna vare sig direkt eller indirekt till utgångsnoden.

Optimeringar under körtid

Vid exekvering av shaders tillämpas en särskild optimering på Mix Shader-noder. Om Factor utvärderas till 0 eller 1 utvärderas inte noder som endast kan nås via den oanvända grenen av mixen.

Detta kan avsevärt minska prestandakostnaden för att kombinera flera material i en shader med ett färgattribut, en textur eller annan input som används som switch.

Öppet skuggningsspråk

Om Open Shading Language väljs som renderingsbackend översätts nodshaders till OSL-kod och kompileras och exekveras sedan av OSL runtime. I processen tillämpar den sin egen omfattande uppsättning optimeringar, både vid kompileringstiden och under körningen.

Open Shading Language kan optimera bort Script-noder om deras utdata är oanvända eller konstanta, även om deras OSL-shaders har bieffekter som debug-tracing och meddelandeöverföring, vilket kan vara förvirrande. Av den anledningen bör meddelandepassning med setmessage och getmessage i allmänhet inte användas för att skicka information framåt i grafen; att uttryckligen skicka information via sockets bör föredras.