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:
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:
Vagy vakító a surfeysa:
Nos, az egész jelenet kontrasztja (bal HDR jobb LDR):
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:
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):
Végezzük el a szükséges átalakulás a (szem):
É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: