Kom igång med Input-Assembler-fasen

Det finns några steg som krävs för att initiera IA-fasen (input-assembler). Du måste till exempel skapa buffertresurser med hörndata som pipelinen behöver, berätta för IA-fasen var buffertarna finns och vilken typ av data de innehåller och ange vilken typ av primitiver som ska monteras från data.

De grundläggande stegen som ingår i konfigurationen av IA-fasen, som visas i följande tabell, beskrivs i det här avsnittet.

Steg Beskrivning
Skapa indatabuffertar Skapa och initiera indatabuffertar med vertexindata.
Skapa Input-Layout-objektet Definiera hur hörnbuffertdata ska strömmas till IA-fasen med hjälp av ett indatalayoutobjekt.
Binda Objekt till Input-Assembler Steget Binda de skapade objekten (indatabuffertar och indatalayoutobjektet) till IA-fasen.
Ange den primitiva typen ** Identifiera hur vertiklarna monteras i primitiver.
Metoder för att anropa dragning Skicka data som är bundna till IA-fasen genom pipelinen.

 

När du har förstått de här stegen går du vidare till Använda System-Generated-värden.

Skapa indatabuffertar

Det finns två typer av indatabuffertar: hörnbuffertar och indexbuffertar. Vertexbuffertar tillhandahåller vertexdata till IA-fasen. Indexbuffertar är valfria; de ger index till vertexar från vertexbufferten. Du kan skapa en eller flera hörnbuffertar och, om du vill, en indexbuffert.

När du har skapat buffertresurserna måste du skapa ett indatalayoutobjekt för att beskriva datalayouten till IA-fasen och sedan måste du binda buffertresurserna till IA-fasen. Det är inte nödvändigt att skapa och binda buffertar om skuggningarna inte använder buffertar. Ett exempel på ett enkelt hörn och en pixelskuggare som ritar en enda triangel finns i Använda Input-Assembler steget utan buffertar.

Hjälp med att skapa en hörnbuffert finns i How to: Create a vertex buffer. Hjälp med att skapa en indexbuffert finns i Så här skapar du en indexbuffert.

Skapa Input-Layout-objektet

Indatalayoutobjektet kapslar in indatatillståndet för IA-fasen. Detta inkluderar en beskrivning av indata som är bundna till IA-fasen. Data strömmas till IA-fasen från minnet, från en eller flera hörnbuffertar. Beskrivningen identifierar indata som är bundna från en eller flera vertexbuffertar och ger körningen möjlighet att kontrollera indatatyperna mot indataparametrar för shaders. Den här typen kontrollerar inte bara att typerna är kompatibla, utan även att vart och ett av de element som skuggningen kräver är tillgängligt i buffertresurserna.

Ett indatalayoutobjekt skapas från en matris med beskrivningar av indataelement och en pekare till den kompilerade skuggningen (se ID3D11Enhet::CreateInputLayout). Matrisen innehåller ett eller flera indataelement. varje indataelement beskriver ett enda hörndataelement från en enda brytpunktsbuffert. Hela uppsättningen beskrivningar av indataelement beskriver alla hörndataelement från alla hörnbuffertar som ska bindas till IA-fasen.

Följande layoutbeskrivning beskriver en enda brytpunktsbuffert som innehåller tre hörndataelement:

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 },
};

En beskrivning av indataelement beskriver varje element som ingår i ett enda hörn i en brytpunktsbuffert, inklusive storlek, typ, plats och syfte. Varje rad identifierar typen av data med hjälp av semantiken, det semantiska indexet och dataformatet. En semantisk är en textsträng som identifierar hur data ska användas. I det här exemplet identifierar den första raden positionsdata med 3 komponenter (xyz, till exempel); den andra raden identifierar 2-komponents texturdata (UV-, till exempel); och den tredje raden identifierar normala data.

I det här exemplet på en beskrivning av indataelementet anges semantikindexet (som är den andra parametern) till noll för alla tre raderna. Det semantiska indexet hjälper till att skilja mellan två rader som använder samma semantik. Eftersom det inte finns några liknande semantik i det här exemplet kan det semantiska indexet anges till standardvärdet noll.

