Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Istnieje kilka kroków niezbędnych do zainicjowania etapu input-assembler (IA). Na przykład należy utworzyć zasoby buforu z danymi wierzchołków, których potrzebuje potok, poinformować etap IA (Input Assembler), gdzie znajdują się bufory i jakiego typu dane zawierają, oraz określić typ prymitywów do zebrania z danych.
Podstawowe kroki związane z konfigurowaniem etapu IA, pokazanym w poniższej tabeli, zostały omówione w tym temacie.
| Krok | Opis |
|---|---|
| tworzenie wejściowych | Utwórz i zainicjuj bufory wejściowe przy użyciu danych wierzchołków wejściowych. |
| Stwórz Input-Layout obiekt | Zdefiniuj, jak strumieniować dane buforu wierzchołków do etapu IA, używając obiektu układu wejściowego. |
| powiązać obiekty z Input-Assembler etapu | Powiąż utworzone obiekty (bufory wejściowe i obiekt układu wejściowego) z etapem wejściowym IA. |
| Określ typ pierwotny | Określ, w jaki sposób wierzchołki zostaną zebrane w elementy pierwotne. |
| metody rysowania wywołań | Wysyłanie danych powiązanych z etapem IA za pośrednictwem potoku. |
Po zapoznaniu się z tymi krokami przejdź do Używanie wartości System-Generated.
Tworzenie wejściowych buforów
Istnieją dwa typy buforów wejściowych: bufory wierzchołków i bufory indeksów. Bufory wierzchołków dostarczają dane wierzchołków do etapu IA. Bufory indeksów są opcjonalne; udostępniają indeksy dla wierzchołków z buforu wierzchołków. Możesz utworzyć co najmniej jeden bufor wierzchołka i opcjonalnie bufor indeksu.
Po utworzeniu zasobów buforu należy utworzyć obiekt układu wejściowego, aby opisać układ danych na etapie IA, a następnie powiązać zasoby buforu z etapem IA. Tworzenie i wiązanie buforów nie jest konieczne, jeśli shadery ich nie używają. Aby zapoznać się z przykładem prostego wierzchołka i cieniowania pikseli, który rysuje pojedynczy trójkąt, zobacz Using the Input-Assembler Stage without Buffers (Używanie etapu Input-Assembler bez).
Aby uzyskać pomoc dotyczącą tworzenia buforu wierzchołka, zobacz Instrukcje: tworzenie buforu wierzchołka. Aby uzyskać pomoc dotyczącą tworzenia buforu indeksu, zobacz Instrukcje: tworzenie buforu indeksu.
Tworzenie obiektu Input-Layout
Obiekt układu wejściowego hermetyzuje stan wejściowy etapu IA. Obejmuje to opis danych wejściowych powiązanych z etapem IA. Dane są przesyłane strumieniowo do etapu IA z pamięci z co najmniej jednego buforu wierzchołka. Opis identyfikuje dane wejściowe powiązane z co najmniej jednym buforem wierzchołka i daje środowisku uruchomieniowemu możliwość sprawdzania typów danych wejściowych względem typów parametrów wejściowych shaderów. Sprawdzanie tego typu nie tylko sprawdza, czy typy są zgodne, ale także, że każdy z elementów, których wymaga cieniowanie, jest dostępny w zasobach buforu.
Obiekt układu wejściowego jest tworzony na podstawie tablicy opisów elementów wejściowych i wskaźnika do skompilowanego cieniowania (zobacz ID3D11Device::CreateInputLayout). Tablica zawiera co najmniej jeden element wejściowy; każdy element wejściowy opisuje pojedynczy element danych wierzchołka z pojedynczego buforu wierzchołka. Cały zestaw opisów elementów wejściowych opisuje wszystkie elementy danych wierzchołka ze wszystkich buforów wierzchołków, które będą powiązane z etapem IA.
W poniższym opisie układu opisano pojedynczy bufor wierzchołków zawierający trzy elementy danych wierzchołka:
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 },
};
Opis elementu wejściowego opisuje każdy element zawarty przez pojedynczy wierzchołek w buforze wierzchołków, w tym jego rozmiar, typ, lokalizację i cel. Każdy wiersz identyfikuje typ danych przy użyciu semantyki, indeksu semantycznego i formatu danych. Semantyczny to ciąg tekstowy, który określa, jak dane będą używane. W tym przykładzie pierwszy wiersz identyfikuje dane o pozycji 3 składników (xyz, na przykład); drugi wiersz identyfikuje dane tekstur 2 składników (na przykładUV); a trzeci wiersz identyfikuje normalne dane.
W tym przykładzie opisu elementu wejściowego indeks semantyczny (który jest drugim parametrem) ma wartość zero dla wszystkich trzech wierszy. Indeks semantyczny pomaga odróżnić dwa wiersze, które używają tej samej semantyki. Ponieważ w tym przykładzie nie ma podobnych semantyki, indeks semantyczny można ustawić na wartość domyślną, zero.
Trzeci parametr to format. Format (zobacz DXGI_FORMAT) określa liczbę składników na element oraz typ danych, który definiuje rozmiar danych dla każdego elementu. Format może być w pełni wpisany w momencie tworzenia zasobu lub można utworzyć zasób przy użyciu DXGI_FORMAT, który identyfikuje liczbę składników w elemecie, ale pozostawia niezdefiniowany typ danych.
Miejsca wejściowe
Dane wchodzą do etapu IA przez wejścia zwane gniazdami wejściowymi, jak pokazano na poniższej ilustracji. Etap IA ma n gniazd wejściowych, które zostały zaprojektowane tak, aby pomieścić maksymalnie n bufory wierzchołków dostarczające dane wejściowe. Każdy bufor wierzchołka musi być przypisany do innego miejsca; te informacje są przechowywane w deklaracji układu wejściowego podczas tworzenia obiektu układu wejściowego. Można również określić przesunięcie od początku każdego buforu do pierwszego elementu, który ma być odczytany.
Dwa następne parametry to gniazdo wejściowe i przesunięcie wejściowe . Podczas korzystania z wielu buforów, można je powiązać z jednym lub kilkoma gniazdami wejściowymi. Przesunięcie wejściowe to liczba bajtów między rozpoczęciem buforu a początkiem danych.
Ponowne użycie obiektów Input-Layout
Każdy obiekt układu wejściowego jest tworzony na podstawie sygnatury shaderu. Pozwala to interfejsowi API zweryfikować elementy obiektu układu wejściowego względem sygnatury danych wejściowych shaderu, aby upewnić się, że typy i semantyka są dokładnie dopasowane. Można utworzyć pojedynczy obiekt układu wejściowego dla wielu cieniowaczy, o ile wszystkie sygnatury wejściowe cieniowaczy są dokładnie zgodne.
Wiązanie obiektów do etapu Input-Assembler
Po utworzeniu zasobów buforu wierzchołka i obiektu układu wejściowego można powiązać je z etapem IA, wywołując ID3D11DeviceContext::IASetVertexBuffers i ID3D11DeviceContext::IASetInputLayout. W poniższym przykładzie pokazano powiązanie pojedynczego buforu wierzchołka i obiektu układu wejściowego do etapu 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 );
Aby powiązać obiekt układu wejściowego, wystarczy wskaźnik do tego obiektu.
W poprzednim przykładzie jest związany pojedynczy bufor wierzchołków; jednak wiele buforów wierzchołków może być związanych przez jedno wywołanie ID3D11DeviceContext::IASetVertexBuffers, a następujący kod pokazuje takie wywołanie do związania trzech buforów wierzchołków:
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
Bufor indeksu zostaje powiązany z etapem IA, wywołując ID3D11DeviceContext::IASetIndexBuffer.
Określanie typu pierwotnego
Po powiązaniu buforów wejściowych, etap IA musi być poinformowany, jak zebrać wierzchołki w prymitywy. W tym celu należy określić typ pierwotny przez wywołanie ID3D11DeviceContext::IASetPrimitiveTopology; Poniższy kod wywołuje tę funkcję, aby zdefiniować dane jako listę trójkątów bez sąsiedztwa:
g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
Pozostałe typy pierwotne są wymienione w D3D_PRIMITIVE_TOPOLOGY.
Wywoływanie metod rysowania
Po powiązaniu zasobów wejściowych z potokiem aplikacja wywołuje metodę draw w celu renderowania elementów pierwotnych. W poniższej tabeli przedstawiono kilka metod rysowania; niektóre z nich używają buforów indeksów, niektóre danych instancji, a niektóre ponownie wykorzystują dane z etapu wynikowego przesyłania strumieniowego jako dane wejściowe do etapu asemblera wejściowego.
| Rysuj metody | Opis |
|---|---|
| ID3D11DeviceContext::Draw | Rysuj nieindeksowane, nieinstancjonowane prymitywy. |
| ID3D11DeviceContext::DrawInstanced | Rysuj nieindeksowane, wystąpienia pierwotne. |
| ID3D11DeviceContext::DrawIndexed | Rysuj indeksowane, nienależące do wystąpień typy pierwotne. |
| ID3D11DeviceContext::DrawIndexedInstanced | Rysuj indeksowane, instancjonowane prymitywy. |
| ID3D11DeviceContext::DrawAuto | Rysuj nieindeksowane, nieinstancjonowane prymitywy z danych wejściowych pochodzących z etapu przesyłania strumieniowego wyjściowych. |
Każda metoda rysowania renderuje jeden typ topologii. Podczas renderowania niekompletne prymitywy (te, które nie mają wystarczającej liczby wierzchołków, brak indeksów, częściowe prymitywy itd.) są dyskretnie odrzucane.
Tematy pokrewne