ПредишенСледващото

HDR срещу LDR, HDR рендиране изпълнение

Както обещах - публикувам втора статия за някои аспекти на развитието на играта в три измерения. Днес говорим за техника, която се използва за почти всеки проект, AAA клас. Името на това - HDR Rendering. Ако проявявате интерес - добре дошъл при habrakat.

Но първо трябва да се говори. Въз основа на последната статия - Разбрах, че публиката Habrahabr погребан Microsoft XNA технология. За да направите, се твърди, че с помощта на неговата нещо - така или иначе, какво да пиша игри на ZX Spectrum. В примера Донесох: "Истината е, че SharpDX, SlimDX, OpenTK! "Дори за пример на Unity. Но ще се съсредоточи върху първите трима, всички - чисти опаковки DX'a под .NET. Единство и така всички пясък двигател. Това като цяло тя представлява DirectX10 +. В края на краищата, не е и няма да бъде в XNA. Така че, по-голямата броя на ефекти, чипс и технологии се реализира на базата на DirectX9c. A + DirectX10 въвежда само допълнителна функционалност (SM4.0, SM5.0).

Вземете, например, Crysis 2:

HDR срещу LDR, HDR рендиране изпълнение

HDR срещу LDR, HDR рендиране изпълнение

В тези две снимки на екрани не DirextX10 и DirectX11. Така че, защо хората си мислят, че правят нещо за XNA - да се ангажират с некрофилия? Да, Microsoft прекрати поддръжката на XNA. но си запазваме това, което е там - достатъчно за 3 години точно. Освен това, сега има monogame. той opensorsny на различни платформи (победа, UNIX, Mac, Android, IOS, и т.н.), и запазва всички едно и също XNA архитектура. Между другото, Фес от последната статия написани на monogame. И най-накрая - цялата статия, насочена към компютърна графика в три измерения (тези разпоредби важат и за OpenGL и DirectX.), Вместо XNA - както може би си мислите. XNA в нашия случай, просто инструмент.

Добре, нека да отидем

Обикновено в игри, използвани LDR (Low Dynamic Range) рендиране. Това означава, че цветът на обратно буфер се ограничава в обхвата 0 ... 1. Когато всеки канал е дадено от 8 бита и е 256 стъпки. Например: 255, 255, 255 - бял цвят, всички три канала (RGB) са равни на максималния градация. LDR концепция за честна употреба на понятието за реалистична представа, тъй като в реалния свят на цвета е посочено, не е нула и единица. За помощ идва при нас тази технология като HDRR. Да започнем с това, какво е HDR. High Dynamic Range Rendering. понякога просто «High Dynamic Range» - графичен ефект се използва в компютърни игри за по-изразителни рендериране на изображения с контраст осветление на сцената. Каква е същността на този подход? Фактът, че сме се направи нашата геометрия (и осветление) не се ограничава до нула и единица: един източник на светлина може да даде на яркостта на пикселите до 0,5 единици, както и още 100 единици. Но как може да се замени на пръв поглед, ни екран възпроизвежда точно по същия LDR формат. И ако ние сме всички цветови стойности обратно буфер е разделена на максималната яркост на сцената - да получите същия фоторезистора. източник на светлина в 0,5 единици едва ли ще се вижда на фона на втория. И точно за това, че е измислен от специален метод, наречен Tone Mapping. Същността на този подход е, че ние даваме на динамичен обхват фоторезистора, в зависимост от средната яркост на сцената. И, за да разберете какво имам предвид, помислете сцена: две стаи, една стая на закрито. други външни. Първата стая - разполага с изкуствен източник на светлина, втората стая - източник на светлина под формата на слънце. Яркостта на слънцето е много по-висока, отколкото на яркостта на източника на изкуствена светлина. И в реалния свят, когато сте в първата стая - ние се адаптират към осветлението на входа на друга стая се адаптираме към различно ниво на осветеност. Когато се гледа от първата стая на втория - би било за нас прекалено светъл, и когато се гледа от втория към първия - черно.

Друг пример: един външен стая. В тази стая - е самото слънце и разсеяна светлина от слънцето. Яркостта на слънцето е много по-висока от неговата околна светлина. В случай на LDR стойност на яркостта на светлината ще бъде равен. Поради това, с помощта на HDR може да се постигне реалистична отблясъци от различни повърхности. Тя е много по-осезаемо при водата:

HDR срещу LDR, HDR рендиране изпълнение

И не заслепява с surfeysa:

HDR срещу LDR, HDR рендиране изпълнение

Е, цялата контраста сцена (лява HDR, нали LDR):

HDR срещу LDR, HDR рендиране изпълнение

Заедно с HDR и Bloom решили да използват тази технология. ярки региони, да се замъглят и насложени върху основното изображение:

