Hdr vs ldr, hdr rendering végrehajtás

Hdr vs ldr, hdr rendering végrehajtás

Ahogy ígértem - azt közzé egy második cikket néhány szempontból a játék fejlesztése három dimenzióban. Ma beszélni olyan technika, amely szinte bármely projekt AAA osztályú. Nevezze el - HDR Rendering. Ha érdekel - üdvözlő alatt habrakat.

De először meg kell beszélni. Ennek alapján az utolsó cikket - Rájöttem, hogy a közönség Habrahabr eltemetett Microsoft XNA technológia. Ehhez állítólag segítségével ő valamit - mindegy, hogy mit kell írni játékok a ZX Spectrum. A példában hoztam: „Van ugyanis SharpDX, SlimDX, OpenTK! „Még példaként a Unity. De fog összpontosítani az első három, minden - tiszta csomagolóanyagokat DX'a alatt .NET. Egység és így a motor minden homokozóban. Ez általában azt jelenti DirectX10 +. Végtére is, ez nem, és nem lesz XNA. Szóval, a túlnyomó számú hatások chipek és technológiák alapján valósul meg a DirectX9c. A + DirectX10 csak bemutatja további funkciókat (SM4.0, SM5.0).

Vegyük például a Crysis 2:

Hdr vs ldr, hdr rendering végrehajtás

Hdr vs ldr, hdr rendering végrehajtás

Ebben a két screenshotok nem DirextX10 és DirectX11. Akkor miért az emberek azt hiszik, hogy ezzel valamit XNA -, hogy vegyenek részt necrophilia? Igen, a Microsoft megállt támogató XNA. de fenntartják mi van ott - elég pontosan 3 év. Sőt, ma már egy monogame. ő opensorsny, cross-platform (win, Unix, Mac, Android, iOS, stb.), és elmenti az összes azonos XNA építészet. By the way, Fez az utolsó cikket írt a monogame. És végül - a teljes cikket, amelynek célja a számítógépes grafika három dimenzióban (ezek a rendelkezések is érvényesek OpenGL és DirectX). Ahelyett, hogy az XNA - mint gondolná. XNA esetünkben csak egy eszköz.

Oké, menjünk

Általában játékok használt LDR (Low Dynamic Range) rendering. Ez azt jelenti, hogy a színe a hátsó puffer korlátozott tartományban 0 ... 1. Amennyiben az egyes csatornák adják 8 bit, és ez 256 lépés. Például: 255, 255, 255 - fehér színű, mindhárom csatorna (RGB) egyenlő a maximális gradáció. LDR fogalmát tisztességes használat a koncepció reális rendering, mint a valóságban a szín van megadva nem nulla és egy. Ha segítségre jön hozzánk ezt a technológiát HDRR. Kezdjük azzal, hogy mi az a HDR. High Dynamic Range Rendering. néha egyszerűen «High Dynamic Range» - grafikai hatása, amelyet a számítógépes játékok kifejezőbbé teszi a képeket, kontraszt megvilágítás a jelenetet. Mi a lényege ennek a megközelítésnek? Az a tény, hogy felhívjuk a geometria (és megvilágítás) nem korlátozódik a nulla és egy: egy fényforrást adhat a fényerő a pixel 0,5 egység, és egy másik 100 egység. De hogyan lehet cserélni az első pillantásra, a képernyő lejátssza ugyanúgy LDR formátumban. És ha mindannyian színértékekkel hátsó puffer elosztjuk a maximális fényerő a jelenet - kap ugyanaz LDR. egy fényforrás a 0,5 egység aligha lesz látható a háttérben a második. És csak, hogy alkotta különleges eljárással a Tone Mapping. A lényege ennek a megközelítésnek, hogy adunk, hogy a dinamikus tartomány LDR függően átlagosan fényviszonyain. És annak érdekében, hogy érti, mire gondolok, úgy a jelenetet: két szoba, egy szoba fedett. egyéb kültéri. Az első szoba - egy mesterséges fényforrás, a másik szobában - egy fényforrás formájában a nap. A fényerő a Nap sokkal nagyobb, mint a fényerő a mesterséges fényforrás. És a világban, ha az első szobában - alkalmazkodás során a világítás a bejáratnál egy másik szobába is alkalmazkodni a különböző fényerő. Nézve az első szobában, a második - úgy tűnik számunkra túlságosan fényes, és nézve a második az első - fekete.

Egy másik példa: az egyik külső szobában. Ebben a szobában - ez a nap is, és a szórt fény a nap. A fényerő a Nap sokkal nagyobb, mint a környezeti fény. Abban az esetben, LDR értéke a fényerő a fény egyenlő lenne. Éppen ezért, ha a HDR lehet elérni reális tükröződést a különböző felületekről. Ez nagyon észrevehető a víz:

Hdr vs ldr, hdr rendering végrehajtás

Vagy vakító a surfeysa:

Hdr vs ldr, hdr rendering végrehajtás

Nos, az egész jelenet kontrasztja (bal HDR jobb LDR):

Hdr vs ldr, hdr rendering végrehajtás

Együtt a HDR és Bloom úgy döntött, hogy használja a technológiát. világos régiók homályos és fölé a fő kép:

Hdr vs ldr, hdr rendering végrehajtás

