天天看點

d3d11的IASetVertexBuffers和IASetIndexBuffer學習

      之前一直搞不懂為何IASetVertexBuffers可以設定多個vertex buffer,而IASetIndexBuffer隻能設定一個index buffer,這怎麼能夠對應得上呢?

      這兩天要做一個東西,要從一個3ds檔案中讀出多個對象渲染出來,我以為這就可以将每個對象的頂點存到一個buffer數組中,再将這個buffer數組用IASetVertexBuffers設定為頂點緩存,每個slot設定一個vertex buffer。結果設定完後才發現index buffer 完全不知道該怎麼設定了,因為IASetIndexBuffer隻可以設定一個相應的索引數組。

       于是就開始了漫長的查資料之旅。原來我對IASetVertexBuffers中Buffers的了解從一開始就錯了,這個Buffers并不是指每個對象的頂點資料,而是指将一個頂點結構中的每個成分作為一個buffer輸入到各個slot中,而所有buffer合起來才表示一個對象的完整的頂點資料。例如:

       對象頂點結構為:

struct vertex{
       XMFLOAT3 pos;
       XMFLOAT3 color;
      };
           

為該頂點結建構立InputLayout: 

D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
	{
		{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
		{"COLOR",    0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}
	};
           

其中第四個參數表示input slot,表示position和color分兩個slot輸入。

下面再建立一個buffer數組:ID3D11Buffer*  buf[2];分别将對象的position和color成分存入這個buffer數組,并設定strides[2]和offsets[2],最後調用IASetVertexBuffers函數将這兩個buffer用于渲染:md3dDevicContext->IASetVertexBuffers(0,2,buf,strides,offsets);其中第一個參數表示開始的slot,第二個參數表示頂點數組的數量。而對于index buffer并不需要改變什麼。

轉載于:https://www.cnblogs.com/llping/p/3992733.html