A HLSL programozási nyelv

Utasítások, vezérlési szerkezetek

Értékadás

Ugyanúgy, ahogy C++-ban használtuk.

Szekvencia

{ statement 1; statement 2; ... statement n; }

Ilyenkor az egyes blokkokban létrehozott változók, csak az adott blokkon belül látható. Ugyanúgy működik, mint C++-ban.

Elágazás

  • If szerkezet:
  • [Attribute] if ( Conditional ) { Statement Block; }

    Működése ugyanúgy mint C++-ban.

    Attribute – Opcionális. Megadható értéknek branch, ekkor lusta kiértékelést használ, flatten esetén pedig mohó kiértékelést. Default-ként lusta kiértékelést használ

  • Switch szerkezet:

  • [Attribute] switch( Selector ) { case 0 : { StatementBlock; } break; case 1 : { StatementBlock; } break; case n : { StatementBlock; } break; default : { StatementBlock; } break;

    Attribute – branch, és flatten esetén ugyanaz mint az előzőnél. Lehet még forcecase, ilyenkor hardveren számolja a switch-et. Call esetén pedig szubrutin hívásokként kerülnek a hardverre a switch utasítások törzsei.

    Például:

    [branch] if( a == 2 ) return 3; else if( a == 1 ) return 1; else if( a == 0 ) return 0; else return 6;

    Ciklus

    Ugyanúgy működnek a ciklusok, ahogy C++-ban megszoktuk, apró különbséggel amit a következőekben részletezek.

  • Hátultesztelős:
  • do { Ciklusmag }while(feltétel)

  • Előltesztelős:
  • [Attribute] while(feltétel) { Ciklusmag }

    Attribute – Opcionális. Értéke unroll(x) lehet, ekkor x helyére megadhatjuk, hogy maximum hány lépést mehet a ciklus

  • For ciklus:
  • [Attribute] for ( Initializer; Conditional; Iterator ) { Ciklusmag }

    Attribute – Ugyanaz, mint az előzőnél.

    Vezérlésátadó utasítások

  • break – hasonlóan a C++-hoz, itt is ciklus megszakítására lehet használni
  • continue – hasonlóan a C++-hoz, itt is a ciklus adott lépésének a megszakítása, és a következő lépés folytatására lehet használni
  • discard – csak a pixel shaderből hívható, az adott pixel értékét nem küldi tovább
  •