Delen via


Viewports en Clipping (Direct3D 9)

Conceptueel gezien is een viewport een tweedimensionale rechthoek (2D) waarin een 3D-scène wordt geprojecteerd. In Direct3D bestaat de rechthoek als coördinaten binnen een Direct3D-oppervlak dat het systeem gebruikt als renderingdoel. De projectietransformatie converteert hoekpunten naar het coördinatensysteem dat wordt gebruikt voor de viewport. Een viewport wordt ook gebruikt om het bereik van dieptewaarden op een weergavedoeloppervlak op te geven waarin een scène wordt weergegeven (meestal 0,0 tot 1.0).

Het bekijken Van Frustum

Een weergavefrustum is een 3D-volume in een scène dat geplaatst is ten opzichte van de camera van de viewport. De vorm van het volume is van invloed op de wijze waarop modellen worden geprojecteerd van de cameraruimte naar het scherm. Het meest voorkomende type projectie, een perspectiefprojectie, is verantwoordelijk voor het maken van objecten in de buurt van de camera groter dan objecten in de afstand. Voor perspectiefzicht kan het weergavefrustum worden gevisualiseerd als een piramide, waarbij de camera op de punt wordt geplaatst, zoals in de volgende afbeelding is te zien. Deze piramide wordt gekruist door een voor- en achterste knipvlak. Het volume binnen in de piramide tussen de voor- en achterknipvlakken is de kijkpiramide. Objecten zijn alleen zichtbaar wanneer ze zich in dit volume bevinden.

illustratie van een weergavefrustum met een voor- en achterafsnijdingsvlak

Als u zich voorstelt dat u zich in een donkere kamer bevindt en door een vierkant raam kijkt, visualiseert u een weergavefrustum. In deze analogie is het vlak bij het weergavevlak het raam en het achterweergavevlak is wat je uitzicht uiteindelijk onderbreekt - de wolkenkrabber aan de overkant van de straat, de bergen in de verte, of helemaal niets. U kunt alles zien in de afgekapte piramide die begint bij het venster en eindigt met wat uw uitzicht onderbreekt en u kunt niets anders zien.

De weergave frustum wordt gedefinieerd door fov (weergaveveld) en door de afstanden van de voor- en achteropnamevlakken, opgegeven in z-coördinaten, zoals wordt weergegeven in het volgende diagram.

diagram van de zicht piramide

In dit diagram is de variabele D de afstand van de camera tot de oorsprong van de ruimte die is gedefinieerd in het laatste deel van de geometriepijplijn- de weergavetransformatie. Dit is de ruimte waarin u de grenzen van uw kijkfrustum bepaalt. Zie de Projectietransformatie (Direct3D 9) voor informatie over hoe deze D-variabele wordt gebruikt om de projectiematrix te bouwen

Viewport-rechthoek

U definieert de viewport-rechthoek in C++ met behulp van de D3DVIEWPORT9 structuur. De D3DVIEWPORT9 structuur wordt gebruikt met de volgende viewport manipulatiemethoden die beschikbaar worden gemaakt door de interface IDirect3DDevice9.

De D3DVIEWPORT9 structuur bevat vier leden - X, Y, Breedte, Hoogte - waarmee het gebied van het render-doeloppervlak wordt gedefinieerd waarin een scène wordt weergegeven. Deze waarden komen overeen met de doelrechthoek of de viewport-rechthoek, zoals wordt weergegeven in het volgende diagram.

diagram van de viewportrechthoek

De waarden die u opgeeft voor de leden X, Y, Breedte, Hoogte zijn schermcoördinaten ten opzichte van de linkerbovenhoek van het render-doeloppervlak. De structuur definieert twee extra leden (MinZ en MaxZ) die de dieptebereiken aangeven waarin de scène wordt weergegeven.

Direct3D gaat ervan uit dat het volume van de viewport-clipping varieert van -1.0 tot 1.0 in X en van 1.0 tot -1.0 in Y. Dit waren de instellingen die het vaakst door toepassingen in het verleden werden gebruikt. U kunt de beeldverhouding van de viewport aanpassen voordat u de projectietransformatie toepast.

Notitie

MinZ en MaxZ geven de dieptebereiken aan waarin de scène wordt weergegeven en worden niet gebruikt voor het knippen. De meeste toepassingen stellen deze leden in op 0.0 en 1.0 om het systeem in staat te stellen om het volledige bereik van dieptewaarden in de dieptebuffer weer te geven. In sommige gevallen kunt u speciale effecten bereiken met behulp van andere dieptebereiken. Als u bijvoorbeeld een hoofdweergave in een game wilt weergeven, kunt u beide waarden instellen op 0,0 om af te dwingen dat het systeem objecten in een scène op de voorgrond weergeeft, of u kunt beide instellen op 1.0 om een object weer te geven dat altijd op de achtergrond moet staan.

 

De afmetingen die worden gebruikt in de leden X, Y, Breedte, Hoogte van de D3DVIEWPORT9-structuur voor een viewport definiëren de locatie en afmetingen van de viewport op het render-doeloppervlak. Deze waarden bevinden zich in schermcoördinaten ten opzichte van de linkerbovenhoek van het oppervlak.

Direct3D maakt gebruik van de viewportlocatie en dimensies om de hoekpunten te schalen om een gerenderde scène in de juiste locatie op het doeloppervlak te plaatsen. Direct3D voegt deze waarden intern in de volgende matrix in die op elk hoekpunt wordt toegepast.

vergelijking van de matrix die wordt toegepast op elk hoekpunt

Deze matrix schaalt hoekpunten op basis van de viewportdimensies en het gewenste dieptebereik en vertaalt deze naar de juiste locatie op het render-doeloppervlak. Ook spiegelt de matrix de y-coördinaat om een schermbeginpunt linksboven weer te geven, waarbij y naar beneden toeneemt. Nadat deze matrix is toegepast, zijn hoekpunten nog steeds homogeen - dat wil gezegd, ze bestaan nog steeds als [x,y,z,w] hoekpunten - en moeten ze worden geconverteerd naar niet-homogene coördinaten voordat ze naar de rasterizer worden verzonden.

Notitie

De viewport-schaalmatrix bevat de MinZ- en MaxZ-leden van de D3DVIEWPORT9 structuur om hoekpunten te schalen zodat deze passen bij het dieptebereik [MinZ, MaxZ]. Dit vertegenwoordigt andere semantiek dan in eerdere versies van DirectX, waarin deze leden zijn gebruikt voor het clippen.

 

Notitie

Toepassingen stellen MinZ en MaxZ doorgaans in op respectievelijk 0,0 en 1,0 om ervoor te zorgen dat het systeem wordt weergegeven in het volledige dieptebereik. U kunt echter andere waarden gebruiken om bepaalde gevolgen te bereiken. U kunt bijvoorbeeld beide waarden instellen op 0,0 om alle objecten op de voorgrond te dwingen of beide in te stellen op 1.0 om alle objecten op de achtergrond weer te geven.

 

Een Viewport wissen

Het wissen van de viewport reset de inhoud van de viewportrechthoek op het weergavedoeloppervlak. Het kan ook de rechthoek wissen op de diepte- en stencilbufferoppervlakken.

Gebruik IDirect3DDevice9::Clear om de viewport te wissen. De methode accepteert een of meer rechthoeken die de gebieden op het oppervlak definiëren die worden gewist. Als u de parameter Count instelt op 1 en de parameter pRects op het adres van één rechthoek die het hele viewportgebied bedekt, wordt de volledige viewport gewist. Een andere manier om de hele viewport te wissen, is door de parameter pRects in te stellen op -NUL- en de parameter Aantal op 0.

De IDirect3DDevice9::Clear kan worden gebruikt voor het wissen van stencil-bits binnen een dieptebuffer. Stel de parameter Vlaggen in om te bepalen hoe IDirect3DDevice9::Clear werkt met het renderdoel en eventuele bijbehorende diepte- of stencilbuffers. Met de vlag D3DCLEAR_TARGET wordt de viewport gewist met behulp van een willekeurige RGBA-kleur die u opgeeft in het argument Kleur (dit is niet de materiaalkleur). Met de vlag D3DCLEAR_ZBUFFER wordt de dieptebuffer gewist naar een willekeurige diepte die u in Z opgeeft: 0,0 is de dichtstbijzijnde afstand en 1,0 is het meest ver. Met de vlag D3DCLEAR_STENCIL worden de stencil-bits opnieuw ingesteld op de waarde die u opgeeft in het argument Stencil. U kunt gehele getallen gebruiken die variëren van 0 tot 2n-1, waarbij n de bufferdiepte van het stencil is.

In sommige situaties kan het zijn dat je alleen kleine gedeelten van de renderdoel- en dieptebufferoppervlakken weergeeft. Met de duidelijke methoden kunt u ook meerdere gebieden van uw oppervlakken in één aanroep wissen. U doet dit door de parameter Aantal in te stellen op het aantal rechthoeken dat u wilt wissen en het adres van de eerste rechthoek op te geven in een matrix met rechthoeken in de parameter pRects.

De Viewport instellen voor knippen

De resultaten van de projectiematrix bepalen het knipvolume in de projectieruimte als:

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

Waar: x, y, z en w vertegenwoordigen de hoekpuntcoördinaten nadat de projectietransformatie is toegepast. Alle hoekpunten met een x-, y- of z-component buiten deze bereiken worden afgekapt als clipping is ingeschakeld (het standaardgedrag).

Met uitzondering van hoekpuntbuffers kunnen toepassingen knipsel in- of uitschakelen door middel van de D3DRS_CLIPPING renderstatus. Gegevens over het knippen van hoekpuntbuffers worden gegenereerd tijdens de verwerking. Zie Vaste Functie Vertex Processing (Direct3D 9) en Programmeerbare Vertex Processing (Direct3D 9)voor meer informatie.

Direct3D clipt getransformeerde hoekpunten van een primitieve niet uit een hoekpuntbuffer, tenzij deze afkomstig zijn van IDirect3DDevice9::ProcessVertices. Als u uw eigen transformaties uitvoert en Direct3D nodig hebt om de knipsels uit te voeren, moet u geen hoekpuntbuffers gebruiken. In dit geval doorkruist de toepassing de gegevens om deze te transformeren. Direct3D doorkruist de gegevens een tweede keer om deze te knippen, waarna het stuurprogramma de gegevens weergeeft, wat inefficiënt is. Dus als de toepassing de gegevens transformeert, moet deze ook de gegevens knippen.

Wanneer het apparaat vooraf getransformeerde en verlichte hoekpunten (T&L-hoekpunten) ontvangt die moeten worden geknipt, worden de hoekpunten opnieuw getransformeerd naar de knipruimte met behulp van de wederzijdse homogene w (RHW) van het hoekpunt en de viewport-informatie. Vervolgens wordt er een knip uitgevoerd. Niet alle apparaten kunnen deze back-transformatie uitvoeren om T-&L-hoekpunten af te knippen.

De D3DPMISCCAPS_CLIPTLVERTS apparaatmogelijkheid geeft aan of het apparaat in staat is T&L-vertices te clippen. Als deze mogelijkheid niet is ingesteld, is de toepassing verantwoordelijk voor het afkappen van de T&L-hoekpunten die het naar het apparaat wil sturen om weergegeven te worden. Het apparaat kan altijd T&L-hoekpunten knippen in de software-hoekpuntverwerkingsmodus (ongeacht of het apparaat in deze modus wordt gemaakt of ernaar overschakelt).

De enige vereiste voor het configureren van de viewport-parameters voor een renderingapparaat is het instellen van het knipvolume van de viewport. Hiervoor initialiseert en stelt u de waarden voor het knipvolume en voor het render-doeloppervlak in. Viewports zijn meestal zo ingesteld dat ze worden weergegeven op het volledige gebied van het render-doeloppervlak, maar dit is geen vereiste.

U kunt de volgende instellingen gebruiken voor de leden van de D3DVIEWPORT9 structuur om dit te bereiken in C++.

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

Nadat u waarden in de D3DVIEWPORT9-structuur hebt ingesteld, past u de viewport-parameters toe op het apparaat door de methode IDirect3DDevice9::SetViewport aan te roepen. In het volgende codevoorbeeld ziet u hoe deze aanroep eruit kan zien.

HRESULT hr;

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

Als de aanroep slaagt, worden de viewport-parameters ingesteld en wordt deze van kracht wanneer een renderingmethode de volgende keer wordt aangeroepen. Als u wijzigingen wilt aanbrengen in de viewport-parameters, werkt u de waarden in de D3DVIEWPORT9 structuur bij en roept u IDirect3DDevice9::SetViewport opnieuw aan.

Notitie

De D3DVIEWPORT9 structuurleden MinZ en MaxZ geven de dieptebereiken aan waarin de scène wordt weergegeven en worden niet gebruikt voor het knippen. De meeste toepassingen stellen deze leden in op 0.0 en 1.0 om het systeem in staat te stellen om het volledige bereik van dieptewaarden in de dieptebuffer weer te geven. In sommige gevallen kunt u speciale effecten bereiken met behulp van andere dieptebereiken. Als u bijvoorbeeld een hoofdweergave in een game wilt weergeven, kunt u beide waarden instellen op 0,0 om af te dwingen dat het systeem objecten in een scène op de voorgrond weergeeft, of u kunt beide instellen op 1.0 om een object weer te geven dat altijd op de achtergrond moet staan.

 

Aan de slag