A shaderek programozása a hlsl-en

Valószínűleg mindenki hallott a világítási modellekről, mindenütt körülvesz minket: pl. Minden tárgyat, ugyanazt az üvegt az asztalon állva. Bizonyos fény ráesik rá, pontosabban, a nap fényétől vagy bármely más megvilágítási forrásától, ezt egy bizonyos világítási modellnek nevezik. A gyakorlatban senki sem próbál programozni a fény minden fizikai elveit, mivel számításuk nagyon költséges. Mindazonáltal számos modellt találtak fel, amelyek reális eredményeket adnak a kis számításokhoz.

Nézzük még részletesebben, létrehozzunk egy egyszerű megvilágítási modellt - egyenletes megvilágítást.

1. Egységes világítás.

Az egységes világítás (környezeti megvilágítás) állandó kezdeti világítást biztosít az egész jelenet számára. A tárgyak minden csúcsát egyenletesen világítja meg, mivel nem függ semmilyen más világítási tényezőtől. Ez a legegyszerűbb és leggyorsabb típusú világítás, de a legkevésbé realisztikus eredményt ad. A fénymodell kiszámításához használt képlet szintén nagyon egyszerű, mert csak egy számtani művelet van - szorzás. A számításhoz elegendő az anyag színét megszorozni a világítás intenzitásával.

Vertex shader az egységes világítási modell kiszámításához:

Ez a legegyszerűbb shader egyszerűen kiszámolja az objektum helyzetét a világűrben, de ebben a világítási modellben nem használható, mert nincs szükségünk más összetevőkre (normál stb.) A csúcsra a számításhoz.

Itt is nincs semmi bonyolult, csak visszaadja a vektor termékét a fordítóhoz, egy bizonyos számhoz ebben az esetben a környezeti intenzitás. Ezt így teszi:

Az egységes világítási modell:

A shaderek programozása a hlsl-en

A fény elárasztó és diffúz komponenseinek kiszámításához három vektorra van szükség:
• Normál N a töredékre.
• A V fajkészlet olyan vektor, amely a megfigyelő felé irányul.
• A L fényforrás helyzete.

A shaderek programozása a hlsl-en

A vektorok közötti szögek a megvilágítás intenzitását alkotják.

2. A világítás diffúz modellje.

A diffúz világítási modell olyan fénymodell, amely a fényforrás és a tárgy normál felületétől függ. Mivel a fénysugárzás minden irányban megegyezik, a fajvektor nem számít, pl. v = 0. Ez a módszer több számítást igényel, mivel az az egyes objektumok csúcsain változik, de az objektumokat jól árnyékolja, és hangot ad. A fény nem esik az egész felületnek ugyanolyan színnel (mint korai megvilágítás esetén), de úgy tűnik, hogy a fény valamilyen felületre irányul.

A shaderek programozása a hlsl-en

Ha a fényforrás helyzetvektora merőleges a felszínre, nem figyelhető meg a homályosság, mert a fény intenzitása a szögtől # 945; A megvilágítás diffúz modelljének kiszámításához a képletet (Lambert-törvény szerint) használjuk:

Összegezzük - hozzunk létre árnyékolókat a világítási számításhoz.

És a pixel shader:

Diffúz világítási modell:

3.Blikovaya modell a világítás.

Nehéz elképzelni egy ilyen világítási modellt anélkül, hogy meglátná. De valójában csaknem mindenütt láthatjuk ezt a modellt. Például egy tisztán polírozott (kör alakú) egyenes fémfelület, amely a fényforrásra mutat, és olyan szöget vetít, amely nem merőleges a felületre. Ennek eredményeképpen a felületen káprázást fogunk látni, ami jelentősen növeli a kép realizmusát. Ezek a tükrök a felszínről származó fényforrást tükrözik. Ebben a világítási modellben a fényforrás és a normál (pl. A diffúz megvilágítási modell esetében) vektorok mellett két további vektor is használható: a nézeti vektor és a reflexiós vektor. A Bui-Tuong Fong sugallta a látványos világítási modellt.

A shaderek programozása a hlsl-en

A fajvektor és a reflexiós vektor közötti szög - # 946;. Minél nagyobb a szög # 946;, annál világosabb a megvilágítás. Ezért a megvilágítás fújt modelljét az alábbi képlet adja meg:

ahol R = tükrözi (-norm (V), N)
n a lumineszcencia fénysűrűségi együtthatója.

A lumineszcencia fényerejének függése a szögben # 946;:

Az n növekedésével a reflexió egyre inkább felfrissül és egyre inkább koncentrálódik az R. reflexió vektor irányába.

