Nézetportok és kivágások (Direct3D 9)
Fogalmilag, a nézetport egy kétdimenziós (2D) téglalap, amelybe egy 3D jelenetet vetítenek. A Direct3D-ben a téglalap koordinátákként létezik egy Direct3D-felületen belül, amelyet a rendszer renderelési célként használ. A kivetítés átalakítása a csúcsokat a nézetporthoz használt koordinátarendszerzé alakítja. A nézetport arra is használható, hogy meghatározza a mélységértékek tartományát egy renderelési célfelületen, amelybe egy jelenetet renderelnek (általában 0,0 és 1,0 között).
A megtekintési frustum
A megtekintési frustum egy 3D térfogat a jelenetben, amely a nézetablak kamerájához viszonyítva helyezkedik el. A térfogat alakja befolyásolja a modellek kivetítését a kamera nézőpontjából a képernyőre. A leggyakoribb vetítési típus, a perspektivikus kivetítés felelős azért, hogy a kamera közelében lévő objektumok nagyobbnak tűnnek, mint a távolságban lévő objektumok. A perspektíva-megtekintéshez a megtekintési frustum piramisként jeleníthető meg, a kamera pedig a csúcson helyezkedik el az alábbi ábrán látható módon. Ezt a piramist egy elülső és egy hátsó vágósík metszi. Az első és hátsó vágósíkok közötti piramison belüli térfogat a megtekintési csonkagúla. Az objektumok csak akkor láthatók, ha ebben a kötetben vannak.
Ha azt képzeli, hogy egy sötét szobában áll, és egy négyzetes ablakon néz át, akkor egy megtekintési frustumot vizualizál. Ebben az analógiában a közeli vágósík az ablak, és a hátsó vágósík az, ami végül megszakítja a kilátást - az utca túloldalán lévő felhőkarcoló, a távoli hegyek, vagy akár semmi. Mindent láthat a csonkolt piramisban, amely az ablakban kezdődik, és azzal végződik, ami megszakítja a nézetet, és semmi mást nem láthat.
A megtekintési frustumot az fov (látómező) és a z koordinátákban megadott elülső és hátsó vágósíkok távolsága határozza meg, ahogyan az az alábbi ábrán látható.
Ebben a diagramban a D változó a kamera távolsága a geometriai folyamat utolsó részében definiált tér forrásától – a megtekintési átalakítástól. Ez az a tér, amely körül rendezi a korlátokat a megtekintés frustum. Információt arról, hogyan használják ezt a D változót a vetítési mátrix megalkotásához, a Projection Transform (Direct3D 9) dokumentumban talál.
Nézetablak téglalap
A nézetport téglalapját a C++ fájlban a D3DVIEWPORT9 struktúrával határozhatja meg. A D3DVIEWPORT9 struktúrát az alábbi, az IDirect3DDevice9 interfész által közzétett nézetkezelési módszerek használják.
A D3DVIEWPORT9 szerkezet négy tagot tartalmaz ( X, Y, Width, Height ), amelyek meghatározzák annak a renderelési célfelületnek a területét, amelybe a jelenetet renderelni fogják. Ezek az értékek a cél téglalapnak vagy a nézetport téglalapjának felelnek meg, ahogyan az az alábbi ábrán látható.
Az X, Y, Width, Height tagokhoz megadott értékek a renderelési célfelület bal felső sarkához viszonyított képernyőkoordináták. A struktúra két további tagot (MinZ és MaxZ) határoz meg, amelyek azt jelzik, hogy milyen mélységtartományokban jelenik meg a jelenet.
A Direct3D feltételezi, hogy a nézetport kivágási kötete X-ben -1,0 és 1,0 között, Y-ban pedig 1,0 és -1,0 között mozog. Ezeket a beállításokat használták leggyakrabban az alkalmazások a múltban. A kivágás előtt módosíthatja a nézőpont méretarányát a vetítési transzformációsegítségével.
Jegyzet
A MinZ és a MaxZ jelzi azokat a mélységi tartományokat, amelyekbe a jelenetet renderelni fogják, és nem használhatók a kivágáshoz. A legtöbb alkalmazás ezeket a tagokat 0.0-ra és 1.0-ra állítja, hogy a rendszer a mélységi pufferben lévő teljes mélységi értéktartományra renderelhessen. Bizonyos esetekben speciális hatásokat érhet el más mélységi tartományok használatával. Ha például egy játékban felfelé irányuló megjelenítést szeretne megjeleníteni, mindkét értéket 0,0 értékre állíthatja, hogy kényszerítse a rendszert arra, hogy az előtérben lévő jelenet objektumait renderelje, vagy beállíthatja mindkettőt 1.0-ra egy olyan objektum megjelenítéséhez, amelyeknek mindig a háttérben kell lenniük.
A nézetport X, Y, Width, Height D3DVIEWPORT9 tagjaiban használt dimenziók határozzák meg a nézetport helyét és méreteit a renderelési célfelületen. Ezek az értékek a képernyő koordinátáiban vannak a felület bal felső sarkához viszonyítva.
A Direct3D a nézetport helyét és méreteit használja a csúcspontok skálázásához, hogy a renderelt jelenet a célfelület megfelelő helyére illeszkedjen. A Direct3D belsőleg beszúrja ezeket az értékeket a következő mátrixba, amely az egyes csúcsokra lesz alkalmazva.
Ez a mátrix a nézetport méretei és a kívánt mélységtartomány szerint skálázza a csúcsokat, és lefordítja őket a renderelési célfelület megfelelő helyére. A mátrix az y koordinátát is megfordítja, hogy tükrözze a képernyő eredetét a bal felső sarokban, és az y lefelé növekszik. A mátrix alkalmazása után a csúcsok továbbra is homogének – vagyis [x,y,z,w] csúcsokként léteznek –, és nem homogén koordinátákká kell konvertálni őket, mielőtt elküldené őket a raszterizátornak.
Jegyzet
A nézetport skálázási mátrixa magában foglalja a D3DVIEWPORT9 szerkezet MinZ és MaxZ tagjait a csúcspontok méretezéséhez a mélységi tartománynak megfelelően [MinZ, MaxZ]. Ez eltérő szemantikát jelöl a DirectX korábbi kiadásaihoz képest, amelyekben ezeket az elemeket kivágásra használták.
Jegyzet
Az alkalmazások általában a MinZ és a MaxZ értékét 0,0-ra, illetve 1.0-ra állítják be, így a rendszer a teljes mélységi tartományra renderel. Más értékekkel azonban bizonyos hatásokat érhet el. Beállíthatja például mindkét értéket 0,0 értékre, hogy az összes objektumot az előtérbe kényszerítse, vagy állítsa mindkettőt 1,0 értékre az összes objektum háttérbe való megjelenítéséhez.
Nézetport törlése
A nézetport törlése alaphelyzetbe állítja a nézetport téglalapjának tartalmát a renderelési célfelületen. A téglalapot a mélységben és a stencil pufferfelületeken is törölheti.
Használja IDirect3DDevice9::Clear a nézetport törléséhez. A metódus egy vagy több téglalapot fogad el, amelyek meghatározzák a megtisztított felület területeit. Ha a Count paramétert 1 értékre állítja, és a pRects paramétert egyetlen olyan téglalap címére állítja, amely lefedi a teljes nézetablak területét, a teljes nézetablak törlődik. A teljes nézetport törlésének másik módja, ha a pRects paramétert NULL értékre, a Count paramétert pedig 0 értékre állítja.
Az IDirect3DDevice9::Clear használható a rajzsablon bitjeinek törléséhez egy mélységi pufferben. Egyszerűen állítsa be a Flags paramétert annak meghatározásához, hogy a IDirect3DDevice9::Clear hogyan működik a renderelési céllal és bármely kapcsolódó mélység- vagy stencilpufferrel. A D3DCLEAR_TARGET jelző a nézetportot a Szín argumentumban megadott tetszőleges RGBA-színnel törli (ez nem az anyag színe). A D3DCLEAR_ZBUFFER jelző a Z-ben megadott tetszőleges mélységre törli a mélységi puffert: a legközelebbi távolság a 0,0, az 1,0 pedig a legtávolabbi. A D3DCLEAR_STENCIL jelző visszaállítja a rajzsablon bitjeinek értékét a Rajzsablon argumentumban megadott értékre. Használhat 0 és 2n-1 közötti egész számokat, ahol n a rajzsablon pufferbitmélysége.
Bizonyos helyzetekben előfordulhat, hogy csak a renderelési cél és a mélységi pufferfelületek kis részére renderel. A tiszta módszerek lehetővé teszik a felületek több területének egyetlen hívásban való törlését is. Ehhez állítsa a Count paramétert a törölni kívánt téglalapok számára, és adja meg az első téglalap címét a pRects paraméterben lévő téglalapok tömbjében.
A nézetport beállítása a kivágáshoz
A vetítési mátrix eredményei meghatározzák a kivágási térfogatot a vetítési térben a következőképpen:
-wc<= xc<= wc
-wc<= yc<= wc
0 <= zc<= wc
Ahol: x, y, z és w a csúcspont koordinátáit jelöli a vetítés transzformációjának alkalmazása után. Bármely csúcspont, amelynek x-, y- vagy z-összetevője ezen tartományokon kívül esik, ki lesz vágva, ha engedélyezve van a kivágás (ez az alapértelmezett viselkedés).
A csúcspontpufferek kivételével az alkalmazások engedélyezik vagy letiltják a kivágást a D3DRS_CLIPPING renderelési állapottal. A csúcspontpufferek kivágási adatai a feldolgozás során jönnek létre. További információ: Rögzített függvény csúcsának feldolgozása (Direct3D 9) és Programozható csúcspontfeldolgozás (Direct3D 9).
A Direct3D nem vágja ki a csúcspufferből származó primitív átalakított csúcsait, amennyiben nem erre vonatkozik IDirect3DDevice9::ProcessVertices. Ha saját átalakításokat végez, és a kivágásához Direct3D-ra van szüksége, ne használjon csúcspontpuffereket. Ebben az esetben az alkalmazás bejárja az adatokat, hogy átalakítsa azokat. A Direct3D másodszor is bejárja az adatokat, hogy kivágja azokat, majd az illesztőprogram megjeleníti az adatokat, ami nem hatékony. Tehát, ha az alkalmazás átalakítja az adatokat, akkor azokat is le kell vágnia.
Amikor az eszköz előre átalakított és megvilágított csúcsokat (T&L csúcsokat) kap, amelyeket ki kell vágni, a kivágási művelet végrehajtásához a csúcsokat visszaalakítják a kivágási térbe, a csúcsok reciprok homogén w (RHW) és a nézetport adatainak felhasználásával. Ezután vágás történik. Nem minden eszköz képes elvégezni ezt a visszaátalakítást a T&L csúcsok kivágásához.
A D3DPMISCCAPS_CLIPTLVERTS eszközképesség azt jelzi, hogy az eszköz képes-e kivágni a T&L csúcsokat. Ha ez a képesség nincs beállítva, az alkalmazás felelős a T&L csúcsok kivágásáért, amelyeket le szeretne küldeni a renderelni kívánt eszközre. Az eszköz mindig képes a T&L csúcsok kivágására szoftveres csúcsfeldolgozási módban (függetlenül attól, hogy az eszköz szoftveres csúcspont-feldolgozási módban van-e létrehozva, vagy a szoftver csúcspont feldolgozási módjára vált).
A renderelő eszköz nézetablak-paramétereinek konfigurálásának egyetlen követelménye a nézetablak kivágási tartományának beállítása. Ehhez inicializálja és beállítja a vágótérfogat és a renderelési célfelület kivágási értékeit. A nézetportok általában úgy vannak beállítva, hogy a renderelési célfelület teljes területére rendereljenek, de ez nem követelmény.
A következő beállításokat használhatja a D3DVIEWPORT9-struktúra tagjai számára, hogy ezt a C++-ban érje el.
D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };
Miután beállította a D3DVIEWPORT9 struktúrában lévő értékeket, alkalmazza a nézetport paramétereit az eszközre a IDirect3DDevice9::SetViewport metódus meghívásával. Az alábbi példakód bemutatja, hogyan nézhet ki ez a hívás.
HRESULT hr;
hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
return hr;
Ha a hívás sikeres, a nézetport paraméterei be vannak állítva, és a következő renderelési módszer meghívásakor érvénybe lépnek. A nézetport paramétereinek módosításához frissítse a D3DVIEWPORT9 struktúrában lévő értékeket, és hívja meg újra IDirect3DDevice9::SetViewport.
Jegyzet
A D3DVIEWPORT9 struktúra MinZ és MaxZ tagjai azt a mélységtartományt jelzik, amelybe a jelenet kerül renderelésre, és nem használják a kivágáshoz. A legtöbb alkalmazás ezeket a tagokat 0.0-ra és 1.0-ra állítja, hogy a rendszer a mélységi puffer teljes mélységi értékeire renderelhessen. Bizonyos esetekben speciális hatásokat érhet el más mélységi tartományok használatával. Ha például egy játékban felfelé irányuló megjelenítést szeretne megjeleníteni, mindkét értéket 0,0 értékre állíthatja, hogy kényszerítse a rendszert arra, hogy az előtérben lévő jelenet objektumait renderelje, vagy beállíthatja mindkettőt 1.0-ra egy olyan objektum megjelenítéséhez, amelyeknek mindig a háttérben kell lenniük.
Kapcsolódó témakörök