Dela via


Visningsportar och urklipp (Direct3D 9)

Konceptuellt är en vyport en tvådimensionell rektangel (2D) där en 3D-scen projiceras. I Direct3D finns rektangeln som koordinater inom en Direct3D-yta som systemet använder som återgivningsmål. Projektionstransformeringen konverterar hörn till det koordinatsystem som används för visningsporten. En vyport används också för att ange intervallet med djupvärden på en återgivningsmålyta där en scen återges (vanligtvis 0,0 till 1,0).

Visningsfrustum

En visningsfrustum är 3D-volym i en scen som är placerad i förhållande till viewportens kamera. Volymens form påverkar hur modeller projiceras från kamerautrymme till skärmen. Den vanligaste typen av projektion, en perspektivprojektion, ansvarar för att få objekt nära kameran att se större ut än objekt i fjärran. För att se perspektiviskt kan visningsfrustum visualiseras som en pyramid, med kameran placerad vid spetsen, som visas i följande bild. Den här pyramiden korsas av ett främre och ett bakre klippplan. Volymen i pyramiden mellan fram- och bakklippsplan är visningsfrustumet. Objekt visas bara när de finns i den här volymen.

bild av en visningsfrustrum med en fram- och bakklippsplan

Om du tänker att du står i ett mörkt rum och tittar genom ett fyrkantigt fönster, visualiserar du en visningspyramid. I denna analogi är den närliggande klippplanen fönstret, och den bakre klippplanen är det som i slutändan avbryter din utsikt - skyskrapan tvärs över gatan, bergen i fjärran eller ingenting alls. Du kan se allt inuti den trunkerade pyramiden som börjar vid fönstret och slutar med det som avbryter din vy, och du kan inte se något annat.

Visningsvolymen definieras av synfältet (fov) samt av avstånden för de främre och bakre klippningsplanen, specificerade i z-koordinater, vilket visas i diagrammet nedan.

diagram över visnings frustum

I det här diagrammet är variabeln D avståndet från kameran till ursprunget för det utrymme som definierades i den sista delen av geometripipelinen – visningstransformeringen. Detta är det utrymme där du ordnar gränserna för din visningsvolym. Information om hur den här D-variabeln används för att skapa projektionsmatrisen finns i Projection Transform (Direct3D 9)

Viewport-rektangel

Du definierar rektangeln viewport i C++ med hjälp av D3DVIEWPORT9 struktur. Den D3DVIEWPORT9 strukturen används med följande metoder för visningsportmanipulering som exponeras av gränssnittet IDirect3DDevice9.

Den D3DVIEWPORT9 strukturen innehåller fyra medlemmar – X, Y, Bredd, Höjd – som definierar området för återgivningsmålytan som en scen ska återges i. Dessa värden motsvarar målrektangeln, eller rektangeln för visningsporten, som du ser i följande diagram.

diagram över visningsport-rektangeln

De värden som du anger för medlemmarna X, Y, Width och Height är skärmkoordinater i förhållande till det övre vänstra hörnet på render-målytan. Strukturen definierar ytterligare två medlemmar (MinZ och MaxZ) som anger de djupintervall som scenen ska återges i.

Direct3D förutsätter att viewport clipping-volymen varierar från -1.0 till 1.0 i X och från 1.0 till -1.0 i Y. Det här var de inställningar som användes oftast av program tidigare. Du kan justera bildförhållandet för visningsfönstret innan du klipper med projektionstransform.

Notis

MinZ och MaxZ anger de djupintervall i vilka scenen återges och används inte för urklipp. De flesta program ställer in dessa medlemmar på 0,0 och 1,0 för att systemet ska kunna rendera hela spannet av djupvärden i djupbufferten. I vissa fall kan du få specialeffekter med hjälp av andra djupintervall. Om du till exempel vill återge en heads-up-skärm i ett spel kan du ange båda värdena till 0,0 för att tvinga systemet att återge objekt i en scen i förgrunden, eller så kan du ställa in dem båda till 1,0 för att återge ett objekt som alltid ska finnas i bakgrunden.

 

De dimensioner som används i medlemmarna X, Y, Width och Height i den D3DVIEWPORT9 strukturen för en vyport definierar platsen och dimensionerna för visningsporten på återgivningsmålytan. Dessa värden finns i skärmkoordinater i förhållande till ytans övre vänstra hörn.

Direct3D använder visningsplats och dimensioner för att skala hörnen så att de passar en renderad scen till rätt plats på målytan. Internt infogar Direct3D dessa värden i följande matris som tillämpas på varje hörn.

ekvation för matrisen som tillämpas på varje hörn

Den här matrisen skalar hörn enligt viewport-dimensionerna och önskat djupintervall och översätter dem till rätt plats på återgivningsmålytan. Matrisen ändrar också y-koordinaten för att återspegla ett skärmursprung i det övre vänstra hörnet där y ökar nedåt. När den här matrisen har tillämpats är hörnen fortfarande homogena - dvs. de finns fortfarande som [x,y,z,w] hörn - och de måste konverteras till icke-homogena koordinater innan de skickas till rastratorn.

Anteckning

Viewport-skalningsmatrisen innehåller MinZ- och MaxZ-medlemmarna i D3DVIEWPORT9 struktur för att skala hörn för att passa djupintervallet [MinZ, MaxZ]. Detta representerar olika betydelser från tidigare versioner av DirectX, där dessa medlemmar användes för klippning.

 

Notera

Program anger vanligtvis MinZ respektive MaxZ till 0,0 respektive 1,0 för att systemet ska återges till hela djupintervallet. Du kan dock använda andra värden för att uppnå vissa effekter. Du kan till exempel ange båda värdena till 0.0 för att tvinga alla objekt till förgrunden, eller ange båda till 1.0 för att återge alla objekt i bakgrunden.

 

