Vyrovnávací paměť Z - Z-buffering

Data vyrovnávací paměti Z.

Hloubka vyrovnávací paměti , také známý jako z-bufferu , je druh dat pufru používá v počítačové grafice reprezentovat informace hloubky objektů v 3D prostoru z určitého pohledu . Hloubkové vyrovnávací paměti jsou pomůckou při vykreslování scény, aby se zajistilo, že správné polygony správně uzavřou ostatní polygony. Z-buffering byl poprvé popsán v roce 1974 Wolfgangem Straßerem v jeho disertační práci o rychlých algoritmech pro vykreslování okludovaných objektů. Podobným řešením pro určení překrývajících se polygonů je malířův algoritmus , který je schopen zpracovat neprůhledné prvky scény, i když za cenu efektivity a nesprávných výsledků.

V 3D vykreslovacím potrubí , když je objekt promítán na obrazovku, je hloubka (hodnota z) generovaného fragmentu v promítaném obrazu obrazovky porovnána s hodnotou již uloženou ve vyrovnávací paměti ( test hloubky ) a nahradí ji pokud je nová hodnota bližší. Funguje to společně s rasterizerem , který vypočítává barevné hodnoty. Fragment vytvořený rasterizerem se uloží, pokud není překryt jiným fragmentem.

Při prohlížení obrázku obsahujícího částečně nebo zcela překrývající se neprůhledné objekty nebo povrchy není možné plně vidět ty objekty, které jsou nejdále od diváka a za jinými objekty (tj. Některé povrchy jsou skryty za jinými). Pokud by neexistoval žádný mechanismus pro správu překrývajících se povrchů, povrchy by se vykreslovaly na sebe, bez ohledu na to, jestli mají být za jinými objekty. Identifikaci a odstranění těchto povrchů nazýváme problém skrytého povrchu . Aby počítač zkontroloval překrývání, vypočítá hodnotu z pixelu odpovídající prvnímu objektu a porovná ho s hodnotou z na stejném místě pixelu v z-bufferu. Pokud je vypočítaná hodnota z menší než hodnota z již v z-bufferu (tj. Nový pixel je blíže), pak je aktuální hodnota z v z-bufferu nahrazena vypočítanou hodnotou. To se opakuje pro všechny objekty a povrchy ve scéně (často paralelně ). Nakonec z-buffer umožní správnou reprodukci obvyklého vnímání hloubky: blízký předmět jeden skryje dál. Toto se nazývá z-utracení .

Z-buffer má stejnou interní datovou strukturu jako obrázek, konkrétně 2d pole, s jediným rozdílem v tom, že místo barevných obrázků, které používají 3 hodnoty k vytvoření barvy, ukládá jednu hodnotu pro každý pixel obrazovky. Díky tomu se z-buffer zobrazí černobíle, protože neukládá informace o barvách. Vyrovnávací paměť má pro konzistenci stejné rozměry jako vyrovnávací paměť obrazovky.

Primární testy viditelnosti (jako je vyřazování zezadu ) a sekundární testy viditelnosti (například kontroly překrývání a ořezávání obrazovky) se obvykle provádějí na polygonech objektů, aby se přeskočily konkrétní polygony, které není nutné vykreslovat. Z-buffer je pro srovnání poměrně drahý , takže provádění primárních a sekundárních testů viditelnosti zbavuje z-buffer určité povinnosti.

Zrnitost z-bufferu má velký vliv na kvalitu scény: tradiční 16bitový z-buffer může mít za následek artefakty (nazývané „ z-bojování “ nebo sešívání ), když jsou dva objekty velmi blízko sebe. Modernější 24bitový nebo 32bitový z-buffer se chová mnohem lépe, i když problém nelze odstranit bez dalších algoritmů. 8-bit z-buffer je téměř nikdy použit, protože má příliš málo přesnost.

Využití