Ez még lágyabb világítás.

Csakúgy, mint a bónusz - én mesélni fényelés. Ezt túra széles körben használják az AAA játékok.

fényelés

Nagyon gyakran a játék jelenetet kell saját színárnyalat, a színtónus lehet osztani a játékot, és az egyes területeken a jelenetet. És minden alkalommal van egy száz-shader utófeldolgozók - használat megközelítés fényelés. Mi a lényege ennek a megközelítésnek?

Híres betűk RGB - színes háromdimenziós térben, ahol minden egyes csatorna egy olyan koordináta. Ha R8G8B8 méret: 255 színátmenetek csatornánként. Tehát, mi történik, ha alkalmazza a szokásos feldolgozási műveletek (pl görbék vagy kontraszt), ezt a teret? A tér változni fog a jövőben, mi lehet rendelni, hogy minden pixel - egy pixel ettől térben.

Hozzon létre egy egyszerű RGB színtér (akarom cserélni, amit veszünk minden nyolcadik pixel, mert ha vesszük az összes 256 szint, a méret a textúra lesz nagyon nagy)

Ez a háromdimenziós szerkezet, ahol minden tengely - a csatorna.

És bármilyen jelenetet a módosítani kívánt (hozzátéve, hogy a kép a space):

Hdr vs ldr, hdr rendering végrehajtás

Végezzük el a szükséges átalakulás a (szem):

Hdr vs ldr, hdr rendering végrehajtás

És újra megtalálni módosítható helyet:

Most, ebben a térben - tudjuk alkalmazni a módosításokat a szín minden képet. Csak összehasonlítva az eredeti színét a színváltó helyet.

végrehajtás

Jól és röviden végrehajtásáról szóló HDR a XNA. Az XNA hátlap vágólap formátum van beállítva (többnyire) R8G8B8A8. mert teszi közvetlenül a képernyőre nem támogatja a HDR priori. Ehhez kerülő - létre kell hoznunk egy új RenderTarget (I korábban ismertetett munka onnyh itt) egy speciális formátum: HalfVector4 *. Ez a formátum támogatja a változó értékét RenderTarget.

* - az XNA olyan formában - mint HDRBlendable. ez ugyanaz HalfVector4 -, de az RT kevesebb helyet (mint az alfa-csatornát nem kell lebegőpontos).

Fej jobbra RenderTarget:

Készítsen egy új RT méretekkel hátsó puffer (képernyő felbontás) szétkapcsolt Mipmap (mivel ez a textúra készült a kijelzőn quad) formátumban surfeysa - HdrBlendable (vagy HalfVector4) és 24-bites ex puffer mélységét / stencil buffer 8 bit . Csak kikapcsolni a többszörös mintavételt.
Fontos, hogy tartalmazza RenderTarget mélysége puffert (ellentétben a hagyományos feldolgozás utáni RT), mint fogjuk hívni, hogy a geometria.

Aztán - csak úgy, mint a LDR. felhívjuk a helyszínre, de most már nem kell korlátozni, hogy felhívják a fényerő [0. 1].
Add a Skybox névleges fényerő megháromszorozódott és a klasszikus kannát Utah DirectionalLight -osvescheniem és Fényvisszaverő -felszíni.

Jelenet jött létre, és most meg kell valahogy formázni HDR vezet LDR. Vegyük a legegyszerűbb ToneMapping - osztja ezeket az értékeket a feltételes érték max.

Hogy csavarja a kamerát, és megérti, hogy a jelenet még egy statikus és egy hasonló képet lehet könnyen elérni alkalmazásával a kép kontrasztját.

A valóságban - a szemünk állítsa be a kívánt lefedettség: egy gyengén megvilágított szobában, még mindig látni, de amíg van a szemünk előtt egy erős fényforrás. Ez az úgynevezett fényadaptáció. És a legmenőbb, hogy a HDR és színes alkalmazkodás tökéletesen egymáshoz.

Most kell számítani az átlagos érték a szín a képernyőn. Ez azért problematikus, mert lebegő érték nem támogatja a szűrést. Eljárás a következő: létre N-edik számú RT, ahol minden következő kisebb, mint az előző:

És vonjuk minden korábbi RT RT következő alkalmazása egy elmosódott. Miután ezek a ciklusok megkapjuk a textúra 1x1. amely valóban tartalmazza az átlagos színét.

Ha most futni, színadaptációs valóban, de ez lesz az azonnali és ez nem történik meg. Meg kell nézni a drámai sötét terület a vágás szőke - úgy éreztem, vakság (formájában nagy fényerejű), majd minden jött vissza a normális. Ez elég ahhoz, hogy még egy RT 1x1. ki lesz felelős a jelenlegi értéke az alkalmazkodás, így minden keret hoztuk a jelenlegi hozzáigazítása az adott időpontjában kell kiszámítani színét. Sőt, ez a közelítés értéke kellene kötni az összes azonos gameTime.ElapsedGameTime. hogy hány FPS nem befolyásolja a sebességet alkalmazkodás.

Nos, és most, mint a max _toneSimple átadhatja a mi átlagos színét.

Rengeteg olyan képletek ToneMapping „egy, íme néhány közülük:

Kapcsolódó cikkek