Pont sprites (Direct3D 9)
A Direct3D 9 pont sprites támogatása lehetővé teszi a pontok (részecskerendszerek) nagy teljesítményű renderelését. A pont sprites olyan általános pontok általánosítása, amelyek lehetővé teszik, hogy tetszőleges alakzatok renderelhetők legyenek a textúrák által meghatározott módon.
Pontprimitív renderelési vezérlők
A Direct3D 9 további paramétereket támogat a pont spritesek (pontprimitívek) megjelenítésének szabályozásához. Ezek a paraméterek lehetővé teszik, hogy a pontok változó méretűek legyenek, és teljes mintázattérképet alkalmazzanak. Az egyes pontok méretét az alkalmazás által megadott méret és a Direct3D által kiszámított távolságalapú függvény határozza meg. Az alkalmazás megadhat pontméretet csúcsonként vagy a csúcsonkénti méret nélküli pontokra vonatkozó D3DRS_POINTSIZE beállításával. A pontméret a kameratéregységekben van kifejezve, kivéve, ha az alkalmazás átmegy az átalakított rugalmas csúcsformátumú (FVF) csúcspontokon. Ebben az esetben a rendszer nem alkalmazza a távolságalapú függvényt, és a pontméretet képpont mértékegységben fejezi ki a renderelési célon.
A leképezési pontokban kiszámított és használt anyagminta-koordináták a D3DRS_POINTSPRITEENABLE beállításától függenek. Ha ez az érték a TRUE értékre van állítva, a textúrák koordinátái úgy vannak beállítva, hogy minden pont a teljes textúrát jelentesse meg. Ez általában csak akkor hasznos, ha a pontok jelentősen nagyobbak egy képpontnál. Ha D3DRS_POINTSPRITEENABLE a HAMIS van beállítva, a rendszer az egyes pontok csúcsmintázat-koordinátáit használja a teljes ponthoz.
Pontméret számításai
A pontméretet D3DRS_POINTSCALEENABLE határozza meg. Ha ez az érték a HAMIS van beállítva, akkor az alkalmazás által megadott pontméret lesz a képernyőtér (az átalakítás utáni) méret. A képernyőtérben a Direct3D-nek átadott csúcspontok nem rendelkeznek kiszámított pontméretekkel; a megadott pontméretet a rendszer képernyőtérméretként értelmezi.
Ha D3DRS_POINTSCALEENABLE igaz , a Direct3D az alábbi képlet alapján számítja ki a képernyőtérpont méretét. Az alkalmazás által megadott pontméret a kameratéregységekben van kifejezve.
S s = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² )))
Ebben a képletben az S ibemeneti pont mérete csúcsonként vagy a D3DRS_POINTSIZE renderelési állapot értéke. A pontskálázási tényezőket, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B és D3DRS_POINTSCALE_C az A, B és C pontok jelölik. A nézetport magassága (V h) a D3DVIEWPORT9 szerkezet magassági tagja, amely a nézetportot jelöli. D ₑ, a szem és a pozíció közötti távolság (a szem a forrásnál) a pont szemtérállásának (Xₑ, Yₑ, Zₑ) figyelembevételével és a következő művelet végrehajtásával számítható ki.
D ₑ = négyzetláb (Xₑ² + Y ₑ² + Z ₑ²)
A maximális pontméretet (Pmₐₓ) a D3DCAPS9 struktúra MaxPointSize tagjának vagy a D3DRS_POINTSIZE_MAX renderelési állapotának kisebb értékével kell meghatározni. A minimális pontméret (Pminimális) a D3DRS_POINTSIZE_MIN értékének lekérdezésével határozható meg. Így a végső képernyő-tér pont mérete, S, a következő módon határozható meg.
- Ha Ss > Pmₐₓ, akkor S = P mₐₓ
- ha S < Pminimális, akkor S = P perc
- Ellenkező esetben S = S s
Pontmegjelenítés
Az S képernyőtérméretű P = ( X, Y, Z, W) képernyőtérpont a következő négy csúcs négyszögeként van raszterizálva.
(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))
A csúcsszínattribútumok minden csúcson duplikálva lesznek; így minden pont mindig állandó színekkel jelenik meg.
A textúraindexek hozzárendelését a D3DRS_POINTSPRITEENABLE renderelési állapotbeállítás szabályozza. Ha D3DRS_POINTSPRITEENABLE a HAMIS van beállítva, akkor a csúcsok textúrájának koordinátái minden csúcson duplikálva lesznek. Ha D3DRS_POINTSPRITEENABLE igaz értékre van állítva, akkor a négy csúcspont mintázatkoordinátái a következő értékekre vannak beállítva.
(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)
Ez az alábbi ábrán látható.
Ha engedélyezve van a kivágás, a pontok a következő módon lesznek kivágva. Ha a csúcs meghaladja a mélységi értékek tartományát – a D3DVIEWPORT9 szerkezet MinZ és MaxZ értékét –, amelybe egy jelenetet kell megjeleníteni, a pont a nézet frustumán kívül létezik, és nem renderelhető. Ha a pont a pont méretét figyelembe véve teljesen kívül esik az X és az Y nézeten, akkor a pont nem jelenik meg; a fennmaradó pontok megjelennek. Lehetséges, hogy a pont pozíciója kívül esik az X vagy Y nézetablakon, és továbbra is részlegesen látható.
Előfordulhat, hogy a pontokat a felhasználó által definiált vágósíkokra vágják vagy nem megfelelően vágják ki. Ha D3DPMISCCAPS_CLIPPLANESCALEDPOINTS nincs beállítva a D3DCAPS9 struktúra PrimitiveMiscCaps-tagjában, a pontokat a rendszer csak a csúcspont pozíciója alapján vágja ki a felhasználó által definiált vágósíkokra, figyelmen kívül hagyva a pontméretet. Ebben az esetben a skálázott pontok teljes mértékben renderelhetők, ha a csúcspont pozíciója a vágósíkokon belül van, és el lesz vetve, ha a csúcspont pozíciója a vágósíkon kívül esik. Az alkalmazások úgy akadályozhatják meg a lehetséges összetevőket, hogy szegélygeometriát ad hozzá a vágósíkokhoz, amelyek a maximális pontmérethez hasonlóan nagyok.
Ha a D3DPMISCCAPS_CLIPPLANESCALEDPOINTS bit be van állítva, a skálázott pontok megfelelően lesznek kivágva a felhasználó által meghatározott vágósíkokra.
A hardver csúcspontjainak feldolgozása támogathatja vagy nem támogatja a pontméretet. Ha például egy olyan eszköz jön létre D3DCREATE_HARDWARE_VERTEXPROCESSING egy hardveres absztrakciós rétegbeli (HAL) eszközön (D3DDEVTYPE_HAL), amelyen a D3DCAPS9 struktúra MaxPointSize tagjának értéke 1,0 vagy 0,0, akkor minden pont egyetlen képpont. Az 1,0-nál kisebb képpontpontos sprites megjelenítéséhez FVF TL (átalakított és megvilágított) csúcsokat vagy szoftveres csúcsfeldolgozást (D3DCREATE_SOFTWARE_VERTEXPROCESSING) kell használnia, amely esetben a Direct3D futási ideje emulálja a pont sprite renderelését.
A csúcspontok feldolgozását végző és a pont spriteseket támogató hardvereszköz – a MaxPointSize 1,0f-nál nagyobb értékre – a nem transzformált sprites méretszámításának elvégzéséhez szükséges, és a csúcsonkénti vagy D3DRS_POINTSIZED3DRS_POINTSIZE TL-csúcsok megfelelő beállításához szükséges.
A pontok, vonalak és háromszögek megjelenítési szabályairól a Raszterizálási szabályok (Direct3D 9)című témakörben olvashat.
Kapcsolódó témakörök