Rensa en visningsport

Om du rensar visningsporten återställs innehållet i viewport-rektangeln på återgivningsmålytan. Den kan också återställa rektangeln i djup- och stencilbuffertytorna.

Använd IDirect3DDevice9::Rensa för att rensa visningsporten. Metoden accepterar en eller flera rektanglar som definierar de områden på ytan som rensas. Om du anger parametern Count till 1 och parametern pRects till adressen för en enda rektangel som täcker hela visningsområdet rensas hela visningsporten. Ett annat sätt att rensa hela visningsporten är att ange parametern pRects till NULL- och parametern Count till 0.

IDirect3DDevice9::Clear kan användas för att rensa stencilbitar i en djupbuffert. Ange bara parametern Flags för att avgöra hur IDirect3DDevice9::Clear fungerar med återgivningsmålet och eventuella associerade djup- eller stencilbuffertar. Flaggan D3DCLEAR_TARGET rensar visningsporten med hjälp av en godtycklig RGBA-färg som du anger i argumentet Color (det här är inte materialfärgen). Flaggan D3DCLEAR_ZBUFFER rensar djupbufferten till ett godtyckligt djup som du anger i Z: 0.0 är det närmaste avståndet och 1,0 är längst. Flaggan D3DCLEAR_STENCIL återställer stencilbitarna till det värde som du anger i stencilargumentet. Du kan använda heltal som sträcker sig från 0 till 2n-1, där n är stencilbuffertbitdjupet.

I vissa situationer kanske du bara återger till små delar av återgivningsmålet och djupbuffertytorna. Med clear-metoderna kan du också rensa flera områden av dina ytor i ett enda anrop. Gör detta genom att ange parametern Count till det antal rektanglar som du vill rensa och ange adressen för den första rektangeln i en matris med rektanglar i parametern pRects.

Konfigurera visningsporten för urklipp

Resultatet av projektionsmatrisen bestämmer urklippsvolymen i projektrummet, uttryckt som:

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

Var: x, y, z och w representerar hörnkoordinaterna efter att projektionstransformeringen har tillämpats. Hörn som har en x-, y- eller z-komponent utanför dessa intervall klipps bort om urklipp är aktiverat (standardbeteendet).

Med undantag för vertex-buffertar aktiverar eller inaktiverar program klippning med hjälp av D3DRS_CLIPPING renderingstillstånd. Urklippsinformation för vertexbuffertar genereras under bearbetningen. Mer information finns i Fast funktionell hörnanbearbetning (Direct3D 9) och Programmerbar hörnabearbetning (Direct3D 9).

Direct3D klipper inte transformerade vertexer av en primitiv från en vertexbuffert om den inte kommer från IDirect3DDevice9::ProcessVertices. Om du gör dina egna transformeringar och behöver Direct3D för att göra urklippet bör du inte använda brytpunktsbuffertar. I det här fallet går programmet igenom data för att transformera dem. Direct3D passerar data en andra gång för att klippa ut dem och sedan renderar drivrutinen data, vilket är ineffektivt. Så, om programmet transformerar data, bör det också begränsa eller beskära datan.

När enheten tar emot förtransponerade och belysta hörn (T&L-hörn) som behöver klippas, justeras hörnen för att kunna utföra klippningsåtgärden genom att omvandlas tillbaka till klippningsutrymmet med hjälp av hörnens reciproka homogena w (RHW) och visningsportinformationen. Sedan utförs urklipp. Det är inte alla enheter som kan utföra denna back-transformering för att klippa T-&L-vertiser.

Funktionen D3DPMISCCAPS_CLIPTLVERTS hos enheten anger om den kan klippa T&L-hörn. Om den här funktionen inte har angetts ansvarar programmet för att klippa ut de T-&L-hörn som det avser att skicka ned till enheten som ska renderas. Enheten kan alltid urklippa T-&L-hörn i bearbetningsläget för programvaruhörn (oavsett om enheten skapas i bearbetningsläget för programvaruhörnet eller växlas till bearbetningsläget för programvaruhörn).

Det enda kravet för att konfigurera viewport-parametrarna för en återgivningsenhet är att ange visningsportens urklippsvolym. För att göra detta initierar och anger du urklippsvärden för urklippsvolymen och för återgivningsmålytan. Visningsportar är ofta konfigurerade för att återges till hela området på återgivningsmålytan, men det är inte ett krav.

Du kan använda följande inställningar för medlemmarna i D3DVIEWPORT9-strukturen för att uppnå detta i C++.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

När du har angett värden i D3DVIEWPORT9-strukturen tillämpar du viewport-parametrarna på enheten genom att anropa dess IDirect3DDevice9::SetViewport-metod. I följande kodexempel visas hur det här anropet kan se ut.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

Om anropet lyckas anges viewport-parametrarna och börjar gälla nästa gång en återgivningsmetod anropas. Om du vill göra ändringar i viewport-parametrarna uppdaterar du bara värdena i D3DVIEWPORT9-strukturen och anropar IDirect3DDevice9::SetViewport igen.

Not

De D3DVIEWPORT9 strukturmedlemmarna MinZ och MaxZ anger djupintervallen i vilka scenen kommer att renderas och används inte för klippning. De flesta program anger dessa medlemmar till 0.0 och 1.0 för att systemet ska kunna rendera med hela djupintervallet i djupbufferten. I vissa fall kan du få specialeffekter med hjälp av andra djupintervall. Om du till exempel vill återge en heads-up-skärm i ett spel kan du ange båda värdena till 0,0 för att tvinga systemet att återge objekt i en scen i förgrunden, eller så kan du ställa in dem båda till 1,0 för att återge ett objekt som alltid ska finnas i bakgrunden.

 

Komma igång