HDR срещу LDR, HDR рендиране изпълнение

Това го прави още по-мека светлина.

Както и бонус - аз кажа за цветова корекция. Този поход е широко използвана в AAA игри.

Цвят Окачествяването

Много често в сцената игри трябва да има свой собствен цвят, цветовата гама може да се споделя за играта и за отделните райони на сцената. И всеки път, когато има сто-шейдър постпроцесори - използване подход за цветова корекция. Каква е същността на този подход?

Известни писма RGB - цвят триизмерното пространство, където всеки канал е един вид координира. Ако R8G8B8 формат: 255 градации за всеки канал. И така, какво ще стане, ако ние прилагаме операции обичайните за обработка (например, криви или контрастни) до това пространство? Нашето място ще се промени в бъдеще, можем да го присвоите на всяко пиксел - един пиксел от това пространство.

Създаване на прост RGB цветово пространство (Искам да замени това, което ние приемаме всеки осми пиксел, защото ако вземем всички 256 нива, размерът на текстурата ще бъде много голям)

Тази триизмерна структура, където всяка ос - в канала си.

И да вземе всяка сцена, която искате да се промени (добавяне на образа на нашето пространство):

HDR срещу LDR, HDR рендиране изпълнение

Ние изпълнява необходимата трансформация на (окото):

HDR срещу LDR, HDR рендиране изпълнение

И изтегли нашия изменяема пространство:

Сега, в това пространство - можем да приложим всички необходими промени в цвета на всяко изображение. Просто сравняване на оригиналния цвят на пространството с променящ се цвят.

изпълнение

Ами и за кратко за изпълнението на HDR в XNA. В XNA подкрепа клипборда формат е зададен (най-вече) R8G8B8A8. защото оказване директно на екрана не може да поддържа HDR априори. За да направите това около това - ние трябва да се създаде нова RenderTarget (I-рано описания на работата onnyh тук) със специален формат: HalfVector4 *. Този формат поддържа плаващ стойност в RenderTarget.

* - в XNA е такъв формат - като HDRBlendable. тя е една и съща HalfVector4 - но RT заема по-малко пространство (както е в алфа канал нямаме нужда плаваща запетая).

Тръгнете надясно RenderTarget:

Създаване на нова RT с размери обратно буфер (разделителна способност) с прекъснат визуализиране (от тази структура е съставена от каре на дисплея) формат surfeysa - HdrBlendable (или HalfVector4) и 24-битова дълбочина ех буфер / шаблони буфери 8 бита , Просто забраните multisampling.
Важно е да се включват RenderTarget дълбочина буфер (за разлика от конвенционалните след процеса RT), като ние ще се направи, за да ни геометрия.

След това - точно като в фоторезистора. черпим сцената, но сега не е нужно да бъде ограничено до изготвянето на яркостта [0. 1].
Добавяне на SkyBox с номинална яркост, умножена по три и класически чайника с Юта DirectionalLight -osvescheniem и светлоотразяващи-повърхностен.

Сцена е създаден и сега имаме по някакъв начин да форматирате HDR водят до LDR. Вземете най-лесният ToneMapping - разделете всички тези стойности за максимум условна стойност.

За да се завъртете камерата и да разберат, че на сцената все още има статичен и подобна картина може лесно да бъде постигнато чрез прилагане на контраст на изображението.

В реалния живот - очите ни се приспособяват към желания обхват: в слабо осветена стая, все още виждаме, но толкова дълго, колкото има пред очите ни светъл източник на светлина. Това се нарича светлина адаптация. И най-якото е, че HDR и цвят адаптиране перфектно помежду си.

Сега трябва да се изчисли средната стойност на цвета на екрана. Това е проблем, защото плаваща стойност не поддържа филтриране. Процедира както следва: създаване на N-ти брой на RT, където всеки следващ по-малък от предишния:

И ние ще изготви всяка предходна RT RT следващото прилагане на размазването. След тези цикли ще получим текстура 1Х1. който всъщност съдържа средната цвят.

Ако сега се управлява, адаптация на цвета ще е много, но то ще бъде моментално и това не се случи. Ние трябва да погледнем по-драматично тъмна зона на блондинката на рязане - първа усети слепота (под формата на високо яркост), а след това всичко се върна към нормалното. Това е достатъчно, за да още един RT 1x1. който ще отговаря за текущата стойност на адаптация, като по този начин, всеки кадър ние привеждане на настоящата адаптация към това изчислява на цвят момент. Нещо повече, тази стойност сближаване трябва да бъде обвързано с всички от един и същи gameTime.ElapsedGameTime. на броя на FPS не влияе на скоростта на адаптация.

Е, и сега, както и на макс за _toneSimple да прехвърляте средно нашия цвят.

Има много формули ToneMapping "а, ето някои от тях:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!