Z-buffer je technologie používaná téměř ve všech současných počítačích, noteboocích a mobilních telefonech k provádění 3D počítačové grafiky . Primární použití je nyní pro videohry , které vyžadují rychlé a přesné zpracování 3D scén. Z-buffer je implementován v hardwaru v rámci spotřebitelských grafických karet . Z-buffer je také používán (implementován jako software na rozdíl od hardwaru) pro výrobu počítačem generovaných speciálních efektů pro filmy.

Data Z-bufferu získaná z vykreslení povrchu z pohledu světla navíc umožňují vytváření stínů technikou stínového mapování .

Vývoj

I při dostatečně malé zrnitosti mohou nastat problémy s kvalitou, když přesnost hodnot vzdálenosti z-bufferu není rozložena rovnoměrně na vzdálenost. Bližší hodnoty jsou mnohem přesnější (a proto mohou lépe zobrazit bližší objekty) než hodnoty, které jsou dále. Obecně je to žádoucí, ale někdy to způsobí, že se artefakty objeví, když se objekty stanou vzdálenějšími. Variace na vyrovnávací paměť z, která má za následek rovnoměrnější distribuci přesnosti, se nazývá w-buffering (viz níže ).

Na začátku nové scény musí být z-buffer vymazán na definovanou hodnotu, obvykle 1,0, protože tato hodnota je horní mezí (na stupnici od 0 do 1) hloubky, což znamená, že na tento bod přes frustraci prohlížení .

Vynález konceptu z-bufferu je nejčastěji přisuzován Edwinu Catmullovi , přestože Wolfgang Straßer tuto myšlenku popsal ve svém Ph.D. teze měsíce před Catmulliným vynálezem.

Na novějších grafických kartách pro počítače (1999–2005) správa z-bufferu využívá značný kus dostupné šířky pásma paměti . Byly použity různé metody ke snížení nákladů na výkon vyrovnávací paměti z, jako je bezeztrátová komprese (počítačové prostředky pro kompresi/dekompresi jsou levnější než šířka pásma) a ultra rychlý hardwarový z-clear, který zastarává „jeden snímek pozitivní, jeden snímek negativní "trik (přeskakování mezi snímky zcela vymazat pomocí podepsaných čísel pro chytrou kontrolu hloubek).

Z-utracení

Při vykreslování je z-culling raná eliminace pixelů založená na hloubce, což je metoda, která poskytuje zvýšení výkonu, když je vykreslování skrytých povrchů nákladné. Je to přímý důsledek ukládání do vyrovnávací paměti z, kde je hloubka každého pixelového kandidáta porovnávána s hloubkou stávající geometrie, za kterou může být skrytá.

Při použití z-bufferu může být pixel vyřazen (zahozen), jakmile je známa jeho hloubka, což umožňuje přeskočit celý proces osvětlení a texturování pixelu, který by stejně nebyl viditelný . Také časově náročné pixelové shadery obecně nebudou provedeny pro zrušené pixely. Díky tomu je z-culling dobrým kandidátem na optimalizaci v situacích, kde jsou hlavními překážkami výplň , osvětlení, texturování nebo pixelové shadery .

Zatímco z-buffering umožňuje, aby geometrie byla netříděna, třídění polygonů zvýšením hloubky (tedy pomocí algoritmu reverzního malíře ) umožňuje vykreslení každého pixelu obrazovky méněkrát. To může zvýšit výkon ve scénách omezených na fillrate s velkým množstvím přetažení, ale pokud není kombinováno s vyrovnávací pamětí z, trpí vážnými problémy, jako jsou:

  • polygony se mohou v cyklu navzájem uzavřít (např .: trojúhelník A uzavírá B, B uzavírá C, C uzavírá A) a
  • na trojúhelníku neexistuje žádný kanonický „nejbližší“ bod (např. bez ohledu na to, zda člověk třídí trojúhelníky podle těžiště nebo nejbližšího bodu nebo nejvzdálenějšího bodu, vždy lze najít dva trojúhelníky A a B tak, že A je „blíže“, ale ve skutečnosti B by měl být nakreslen jako první).

