Hirdetés

Keresés

Új hozzászólás Aktív témák

  • pzg

    tag

    válasz #88750080 #13 üzenetére

    Az übershader nem a sok lefordított variáns elkerülésére van, hanem hogy a sok variánst mégis egyetlen forráskódban megírt fájlban lehessen kezelni/áttekinteni. Tehát nem futáskori if() {...} else {...} elágazóblokkokkal van tele, hanem fordításkori #ifdef-#else-#endif-ekkel. Ezáltal ha a programozók használnak mondjuk tizenötfajta #define címkét egy übershaderben, akkor a játék indulásakor le lehet ennek a 15-nek mindenfajta kombinációjára fordíttatni a géppel egy-egy shadert, és a játék minden helyzetben meg tudja hívni a még éppen "legrövidebbet és leggyorsabbat". Mégis forráskód szinten csak egy közös überváltozat létezik.

    Úgy kell elképzelni, hogy mondjuk valakinek van A, B és C változója, és kell neki egy program (shader), ami kiszámolja A*B*C értékét. De mivel a hardvere lassú, ezért ha előre tudja, hogy most éppen B=1, akkor érdemes egy olyan programot futtatnia, ami csak A*C értékét számolja ki. Ezért, hogy ne kelljen hétfajta programot írnia, ezt így írja meg:

    float ret = 1;
    #ifdef A
    ret = ret * a;
    #endif
    #ifdef B
    ret = ret * b;
    #endif
    #ifdef C
    ret = ret * c;
    #endif
    return ret;

    És így egy ilyen übershaderből tud hétféle shadert fordítani.

Új hozzászólás Aktív témák