Udostępnij za pośrednictwem


Łączenie Geometrii (Direct3D 9)

Funkcja Direct3D umożliwia aplikacji zwiększenie realizmu scen przez renderowanie segmentowanych obiektów wielokątnych - zwłaszcza znaków - które mają płynnie połączone połączenia. Efekty te są często określane jako obkładanie. System osiąga ten efekt, stosując dodatkowe macierze transformacji świata do jednego zestawu wierzchołków w celu utworzenia wielu wyników, a następnie wykonując liniową mieszankę między wynikowymi wierzchołkami, aby utworzyć pojedynczy zestaw geometrii do renderowania. Poniższa ilustracja przedstawiająca banan pokazuje ten proces.

ilustracja procesu mieszania dwóch obiektów z teksturą bananów

Na powyższej ilustracji pokazano, jak można sobie wyobrazić proces łączenia geometrii. W jednym wywołaniu renderowania system pobiera wierzchołki bananów, przekształca je dwa razy - raz bez modyfikacji, a raz z prostą rotacją - i łączy wyniki w celu utworzenia wygiętego bananu. System łączy położenie wierzchołka, a także wierzchołek normalny po włączeniu oświetlenia. Aplikacje nie są ograniczone do dwóch ścieżek mieszania; Direct3D może mieszać geometrię pomiędzy aż czterema macierzami świata, w tym standardową macierzą świata, D3DTS_WORLD.

Notatka

Gdy oświetlenie jest włączone, wierzchołki są przekształcane przez odpowiadającą odwrotną macierz widoku świata, ważoną w taki sam sposób jak obliczenia położenia wierzchołka. System normalizuje wynikowy wektor normalny, jeśli stan renderowania D3DRS_NORMALIZENORMALS jest ustawiony na wartość true.

 

Bez mieszania geometrii dynamiczne modele przegubowe są często renderowane w segmentach. Rozważmy na przykład model 3D ramienia ludzkiego. W najprostszym widoku ramię ma dwie części: górne ramię, które łączy się z ciałem, i dolną rękę, która łączy się z ręką. Te dwa są połączone w łokciu, a dolne ramię obraca się w tym momencie. Aplikacja, która renderuje ramię, może zachować dane wierzchołków dla górnego i dolnego ramienia, z których każde ma oddzielną macierz transformacji świata. Poniższy przykład kodu ilustruje to.

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.

Aby renderować ramię, wykonywane są dwa wywołania renderowania, jak pokazano w poniższym kodzie.

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

Poniższa ilustracja to banan, zmodyfikowany w celu użycia tej techniki.

ilustracja mieszanego bananu bez mieszania geometrii

Różnice między geometrią mieszaną a nieblendowaną geometrią są oczywiste. Ten przykład jest nieco ekstremalny. W rzeczywistych zastosowaniach połączenia segmentowanych modeli są zaprojektowane tak, aby szwy nie są tak oczywiste. Jednak szwy są czasami widoczne, co stanowi ciągłe wyzwania dla projektantów modeli.

Geometria w połączeniu z direct3D stanowi alternatywę dla klasycznego scenariusza modelowania segmentowanego. Jednak ulepszona jakość wizualizacji segmentowanych obiektów jest kosztem obliczeń mieszanych podczas renderowania. Aby zminimalizować wpływ tych dodatkowych operacji, potok geometrii Direct3D jest zoptymalizowany pod kątem mieszania geometrii z najmniejszym możliwym obciążeniem. Aplikacje, które inteligentnie korzystają z usług łączenia geometrii oferowanych przez Direct3D, mogą poprawić realizm swoich postaci, unikając poważnych konsekwencji dla wydajności.

Łączenie stanów przekształcania i renderowania

Metoda IDirect3DDevice9::SetTransform rozpoznaje makra D3DTS_WORLD i D3DTS_WORLDn, które odpowiadają wartościom, które można zdefiniować za pomocą makra D3DTS_WORLDMATRIX. Te makra służą do identyfikowania macierzy, między którymi geometria zostanie połączona.

Typ wyliczeniowy D3DRENDERSTATETYPE obejmuje parametr renderowania D3DRS_VERTEXBLEND, aby włączyć i sterować mieszaniem geometrii. Prawidłowe wartości tego stanu renderowania są definiowane przez wyliczeniowy typ D3DVERTEXBLENDFLAGS. Jeśli włączono mieszanie geometrii, format wierzchołka musi zawierać odpowiednią liczbę mas mieszanych.

Wagi mieszające

Waga mieszana, czasami nazywana wagą beta, kontroluje zakres, w jakim dana macierz świata wpływa na wierzchołek. Wagi mieszania to wartości zmiennoprzecinkowe, które wahają się od 0,0 do 1,0 i są zakodowane w formacie wierzchołka. Wartość 0,0 oznacza, że wierzchołek nie jest mieszany przez tę macierz, a 1,0 oznacza, że wierzchołek jest w pełni wpływany przez tę macierz.

Wagi mieszania geometrii są kodowane w formacie wierzchołka, które pojawiają się bezpośrednio po pozycji dla każdego wierzchołka, zgodnie z opisem w Kodach FVF Funkcji Stałej (Direct3D 9). Liczbę wag mieszania w formacie wierzchołka przekazuje się przez dołączenie jednej ze stałych FVF FVF do opisu wierzchołka, który dostarczasz metodom renderowania.

System wykonuje liniową interpolację między ważonymi wynikami macierzy mieszania. Poniższe równanie to kompletna formuła do mieszania.

równanie liniowego mieszania przy użyciu macierzy transformacji świata

W poprzednim równaniu vBlend jest wierzchołkiem wyjściowym, v-elements są wierzchołkami utworzonymi przez zastosowaną macierz świata (D3DTS_WORLDn). Elementy W są odpowiednimi wartościami wagi w formacie wierzchołka. Wierzchołek mieszany między n macierzami może mieć - 1 wartości wagi mieszanej, po jednym dla każdej macierzy mieszanej, z wyjątkiem ostatniej. System automatycznie generuje wagę dla ostatniej macierzy globalnej, tak aby suma wszystkich wag wynosiła 1,0, co jest tutaj wyrażone w notacji sigma. Tę formułę można uprościć dla każdego z przypadków obsługiwanych przez funkcję Direct3D, która jest pokazana w poniższych równaniach.

równania liniowego mieszania dla trzech przypadków mieszania

Są to uproszczone formy kompletnych formuł mieszania dla dwóch, trzech i czterech układów macierzy mieszania.

Notatka

Mimo że direct3D zawiera deskryptory FVF do definiowania wierzchołków zawierających maksymalnie pięć mas mieszanych, w tej wersji DirectX można używać tylko trzech.

 

Dodatkowe informacje znajdują się w następujących tematach.

potoku wierzchołka