Megosztás a következőn keresztül:


Szolgáltatás összefoglalása (Direct3D 9 Windows Vista esetén)

Ez a dokumentáció kifejezetten a DirectX-ábrákHoz készült Windows Vista-bővítményekre vonatkozik. A Windows Vista DirectX hatóerejének fejlesztéséhez telepítenie kell a Windows Vista SDK-t és a DirectX SDK-t. A Windows Vista DirectX-et használó alkalmazásoknak WDDM-illesztőprogramot (Windows-eszközillesztő-modellt) használó hardvert kell használniuk, szemben az XPDM-sel (XP-illesztőprogram-modellel); A WDDM-et nem megvalósító illesztőprogramok nem tudják példányosítani a Windows Vista DirectX grafikus adaptereket.

Az alábbi szakaszokban megismerheti a Windows Vista új DirectX grafikus funkcióit:

Eszköz viselkedésének változásai

Az eszközök jelenleg csak két körülmény között vesznek el: ha a hardver újraindul, mert lefagyott, és amikor az eszközillesztő leáll. Ha a hardver lefagy, az eszköz alaphelyzetbe állítható ResetExhívásával. Ha a hardver lefagy, a textúra memóriája elveszik.

Az illesztőprogram leállítása után az IDirect9Ex objektumot újra létre kell hozni a renderelés folytatásához.

Ha a bemutatóterületet egy másik ablak eltakarja ablakos módban, vagy ha egy teljes képernyős alkalmazás kisebbre van állítva, a PresentEx S_D3DPRESENTATIONOCCLUDED értéket fog visszaadni. A teljes képernyős alkalmazások folytathatják a renderelést, amikor WM_ACTIVATEAPP visszahívási üzenetet kapnak.

A DirectX korábbi verzióiban, amikor egy alkalmazás módváltást tapasztalt, az egyetlen módja a helyreállításnak az volt, hogy alaphelyzetbe állítja az eszközt, és újra létrehozza az összes videomemória-erőforrást és felcseréli a láncokat. Most, hogy a Windows Vista DirectX-et használja, a visszaállítás módváltás után történő meghívása nem okozza a textúra memóriafelületeinek, anyagmintáinak és állapotadatainak elvesztését, és ezeket az erőforrásokat nem kell újra létrehozni.

Többszálú szoftveres csúcsfeldolgozás letiltása

Hozzáadtak egy új kapcsoló bitet (D3DCREATE_DISABLE_PSGP_THREADING), amely letiltja a többszálú feldolgozást a szoftveres csúcsfeldolgozáshoz (swvp). Ezzel a makróval létrehozhat egy viselkedésjelzőt az IDirect3D9::CreateDevice számára.

#define D3DCREATE_DISABLE_PSGP_THREADING

Egybites felületek

Létezik egy új, egybites felületformátumtípus, amely különösen hasznos lehet a szövegjelek feldolgozásához. Az új formátum neve D3DFMT_A1. Az egybites felületet úgy tervezték, hogy képpontonkénti textúraként, vagy a ComposeRects vagy a ColorFill által generált renderelési célkimenetként használják. Nincsenek külön kupakok a felület szélességéhez és magasságához; az implementációnak egy 2K texels x 8K texels méretű felületet kell támogatnia.

Egy egybites felület texelenként egy bittel rendelkezik; Ezért az egyik azt jelenti, hogy egy képpont összes összetevője (r,g,b,a) 1, a nulla pedig azt jelenti, hogy az összes összetevő egyenlő 0-tal. Az egybites felületeket a következő API-kkal használhatja: ColorFill, UpdateSurface és UpdateTexture.

Egybites felület beolvasása esetén a futtatókörnyezet pontmintát vagy konvolúciós szűrést hajthat végre. A konvolúciós szűrő állítható (lásd SetConvolutionMonoKernel).

Az egybites felületekre bizonyos korlátozások vonatkoznak:

  • A mip-leképezés nem támogatott
  • Az sRGB-adatok nem olvashatók és nem írhatók egybites felületre.
  • Az egybites felület nem használható csúcsmintázatként vagy többszörös mintavételezéshez.

Mélység- és sztencilpufferek olvasása