Nem szükséges kiszámítani a nézet vektort az árnyékolóban, kiszámíthatja azt a programban, és beilleszteni a csúcsrétegbe. Ehhez invertálni kell a nézeti mátrixot és a D3DXVECTOR4 vektorral (0.0.0.0.0.0,1.0) vektorral kell szaporítani - a pozíció, amelyen a vektor merőleges a felületre (rám nézünk). Ez így néz ki:

Világítás modell:

A shaderek programozása a hlsl-en

Blinn világítási megvilágításának módosítása.

Jim Blinn alternatív megoldást adott a káprázás megvilágításának kiszámítására, ami kiküszöböli a drága számításokat a reflexiós vektoron. Bevezett egy köztes vektort, amely a fajvektor és a fényforrás pozícióvektorának átlagértéke: H = (L + V) / (| L + V |)

Az általános képlet a következő:

Ezért a fragment shader már így lesz:

A lumineszcencia fényerejének kiszámításának gyorsítása.

Schlick javasolta az n fokú helyettesítést. Hagyja, hogy a skaláris termék legyen D: D = (N • H) n. Ezután az ő módszere szerint a fény fényességét az alábbiak szerint kell kiszámítani:

Összehasonlító grafikonok a hatalmi törvényekről:

Valójában a fény visszaverődésének fizikai jelentése sokkal bonyolultabb, mint a Fong-megvilágítási modellben feltételezhető. Egy reálisabb modellben az L hullámhossztól és a fény előfordulásának szögétől függ (N • L). Ezt a függést Fresnel-együtthatónak nevezik.

Világító alkatrészek kombinációja.

Most három fénymodellt adhatunk hozzá (állandó, diffúz és fényes), hogy megkapja a teljes fénymennyiséget, amit a szemem kap:

A pixel shader most így fog kinézni:

A Cook-Torrance alapú realisztikus világítás

A reálisabb világítási modellekben a hangsúly az energiafogyasztás energiaeloszlásán alapul. Részét az anyag abszorbeálja és hővé alakítja, egy másik rész szétszóródik diffúz fényként, a harmadik rész a fényvisszaverődés felületét állítja be. Ezért a különböző anyagok esetében az incidens fényének elválasztása különböző módon történik, és attól függ, hogy:
• Normál elosztási funkciók
• Árnyékolás és szűrés
• A Fresnel-együttható

Normál elosztási funkció

Ez a függvény leírja a normál normálértéktől a felszínre eső lehetséges eltérést az ideális normál N értéktől. Minél inkább ez a funkció sekély, annál nagyobb az eltérés megengedett, és annál nagyobb a visszaverődő tükröződés helyének nagysága. A szükséges normálok az L + V vektor mentén helyezkednek el, és a V irányban láthatóak, a szög (H • N) pedig a néző számára. Cook és Torrence a Beckmann eloszlási képletet használta:

ahol d = H • N
m az objektum érdességének mértéke. 0,2f sima felület, 0,6f durva felület. Az alapértelmezett beállítás 0.3f.

A Beckmann forgalmazási ütemezése:

A shaderek programozása a hlsl-en

Árnyékolás és árnyékolás

A Cook-Torrance modell figyelembe veszi az olyan hatásokat is, mint az árnyékolás és a maszkolás, amelyek meghatározzák a vakító komponens intenzitását.

Árnyékolatlan fény:

Árnyék nélküli fény egyenlő:

Ezután a G végső tényezője:

Ez a tényező meghatározza a visszavert fény frakcióját, és ezt a függvény határozza meg:

ahol f az incidencia szöge, amelynek koszinusa c = (N • H)
n az anyag törésmutatója, g = sqrt (n 2 + c 2 -1)

Valójában a shader-ben a Fresnel együttható kiszámításához eltérő képletet használunk az utasítások korlátozása miatt. A helyettesítést a Schlick kínálta:

F = Rs + (1-Rs) × (1-E · N) n
ahol Rs a fényvisszaverődés,
E a megfigyelő vektora,
N normális a normál térképből.

Az ilyen közelítés nem veszi figyelembe az f és n komponenseket, hanem az n fokú, amelynek növekedésével nem lehet rossz eredményt elérni. A Schlick használt n = 5.

Összes multiplikátor kombinálása

Torrence és Sparrow kombinálta ezeket a tényezőket, és a káprázás kiszámításának képletét eredményezte:

Az N • V nevezőt bevezetjük a fény intenzitásának szabályozására.

A shaderek programozása a hlsl-en

A fény mennyiségének kiszámítására szolgáló általános képlet a következő:

A képletet egy kicsit egyszerűsítettük, mivel az eredetiben a megvilágítás minden egyes elemét (kivéve a fáklyát) F (0, n) szorozzuk. Ennek oka a Schlick közelítés használata.

Ennek a hatásnak a pixel shaderje: