Delen via


Geometrie Blending (Direct3D 9)

Direct3D stelt een toepassing in staat om het realisme van de scènes te vergroten door gesegmenteerde polygonale objecten , met name tekens, te renderen die soepel gemixte gewrichten hebben. Deze effecten worden vaak skinning genoemd. Het systeem bereikt dit effect door extra wereldtransformatiematrices toe te passen op één set hoekpunten om meerdere resultaten te maken en vervolgens een lineaire mix uit te voeren tussen de resulterende hoekpunten om één set geometrie te maken voor rendering. In de volgende afbeelding van een banaan ziet u dit proces.

illustratie van het proces om twee objecten te combineren met banaanpatroon

In de voorgaande afbeelding ziet u hoe u zich het geometriemengingsproces kunt voorstellen. In één rendering-aanroep neemt het systeem de hoekpunten voor de banaan, transformeert ze twee keer - eenmaal zonder aanpassing en eenmaal met een eenvoudige draaiing - en combineert het de resultaten om een gebogen banaan te maken. Het systeem combineert de hoekpuntpositie en het hoekpuntnormaal wanneer verlichting is ingeschakeld. Toepassingen zijn niet beperkt tot twee gemengde paden; Direct3D kan geometrie combineren tussen zo veel als vier wereldmatrices, waaronder de standaard wereldmatrix, D3DTS_WORLD.

Notitie

Wanneer verlichting is ingeschakeld, worden hoekpuntnormaaltjes getransformeerd door een overeenkomstige inverse wereldweergavematrix, gewogen op dezelfde manier als de berekeningen van de hoekpuntpositie. Het systeem normaliseert de resulterende normale vector als de D3DRS_NORMALIZENORMALS renderstatus is ingesteld op TRUE.

 

Zonder geometriemenging worden dynamische gearticuleerde modellen vaak weergegeven in segmenten. Denk bijvoorbeeld aan een 3D-model van de menselijke arm. In de eenvoudigste weergave heeft een arm twee delen: de bovenarm die verbinding maakt met het lichaam en de onderste arm, die met de hand verbindt. De twee zijn aangesloten op de elleboog en de onderste arm draait op dat punt. Een toepassing die een arm weergeeft, kan hoekpuntgegevens voor de bovenste en onderste arm behouden, elk met een afzonderlijke wereldtransformatiematrix. In het volgende codevoorbeeld ziet u dit.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

Als u de arm wilt weergeven, worden twee rendering-aanroepen uitgevoerd, zoals wordt weergegeven in de volgende code.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

De volgende afbeelding is een banaan die is aangepast om deze techniek te gebruiken.

illustratie van een gemixte banaan zonder geometrie

De verschillen tussen de gemengde geometrie en de niet-blended geometrie zijn duidelijk. Dit voorbeeld is enigszins extreem. In een praktijktoepassing zijn de gewrichten van gesegmenteerde modellen zo ontworpen dat naden niet zo duidelijk zijn. Naden zijn echter soms zichtbaar, wat constante uitdagingen voor modelontwerpers aangeeft.

Geometriemenging in Direct3D biedt een alternatief voor het klassieke gesegmenteerde modelleringsscenario. De verbeterde visuele kwaliteit van gesegmenteerde objecten komt echter ten koste van de combinatieberekeningen tijdens het weergeven. Om de impact van deze extra bewerkingen te minimaliseren, is de Direct3D geometriepijplijn geoptimaliseerd om geometrie te combineren met zo min mogelijk overhead. Toepassingen die op intelligente wijze gebruikmaken van de geometriemixservices die door Direct3D worden aangeboden, kunnen het realisme van hun tekens verbeteren en tegelijkertijd ernstige gevolgen voor de prestaties voorkomen.

Transformatie- en render-toestanden combineren

De methode IDirect3DDevice9::SetTransform herkent de macro's D3DTS_WORLD en D3DTS_WORLDn, die overeenkomen met waarden die kunnen worden gedefinieerd door de D3DTS_WORLDMATRIX macro. Deze macro's worden gebruikt om de matrices te identificeren waartussen de geometrie wordt samengevoegd.

Het D3DRENDERSTATETYPE enumeratietype bevat de D3DRS_VERTEXBLEND renderstaat om geometriemenging mogelijk te maken en te controleren. Geldige waarden voor deze weergavestatus worden gedefinieerd door het D3DVERTEXBLENDFLAGS geïnventariseerd type. Als geometriemenging is ingeschakeld, moet de hoekpuntindeling het juiste aantal menggewichten bevatten.

Mengselgewichten

Een menggewicht, ook wel bètagewicht genoemd, bepaalt de mate waarin een bepaalde wereldmatrix van invloed is op een hoekpunt. Mengselgewichten zijn drijvendekommagewaarden die variëren van 0,0 tot 1.0, gecodeerd in de hoekpuntindeling, waarbij een waarde van 0,0 betekent dat het hoekpunt niet wordt gemengd met die matrix en 1,0 betekent dat het hoekpunt volledig wordt beïnvloed door de matrix.

Geometrische menggewichten worden gecodeerd in de verdeelindeling van het hoekpunt, direct na de positie van elk hoekpunt weergegeven, zoals beschreven in Vaste functie FVF-codes (Direct3D 9). U communiceert het aantal menggewichten in de hoekpuntindeling door een van de FVF-constanten op te geven in de beschrijving van het hoekpunt dat u aan de renderingmethoden opgeeft.

Het systeem voert een lineaire menging uit tussen de gewogen uitkomsten van de mengmatrices. De volgende vergelijking is de volledige blendingformule.

vergelijking van lineaire blending met behulp van wereldtransformatiematrices

In de voorgaande vergelijking is vBlend het uitvoerpunt, de v-elementen zijn de hoekpunten die worden geproduceerd door de toegepaste wereldmatrix (D3DTS_WORLDn). De W-elementen zijn de overeenkomende gewichtswaarden binnen de hoekpuntindeling. Een hoekpunt dat vermengd is tussen n matrices kan n - 1 menggewichtswaarden hebben, één voor elke mengmatrix, met uitzondering van de laatste. Het systeem genereert automatisch het gewicht voor de laatste wereldmatrix, zodat de som van alle gewichten 1,0 is, uitgedrukt in sigma notatie hier. Deze formule kan worden vereenvoudigd voor elk van de gevallen die worden ondersteund door Direct3D, die wordt weergegeven in de volgende vergelijkingen.

vergelijkingen van lineaire blending voor drie blendingcases

Dit zijn de vereenvoudigde vormen van de volledige mengformule voor de twee-, drie- en viermatrixgevallen.

Notitie

Hoewel Direct3D FVF-descriptors bevat om hoekpunten te definiëren die maximaal vijf menggewichten bevatten, kunnen slechts drie worden gebruikt in deze release van DirectX.

 

Aanvullende informatie vindt u in de volgende onderwerpen.

hoekpuntpijplijn