Használja az IDirect3DDevice9::UpdateSurface parancsot az IDirect3DDevice9::CreateDepthStencilSurface vagy IDirect3DDevice9::GetDepthStencilSurface felületről származó mélységi/rajzsablon-adatok olvasásához vagy írásához.

Először hozzon létre egy zárolható, csak mélységi vagy csak sablonfelületet az IDirect3DDevice9::CreateOffscreenPlainSurface segítségével. Használja az alábbi formátumok egyikét:

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

Másodszor, továbbítsa az adatokat a mélységi vagy rajzsablon pufferből az újonnan létrehozott zárolható mélységi vagy rajzsablon felületre. Az átvitel az IDirect3DDevice9::UpdateSurface használatával történik.

Az UpdateSurface sikertelen lesz, ha mindkét felület ZÁROLHATÓ formátumú, vagy mindkettő nem zárolható.

A nem létező adat átvitele hibát fog eredményezni (például, amikor zárolhatatlan, csak mélységi felületről D3DFMT_S8_LOCKABLE felületre történik az átvitel).

Az IDirect3DDevice9::UpdateSurface további korlátozásai továbbra is érvényesek.

Erőforrások megosztása

A Direct3D-erőforrások mostantól megoszthatóak az eszközök vagy folyamatok között. Ez minden Direct3D-erőforrásra vonatkozik, beleértve a textúrákat, csúcspuffereket, indexpuffereket vagy felületeket (például renderelési célokat, mélységi rajzsablonpuffereket vagy képernyőn kívüli egyszerű felületeket). A megosztáshoz ki kell jelölnie egy erőforrást a megosztáshoz a létrehozáskor, és meg kell keresnie az erőforrást az alapértelmezett készletben (D3DPOOL_DEFAULT). Miután létrehozott egy erőforrást a megosztáshoz, azt megoszthatja egy folyamat eszközei között, vagy megoszthatja a folyamatok között.

A megosztott erőforrások engedélyezéséhez az erőforrás-létrehozási API-k további leíróparaméterekkel rendelkeznek. Ez egy HANDLE, amely a megosztott erőforrásra mutat. A DirectX korábbi változataiban ez az argumentum az API-aláírás része volt, de nem volt használatban, és a NULLkell beállítani. A Windows Vista-tól kezdve használja a pSharedHandle-t a következő módokon:

  • Állítsa a mutatót (pSharedHandle) a NULL értékre, hogy ne ossza meg az erőforrást. Ez ugyanúgy működik, mint a DirectX a Windows Vista előtt.
  • Megosztott erőforrás létrehozásához hívjon meg minden erőforrás-létrehozási API-t (lásd alább) egy nem inicializált leíróval (maga a mutató nem NULL (pSharedHandle != NULL), de a mutató egy NULL értékre mutat (*pSharedHandle == NULL)). Az API létrehoz egy megosztott erőforrást, és érvényes leírót ad vissza.
  • Ha egy korábban létrehozott megosztott erőforrást nemNULL megosztott erőforrás-leíróval szeretne megnyitni és elérni, állítsa a pSharedHandle értéket a leíró címére. Miután ilyen módon megnyitotta a korábban létrehozott megosztott erőforrást, használhatja a visszaadott felületet a Direct3D 9 vagy a Direct3D 9Ex API-ban, mintha az interfész egy ilyen típusú tipikus erőforrás volna.

Erőforrás-létrehozási API-k: - CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExés CreateRenderTargetEx.

