Sdílet prostřednictvím


Začínáme s fází Input-Assembler

K inicializaci fáze input-assembleru (IA) je potřeba provést několik kroků. Potřebujete například vytvořit prostředky vyrovnávací paměti s daty vrcholů, která pipeline potřebuje, oznámit fázi IA, kde se vyrovnávací paměti nacházejí a jaký typ dat obsahují, a určit typ primitivů, které se mají z dat sestavit.

V tomto tématu jsou popsané základní kroky související s nastavením fáze IA, jak je znázorněno v následující tabulce.

Krok Popis
vytvoření vstupních vyrovnávacích pamětí Vytvořte a inicializujte vstupní vyrovnávací paměti se vstupními daty vrcholů.
Vytvoření objektu Input-Layout Definujte, jak se data vyrovnávací paměti vrcholů budou streamovat do fáze IA pomocí objektu vstupního rozložení.
Připojit objekty k Input-Assembler fázi Vytvořte vazbu vytvořených objektů (vstupní vyrovnávací paměti a objektu rozložení vstupu) do fáze IA.
Určení primitivního typu Určete, jak budou vrcholy sestaveny do grafických primitiv.
volání metod kreslení Odešlete data svázaná s fází IA prostřednictvím kanálu.

 

Po pochopení těchto kroků přejděte na Pomocí hodnot System-Generated.

Vytvoření vstupních vyrovnávacích pamětí

Existují dva typy vstupních vyrovnávacích pamětí: vyrovnávací paměti vrcholů a vyrovnávací paměti indexu. Vyrovnávací paměti vrcholů poskytují data vrcholů do fáze IA. Indexové buffery jsou volitelné; poskytují indexy pro vrcholy z bufferu vrcholů. Můžete vytvořit jednu nebo více vyrovnávacích pamětí pro vrcholy a případně také vyrovnávací paměť pro indexy.

Po vytvoření prostředků vyrovnávací paměti je potřeba vytvořit objekt rozložení vstupu, který popisuje rozložení dat do fáze IA a poté je potřeba svázat prostředky vyrovnávací paměti s fází IA. Vytváření a připojování vyrovnávacích pamětí není nutné, pokud vaše shadery nepoužívají vyrovnávací paměti. Příklad jednoduchého vertexového a pixelového shaderu, který nakreslí jeden trojúhelník, najdete v tématu Použití fáze Input-Assembler bez vyrovnávacích pamětí.

Pokud potřebujete pomoc s vytvořením vyrovnávací paměti vrcholu, podívejte se na Jak na to: Vytvoření vyrovnávací paměti vrcholu. Nápovědu k vytvoření vyrovnávací paměti indexu najdete v tématu Postupy: Vytvoření vyrovnávací paměti indexu.

Vytvoření objektu Input-Layout

Objekt rozložení vstupu zapouzdřuje vstupní stav fáze IA. To zahrnuje popis vstupních dat, která jsou svázaná s fází IA. Data jsou streamovaná do fáze IA z paměti, z jedné nebo více vyrovnávacích pamětí vrcholů. Popis identifikuje vstupní data svázaná pomocí jedné nebo více vyrovnávacích pamětí vrcholů a poskytuje modulu runtime možnost kontrolovat typy vstupních dat proti typům vstupních parametrů shaderu. Tato kontrola typů nejen ověří, jestli jsou typy kompatibilní, ale také že každý z prvků, které shader vyžaduje, je k dispozici v prostředcích vyrovnávací paměti.

Objekt input-layout je vytvořen z pole popisů input-elementů a ukazatele na zkompilovaný shader (viz ID3D11Device::CreateInputLayout). Pole obsahuje jeden nebo více vstupních prvků; každý vstupní prvek popisuje jeden prvek vrcholových dat z jedné vrcholové vyrovnávací paměti. Celá sada popisů vstupních prvků popisuje všechny prvky vrcholových dat ze všech vyrovnávacích pamětí vrcholů, které budou připojeny k fázi IA.

Následující popis rozložení popisuje jeden buffer pro vrcholy, který obsahuje tři prvky dat vrcholů.

