開始使用輸入組合器階段

初始化輸入組合器 (IA) 階段需要幾個步驟。 例如,您需要使用管線所需的頂點數據來建立緩衝區資源,告訴 IA 階段緩衝區的所在位置,以及其所包含的數據類型,以及指定要從數據組合的基本類型。

本主題涵蓋設定 IA 階段的基本步驟,如下表所示。

步驟 描述
建立輸入緩衝區 使用輸入頂點數據建立和初始化輸入緩衝區。
建立 Input-Layout 物件 定義頂點緩衝區數據如何使用輸入配置物件串流至 IA 階段。
將對象系結至輸入組合器階段 將建立的物件(輸入緩衝區和輸入配置物件)系結至IA階段。
指定基本類型 識別頂點如何組合成基本類型。
呼叫 Draw 方法 透過管線傳送系結至 IA 階段的數據。

 

了解這些步驟之後,請繼續使用 系統產生的值

建立輸入緩衝區

輸入緩衝區有兩種類型: 頂點緩衝區 和索引緩衝區。 頂點緩衝區會將頂點數據提供給 IA 階段。 索引緩衝區是選擇性的;它們會從頂點緩衝區提供頂點的索引。 您可以建立一或多個頂點緩衝區,並選擇性地建立索引緩衝區。

建立緩衝區資源之後,您必須建立輸入配置物件來描述 IA 階段的數據配置,然後您必須將緩衝區資源系結至 IA 階段。 如果您的著色器不使用緩衝區,則不需要建立和系結緩衝區。 如需繪製單一三角形的簡單頂點和像素著色器的範例,請參閱 使用不含緩衝區的輸入組合器階段。

如需建立頂點緩衝區的說明,請參閱 如何:建立頂點緩衝區。 如需建立索引緩衝區的說明,請參閱 如何:建立索引緩衝區

建立 Input-Layout 物件

輸入配置物件會封裝 IA 階段的輸入狀態。 這包括系結至 IA 階段的輸入數據描述。 數據會從記憶體、一或多個頂點緩衝區串流至IA階段。 描述會識別從一或多個頂點緩衝區系結的輸入數據,並讓運行時間能夠針對著色器輸入參數類型檢查輸入數據類型。 此類型檢查不僅會驗證類型是否相容,而且會確認著色器所需的每個元素都可以在緩衝區資源中使用。

輸入配置對像是從輸入元素描述的數位和已編譯著色器的指標建立的(請參閱ID3D11Device::CreateInputLayout)。 數位包含一或多個輸入元素;每個輸入元素都會描述來自單一頂點緩衝區的單一頂點數據元素。 整個輸入元素描述集描述會描述所有頂點緩衝區的所有頂點數據元素,這些緩衝區將會系結至IA階段。

下列版面設定描述描述包含三個頂點資料元素的單一頂點緩衝區:

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

輸入元素描述會描述頂點緩衝區中單一頂點所包含的每個元素,包括大小、類型、位置和用途。 每個數據列都會使用語意、語意索引和數據格式來識別數據類型。 語 是文字字串,可識別數據的使用方式。 在此範例中,第一個數據列會識別 3 個元件的位置數據(例如 xyz):第二個數據列會識別 2 個元件紋理數據(例如 UV),而第三個數據列會識別一般數據。

在此輸入元素描述的範例中,這三個數據列的語意索引(也就是第二個參數)會設定為零。 語意索引有助於區分使用相同語意的兩個數據列。 由於此範例中沒有類似的語意,因此語意索引可以設定為其預設值零。

第三個參數是 格式。 格式 (請參閱 DXGI_FORMAT) 會指定每個元素的元件數目,以及定義每個元素數據大小的數據類型。 格式可以在資源建立時完整輸入,或者您可以使用DXGI_FORMAT來建立資源,以識別元素中的元件數目,但未定義數據類型。

輸入位置

數據會透過稱為 輸入位置的輸入進入 IA 階段,如下圖所示。 IA 階段有 n 個輸入位置,其設計目的是要容納最多 n 個提供輸入數據的頂點緩衝區。 每個頂點緩衝區都必須指派給不同的位置;建立輸入配置物件時,這項資訊會儲存在輸入配置宣告中。 您也可以指定從每個緩衝區開頭到要讀取之緩衝區中第一個專案的位移。

illustration of the input slots for the ia stage

接下來的兩個參數是 輸入位置輸入位移。 當您使用多個緩衝區時,您可以將它們系結至一或多個輸入位置。 輸入位移是緩衝區開頭與數據開頭之間的位元組數目。

重複使用 Input-Layout 物件

每個輸入配置物件都是根據著色器簽章建立的;這可讓 API 根據著色器輸入簽章驗證 input-layout-object 元素,以確保類型和語意完全相符。 您可以為許多著色器建立單一輸入配置物件,只要所有著色器輸入簽章完全相符即可。

將對象系結至輸入組合器階段

建立頂點緩衝區資源和輸入配置對象之後,您可以呼叫 ID3D11DeviceContext::IASetVertexBuffers ID3D11DeviceContext::IASetInputLayout 將它們系結至 IA 階段。 下列範例顯示單一頂點緩衝區和輸入配置物件的系結至 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 );

系結輸入配置物件只需要物件的指標。

在上述範例中,會系結單一頂點緩衝區;不過,多個頂點緩衝區可以透過對ID3D11DeviceContext::IASetVertexBuffers的單一呼叫來系結,而下列程式代碼會顯示系結三個頂點緩衝區的這類呼叫:

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

索引緩衝區會藉由呼叫 ID3D11DeviceContext::IASetIndexBuffer來系結至IA階段。

指定基本類型

系結輸入緩衝區之後,必須告知 IA 階段如何將頂點組合成基本類型。 這是藉由呼叫 ID3D11DeviceContext::IASetPrimitiveTopology 來指定基本類型來完成;下列程式代碼會呼叫此函式,將數據定義為沒有相鄰的三角形清單:

g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

其餘的基本類型會列在D3D_PRIMITIVE_TOPOLOGY

呼叫 Draw 方法

在輸入資源系結至管線之後,應用程式會呼叫繪製方法來轉譯基本類型。 下表顯示數個繪製方法:有些使用索引緩衝區,有些則使用實例數據,有些則重複使用串流輸出階段中的數據做為輸入組合器階段的輸入。

繪製方法 描述
ID3D11DeviceContext::D raw 繪製非索引的非實例基本類型。
ID3D11DeviceContext::D rawInstanced 繪製未編製索引、實例的基本類型。
ID3D11DeviceContext::D rawIndexed 繪製已編製索引的非實例基本類型。
ID3D11DeviceContext::D rawIndexedInstanced 繪製已編製索引的實例基本類型。
ID3D11DeviceContext::D rawAuto 從來自串流輸出階段的輸入數據,繪製非索引的非實例基本類型。

 

每個繪製方法都會轉譯單一拓撲類型。 在轉譯期間,未完成的基本類型(沒有足夠頂點、缺少索引、部分基本類型等等)會以無訊息方式捨棄。

輸入組合器階段