A megosztott erőforrások használatára bizonyos korlátozások vonatkoznak. Ezek a következők:

  • A megosztott erőforrás megnyitásához használt API-nak meg kell egyeznie a megosztott erőforrás létrehozásához használt API-val. Ha például CreateTexture használt megosztott erőforrás létrehozásához, a megosztott erőforrás megnyitásához CreateTexture kell használnia; ha CreateRenderTarget használt megosztott erőforrás létrehozásához, a megosztott erőforrás megnyitásához CreateRenderTarget kell használnia; és így tovább.
  • Megosztott erőforrás megnyitásakor meg kell adnia D3DPOOL_DEFAULT.
  • A zárolható erőforrások (például D3DUSAGE_DYNAMIC textúrák, csúcspontpufferek és indexpufferek) teljesítménye csekély lehet, ha megosztásra kerülnek. A zárolható rendertargetek nem lesznek megosztva bizonyos hardvereken.
  • A többfolyamatos megosztott erőforrásra mutató hivatkozásoknak azonos dimenziókkal kell rendelkezniük, mint az eredeti erőforrásnak. Ha egy fogantyút átad folyamatokon keresztül, tartalmazza a dimenzióadatokat, hogy a hivatkozás azonos módon hozható létre.
  • A megosztott folyamatközi felületek nem biztosítanak szinkronizálási mechanizmust. Előfordulhat, hogy a megosztott felületen végzett olvasási/írási módosítások nem tükrözik a hivatkozási folyamatnak a felületre vonatkozó nézetét, amikor az várható. A szinkronizáció biztosításához használjon eseménylekérdezéseket, vagy zárolja a textúrát.
  • Csak a megosztott erőforrást eredetileg létrehozó folyamat zárolhatja azt (a megosztott erőforrásra mutató hivatkozást megnyitó bármely folyamat nem tudja zárolni).
  • Ha egy megosztott erőforrás zárolva van, más folyamatok nem ellenőrzik, hogy elérhető-e az erőforrás.

sRGB-átalakítás keverés előtt

Most ellenőrizheti, hogy az eszköz képes-e a folyamatadatokat sRGB-ra konvertálni a keretpufferek keverése előtt. Ez azt jelenti, hogy az eszköz átalakítja a renderelési célértékeket sRGB-ről. Ha ellenőrizni szeretné, hogy a hardver támogatja-e az átalakítást, ellenőrizze ezt a korlátot:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Ez a korlát azonosítja azokat a hardvereket, amelyek támogatják az sRGB-ra való átalakítást a keverés előtt. Ez a képesség fontos az asztali ablakkezelőben (DWM) található fp16-os keretpufferek kiváló minőségű renderelése szempontjából.

A StretchRect fejlesztései

A DirectX korábbi verzióiban a StretchRect számos korlátozással rendelkezik a különböző illesztőprogramok elhelyezésére (lásd: IDirect3DDevice9::StretchRect). A Windows Vista a Windows-eszközillesztő-modellre (WDDM) épül. Ez az új illesztőprogram-modell sokkal robusztusabb, és lehetővé teszi, hogy az illesztőprogramok speciális eseteket kezeljenek a hardverben.

Általában az egyetlen fennmaradó korlátozás az, hogy a renderelési célnak render-cél használatával kell létrejönnie (D3DUSAGE_RENDERTARGET). Ez a korlátozás megszűnik, ha egyszerű másolatot készít (ahol a forrás és a dest formátuma azonos, azonos méretű, és nincsenek al téglalapok).

Textúra létrehozása a rendszermemóriában

Azok az alkalmazások, amelyek nagyobb rugalmasságot igényelnek a rendszermemória használata, lefoglalása és törlése során, mostantól a rendszermemória mutatóiból is létrehozhatnak textúrákat. Egy alkalmazás például létrehozhat egy Direct3D-textúrát egy GDI rendszermemória bitképmutatójából.

Két dolgot kell tennie egy ilyen textúra létrehozásához:

  • Foglaljon le elegendő rendszermemóriát a textúra felületének tárolásához. A bájtok minimális száma a szélesség szorozva a magassággal szorozva a bájt/képpont értékkel.
  • Adja át egy mutató címét a HANDLE* paraméter rendszermemória-felületére az IDirect3DDevice9::CreateTexture paraméternek.

Itt található az IDirect3DDevice9 függvény prototípusa::CreateTexture:

STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, 
    DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, 
    HANDLE* pSharedHandle)

A rendszermemória-textúrákra a következő korlátozások vonatkoznak:

  • A textúra pitchnek meg kell egyeznie a textúra szélessége és a képpontonkénti bájtok száma szorzatával.
  • Tömörített formátumok (DXT-formátumok) használatakor az alkalmazás felelős a megfelelő méret kiosztásáért.
  • Csak az egyetlen mipmap-szintű textúrák támogatottak.
  • A Pool argumentum értékének a CreateTexture számára D3DPOOL_SYSTEMMEM-nek kell lennie.
  • Ez az API egy anyagmintában burkolja a megadott memóriát. Ne szabadítsa fel ezt a memóriát, amíg nem végzett vele.