Dela via


Geometriblandning (Direct3D 9)

Direct3D gör det möjligt för ett program att öka realismen i sina scener genom att återge segmenterade polygonala objekt - särskilt karaktärer - som har smidigt blandade leder. Dessa effekter kallas ofta skinning. Systemet uppnår den här effekten genom att tillämpa ytterligare matriser för världsomvandling på en enda uppsättning hörn för att skapa flera resultat och sedan utföra en linjär blandning mellan de resulterande hörnen för att skapa en enda uppsättning geometri för rendering. Följande bild av en banan visar den här processen.

bild av processen för att blanda två objekt med bananstruktur

Föregående bild visar hur du kan föreställa dig geometriblandningsprocessen. I ett enda återgivningsanrop tar systemet hörnen för bananen, omvandlar dem två gånger - en gång utan modifiering och en gång med en enkel rotation - och blandar resultaten för att skapa en böjd banan. Systemet blandar vertexpositionen och vertexnormen när belysningen är aktiverad. Applikationer är inte begränsade till två blandningssökvägar. Direct3D kan blanda geometri mellan så många som fyra världsmatriser, inklusive standardvärldsmatrisen, D3DTS_WORLD.

Notera

När belysning aktiveras omvandlas hörnnormaler av en motsvarande inverterad matris för världsvyer, viktade på samma sätt som hörnpositionsberäkningarna. Systemet normaliserar den resulterande normala vektorn om D3DRS_NORMALIZENORMALS återgivningstillstånd är inställt på TRUE-.

 

Utan geometriblandning återges dynamiska artikulerade modeller ofta i segment. Överväg till exempel en 3D-modell av den mänskliga armen. I den enklaste vyn har en arm två delar: överarmen som ansluter till kroppen och underarmen, som ansluter till handen. De två är anslutna vid armbågen, och underarmen roterar vid den punkten. En applikation som renderar en arm kan behålla vertexdata för den övre och nedre armen, var och en med en separat världstransformationsmatris. Följande kodexempel illustrerar detta.

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.

För att återge armen görs två återgivningsanrop, enligt följande kod.

// 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 );

Följande bild är en banan, modifierad för att använda den här tekniken.

bild av en blandad banan utan geometriblandning

Skillnaderna mellan den blandade geometrin och den icke-inbledade geometrin är uppenbara. Det här exemplet är något extremt. I en verklig applikation är lederna i segmenterade modeller designade så att sömmarna inte blir lika tydliga. Sömmar är dock synliga ibland, vilket innebär ständiga utmaningar för modelldesigners.

Geometriblandning i Direct3D är ett alternativ till det klassiska scenariot för segmenterad modellering. Den förbättrade visuella kvaliteten på segmenterade objekt sker dock på bekostnad av blandningsberäkningarna under återgivningen. För att minimera effekten av dessa ytterligare åtgärder optimeras Direct3D-geometripipelinen för att blanda geometri med minsta möjliga omkostnader. Program som på ett intelligent sätt använder de geometriblandningstjänster som erbjuds av Direct3D kan förbättra realismen hos deras karaktärer samtidigt som allvarliga prestandakonsekvenser undviks.

Blanda transformerings- och renderingstillstånd

Metoden IDirect3DDevice9::SetTransform identifierar D3DTS_WORLD- och D3DTS_WORLDn makron, vilket motsvarar värden som kan definieras av D3DTS_WORLDMATRIX makro. Dessa makron används för att identifiera matriserna mellan vilka geometri ska blandas.

Den D3DRENDERSTATETYPE uppräknade typen innehåller D3DRS_VERTEXBLEND återgivningstillstånd för att aktivera och kontrollera geometriblandning. Giltiga värden för det här återgivningstillståndet definieras av den D3DVERTEXBLENDFLAGS uppräknade typen. Om geometriblandning är aktiverat måste hörnformatet innehålla lämpligt antal blandningsvikter.

Blandningsvikter

En blandningsvikt, ibland kallad betavikt, styr i vilken utsträckning en viss världsmatris påverkar en vertex. Blandningsvikter är flyttalvärden som sträcker sig från 0.0 till 1.0, kodade i hörnformatet, där värdet 0.0 innebär att brytpunkten inte blandas med matrisen och 1.0 innebär att brytpunkten påverkas fullt ut av matrisen.

Geometriblandningsvikter kodas i vertexformatet och visas omedelbart efter positionen för varje hörn, enligt beskrivningen i FVF-koder för fast funktion (Direct3D 9). Du kommunicerar antalet blandningsvikter i hörnformatet genom att inkludera en av de FVF-konstanterna i hörnbeskrivningen som du anger för återgivningsmetoderna.

Systemet utför en linjär blandning mellan de viktade resultaten av blandningsmatriserna. Följande ekvation är den fullständiga blandningsformeln.

ekvation för linjär blandning med hjälp av världsomvandlingsmatriser

I föregående ekvation är vBlend utdatahörnet, v-elementen är hörnen som skapas av den tillämpade världsmatrisen (D3DTS_WORLDn). W-elementen är motsvarande viktvärden i hörnformatet. Ett hörn som blandas mellan n matriser kan ha - 1 blandningsviktvärden, en för varje blandningsmatris, förutom den sista. Systemet genererar automatiskt vikten för den sista världsmatrisen så att summan av alla vikter är 1,0, uttryckt i sigma notation här. Den här formeln kan förenklas för vart och ett av de fall som stöds av Direct3D, vilket visas i följande ekvationer.

ekvationer för linjär blandning för tre blandningsfall

Det här är de förenklade formerna av den fullständiga blandningsformeln för de två, tre och fyra blandningsmatrisfallen.

Not

Även om Direct3D innehåller FVF-deskriptorer för att definiera hörn som innehåller upp till fem blandningsvikter, kan endast tre användas i den här versionen av DirectX.

 

Ytterligare information finns i följande avsnitt.

Vertex-pipeline