Algoritmus reverzního malíře jako takový nelze použít jako alternativu k utracení Z (bez namáhavého přepracování), kromě případů, kdy je to optimalizace pro Z-utracení. Optimalizací může být například udržování polygonů seřazených podle umístění x/y a hloubky z pro zajištění hranic, ve snaze rychle určit, zda dva polygony mohou mít případně interakci s okluzí.

Matematika

Rozsah hodnot hloubky v prostoru kamery, který má být vykreslen, je často definován mezi a a hodnotou .

Po transformaci perspektivy je nová hodnota nebo definována:

Po ortografické projekci je nová hodnota nebo definována:

kde je stará hodnota v prostoru kamery a někdy se nazývá nebo .

Výsledné hodnoty jsou normalizovány mezi hodnotami -1 a 1, kde rovina je v -1 a letadlo je v 1. hodnoty mimo tento rozsah odpovídají na místech, která nejsou v pohledu komolého kužele , a neměl by být vykresleno.

Reprezentace s pevným bodem

Obvykle jsou tyto hodnoty uloženy ve vyrovnávací paměti z hardwarového grafického akcelerátoru ve formátu s pevným bodem . Nejprve jsou normalizovány na běžnější rozsah, který je [0, 1] nahrazením příslušné konverze do předchozího vzorce:

Zjednodušení:

Za druhé, výše uvedený vzorec je vynásoben kde d je hloubka z-bufferu (obvykle 16, 24 nebo 32 bitů) a zaokrouhlení výsledku na celé číslo:

Tento vzorec lze převrátit a odvodit, aby bylo možné vypočítat rozlišení z-bufferu (výše zmíněné „granularity“). Inverzní k výše uvedenému :

kde

Rozlišení z-bufferu, pokud jde o prostor kamery, by bylo přírůstkovou hodnotou vyplývající z nejmenší změny celého čísla uloženého v z-bufferu, což je +1 nebo -1. Toto rozlišení lze tedy vypočítat z derivace funkce jako :

Vyjádření zpět v termínech prostoru kamery, nahrazením výše uvedeným :

To ukazuje, že hodnoty jsou seskupeny mnohem hustěji v blízkosti roviny a mnohem řídčeji dále, což má za následek lepší přesnost blíže k fotoaparátu. Čím menší , tím menší přesnost je daleko - mít příliš blízko nastavenou rovinu je běžnou příčinou nežádoucích vykreslovacích artefaktů ve vzdálenějších objektech.

Implementovat Z-bufferu, hodnoty jsou lineárně interpolovány přes obrazovku prostoru mezi vrcholy současné polygonu , a tyto střední hodnoty jsou obvykle uloženy v z-bufferu v pevném bodě formátu.

W-buffer

Chcete-li implementovat w-buffer, staré hodnoty v prostoru kamery, nebo , jsou uloženy v bufferu, obvykle ve formátu s plovoucí desetinnou čárkou . Tyto hodnoty však nelze lineárně interpolovat napříč prostorem obrazovky z vrcholů - obvykle musí být invertovány , interpolovány a poté znovu invertovány. Výsledné hodnoty , na rozdíl od , jsou rozmístěny rovnoměrně mezi a . Existují implementace w-bufferu, které se inverzím zcela vyhýbají.

Zda z-buffer nebo w-buffer vyústí v lepší obraz, závisí na aplikaci.

Algoritmika

Následující pseudokód ukazuje proces ukládání do vyrovnávací paměti z:

// First of all, initialize the depth of each pixel.
d(i, j) = infinite // Max length

// Initialize the color value for each pixel to the background color
c(i, j) = background color

// For each polygon, do the following steps :
for (each pixel in polygon's projection)
{
    // Find depth i.e, z of polygon
    //   at (x, y) corresponding to pixel (i, j)   
    if (z < d(i, j))
    {
        d(i, j) = z;
        c(i, j) = color;
    }
}

Viz také

Reference

externí odkazy

Poznámky