Den tredje parametern är format. Formatet (se DXGI_FORMAT) anger antalet komponenter per element och datatypen, som definierar storleken på data för varje element. Formatet kan skrivas fullständigt när resursen skapas, eller så kan du skapa en resurs med hjälp av en DXGI_FORMAT, som identifierar antalet komponenter i ett element, men lämnar datatypen odefinierad.

Ingångsplatser

Data går in i IA-fasen via indata som kallas indataplats, enligt följande illustration. IA-fasen har n ingångar, som är utformade för att rymma upp till n vertexbuffertar som tillhandahåller indata. Varje hörnbuffert måste tilldelas till ett annat fack. Den här informationen lagras i deklarationen för indatalayout när indatalayoutobjektet skapas. Du kan också ange en förskjutning från början av varje buffert till det första elementet i bufferten som ska läsas.

illustration av indataanslutningar för ia-steget

Följande två parametrar är inmatningsfack och indataförskjutning. När du använder flera buffertar kan du binda dem till ett eller flera indatafack. Indataförskjutningen är antalet byte mellan början av bufferten och början av datan.

Återanvända Input-Layout-objekt

Varje indatalayoutobjekt skapas baserat på en skuggningssignatur. Detta gör att API:et kan verifiera elementen input-layout-object mot shader-input-signaturen för att se till att det finns en exakt matchning av typer och semantik. Du kan skapa ett enda indatalayoutobjekt för många shaders, så länge alla signaturer för shader-ingångar stämmer överens exakt.

Binda objekt till Input-Assembler-fasen

När du har skapat hörnbuffertresurser och ett indatalayoutobjekt kan du binda dem till IA-fasen genom att anropa ID3D11DeviceContext::IASetVertexBuffers och ID3D11DeviceContext::IASetInputLayout. I följande exempel visas bindningen av en enda brytpunktsbuffert och ett indatalayoutobjekt till IA-fasen:

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

För att binda indatalayoutobjektet krävs bara en pekare till objektet.

I föregående exempel är en enda brytpunktsbuffert bunden. Flera hörnbuffertar kan dock bindas av ett enda anrop till ID3D11DeviceContext::IASetVertexBuffers, och följande kod visar ett sådant anrop för att binda tre hörnbuffertar:

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

En indexbuffert är bunden till IA-fasen genom att anropa ID3D11DeviceContext::IASetIndexBuffer.

Ange den primitiva typen

När indatabuffertarna har bundits måste IA-fasen instrueras om hur vertikalerna ska monteras till primitiver. Detta görs genom att ange den primitiva typen genom att anropa ID3D11DeviceContext::IASetPrimitiveTopology; följande kod anropar den här funktionen för att definiera data som en triangellista utan angränsande:

g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

Resten av de primitiva typerna visas i D3D_PRIMITIVE_TOPOLOGY.

Anropsdragningsmetoder

När indataresurser har bundits till pipelinen anropar ett program en dragningsmetod för att återge primitiver. Det finns flera dragningsmetoder som visas i följande tabell. vissa använder indexbuffertar, vissa använder instansdata och vissa återanvänder data från strömningsutdatasteget som indata till indata-assembler-fasen.

Metoder för att rita Beskrivning
ID3D11DeviceContext::Draw Rita icke-indexerade, icke-instansbaserade primitiver.
ID3D11DeviceContext::DrawInstanced Rita icke-indexerade, instanserade primitiver.
ID3D11DeviceContext::DrawIndexed Rita indexerade, icke-instanserade primitiver.
ID3D11DeviceContext::DrawIndexedInstanced Rita indexerade, instanserade primitiver.
ID3D11DeviceContext::DrawAuto Rita icke-indexerade, icke-instanserade primitiver från indata som kommer från strömmande utdatafasen.

 

Varje dragningsmetod renderar en enda topologityp. Vid rendering ignoreras ofullständiga primitiver (de utan tillräckligt med vertice, saknar index, partiella primitiver och så vidare) utan meddelande.

Input-Assembler steg