D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { L"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { L"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { L"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

Popis vstupního prvku charakterizuje každý prvek obsažený jediným vrcholem ve vyrovnávací paměti vrcholů, včetně jeho velikosti, typu, umístění a účelu. Každý řádek identifikuje typ dat pomocí sémantického, sémantického indexu a formátu dat. Sémantika je textový řetězec, který určuje, jak budou data použita. V tomto příkladu první řádek identifikuje data pozice 3 komponent (xyz, například); druhý řádek identifikuje data textury 2 komponent (UV, například); a třetí řádek identifikuje normální data.

V tomto příkladu popisu vstupního prvku je sémantický index (což je druhý parametr) nastaven na nulu pro všechny tři řádky. Sémantický index pomáhá rozlišovat mezi dvěma řádky, které používají stejnou sémantiku. Vzhledem k tomu, že v tomto příkladu nejsou žádné podobné sémantiky, lze sémantický index nastavit na výchozí hodnotu nula.

Třetí parametr je formát . Formát (viz DXGI_FORMAT) určuje počet součástí na prvek a datový typ, který definuje velikost dat pro každý prvek. Formát může být plně zadán při vytváření prostředků nebo můžete vytvořit prostředek pomocí DXGI_FORMAT, který identifikuje počet komponent v prvku, ale datový typ ponechá nedefinovaný.

Vstupní sloty

Data vstupují do fáze IA prostřednictvím vstupů nazývaných vstupní sloty, jak je znázorněno na následujícím obrázku. Fáze IA má n vstupní sloty, které jsou navržené tak, aby vyhovovaly n vyrovnávací paměti vrcholů, které poskytují vstupní data. Každá vyrovnávací paměť vrcholů musí být přiřazena k jinému slotu; tyto informace jsou uloženy v deklaraci vstupního rozložení při vytvoření objektu rozložení vstupu. Můžete také zadat posun od začátku každé vyrovnávací paměti na první prvek vyrovnávací paměti, který se má číst.

ilustrace vstupních slotů pro fázi ia

Další dva parametry jsou vstupní slot a vstupní posun. Pokud používáte více vyrovnávacích pamětí, můžete je svázat k jednomu nebo více vstupním slotům. Offset vstupu je počet bajtů mezi začátkem vyrovnávací paměti a začátkem dat.

Opětovné použití objektů Input-Layout

Každý objekt rozložení vstupu je vytvořen na základě podpisu shaderu; To umožňuje rozhraní API ověřit elementy vstupního objektu rozložení proti podpisu shaderu a zajistit tak přesnou shodu typů a sémantiky. Můžete vytvořit jeden objekt rozložení vstupu pro mnoho shaderů, pokud se všechny vstupní podpisy shaderu přesně shodují.

Připojení objektů k Input-Assembler fázi

Po vytvoření prostředků vyrovnávací paměti vrcholů a vytvoření objektu rozložení vstupu je můžete připojit k fázi IA voláním ID3D11DeviceContext::IASetVertexBuffers a ID3D11DeviceContext::IASetInputLayout. Následující příklad ukazuje vazbu jedné vyrovnávací paměti vrcholu a objektu rozložení vstupu do fáze IA:

UINT stride = sizeof( SimpleVertex );
UINT offset = 0;
g_pd3dDevice->IASetVertexBuffers( 
    0,                // the first input slot for binding
    1,                // the number of buffers in the array
    &g_pVertexBuffer, // the array of vertex buffers
    &stride,          // array of stride values, one for each buffer
    &offset );        // array of offset values, one for each buffer

// Set the input layout
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );

Připojení objektu rozvržení vstupu vyžaduje pouze ukazatel na objekt.

V předchozím příkladu je vázána jedna vyrovnávací paměť vrcholů. Více vyrovnávacích pamětí vrcholů však může být vázáno jedním voláním ID3D11DeviceContext::IASetVertexBuffers. Následující kód ukazuje takové volání pro vazbu tří vyrovnávacích pamětí vrcholů.

UINT strides[3];
strides[0] = sizeof(SimpleVertex1);
strides[1] = sizeof(SimpleVertex2);
strides[2] = sizeof(SimpleVertex3);
UINT offsets[3] = { 0, 0, 0 };
g_pd3dDevice->IASetVertexBuffers( 
    0,                 //first input slot for binding
    3,                 //number of buffers in the array
    &g_pVertexBuffers, //array of three vertex buffers
    &strides,          //array of stride values, one for each buffer
    &offsets );        //array of offset values, one for each buffer

Indexový buffer je vázán na fázi IA voláním ID3D11DeviceContext::IASetIndexBuffer.

Zadejte primitivní typ

Po připojení vstupních vyrovnávacích pamětí je nutné fázi IA sdělit, jak mají být vrcholy sestavovány do primitiv. To se provádí zadáním primitivního typu voláním ID3D11DeviceContext::IASetPrimitiveTopology; Následující kód volá tuto funkci, která definuje data jako seznam trojúhelníků bez sousedství:

g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

Zbývající primitivní typy jsou uvedeny v D3D_PRIMITIVE_TOPOLOGY.

Volání metod kreslení

Jakmile jsou vstupní prostředky vázané na kanál, aplikace volá metodu kreslení pro vykreslení primitiv. Existuje několik metod kreslení, které jsou uvedeny v následující tabulce, některé používají vyrovnávací paměti indexu, některé používají data instance a některé znovu používají data z fáze výstupního streamování jako vstup do fáze sestavování vstupů.

Metody kreslení Popis
ID3D11DeviceContext::Draw Nakreslete neindexované primitivy bez instance.
ID3D11DeviceContext::DrawInstanced Nakreslete neindexované primitivy instance.
ID3D11DeviceContext::DrawIndexed Nakreslete indexované primitivy, které nejsou instancemi.
ID3D11DeviceContext::DrawIndexedInstanced Nakreslete indexované a instancované primitivy.
ID3D11DeviceContext::DrawAuto Nakreslete neindexované primitivy bez instancí ze vstupních dat, která pocházejí z fáze výstupu streamování.

 

Každá metoda kreslení vykreslí jeden typ topologie. Během vykreslování se nekompletní primitiva (ty bez dostatečných vrcholů, chybějící indexy, částečné primitivy atd.) bezobslužně zahodí.

Input-Assembler fáze