Direct3D 11 中的緩衝區簡介
緩衝區資源是一個完整輸入的資料集合,由元素所組成。 您可以使用緩衝區存放各式各樣的資料,包含位置向量、法向向量、頂點緩衝區中的紋理座標、索引緩衝區中的索引、或裝置狀態。 緩衝元素由 1 到 4 個元件組成。 緩衝元素可以包含封裝資料值 (像是 R8G8B8A8 面值)、單一 8 位整數,或四個 32 位元浮點數值。
建立緩衝區做為未結構化的資源。 因為未建立,緩衝不能包含任何 mipmap 層次,當讀取時無法篩選,而且無法多重採樣。
緩衝區類型
以下是 Direct3D 11 支援的緩衝區資源類型。 所有緩衝區類型都是由 ID3D11Buffer 介面封裝。
頂點緩衝區
頂點緩衝區包含用來定義您的幾何頂點資料。 頂點資料包括位置座標、色彩資料、紋理座標資料、一般資料等等。
最簡單的頂點緩衝區範例是僅包含位置資料者。 它可以像下圖一樣視覺化。
頂點緩衝區經常包含可完整指定 3D 頂點所需的所有資料。 例如,可能會包含每個頂點位置、一般及紋理座標的頂點緩衝區。 此資料通常組織成每個頂點元素集,如下圖所示。
這個頂點緩衝區包含每個頂點資料,而每個頂點儲存三個元素 (位置、一般和紋理座標)。 位置和一般通常會使用三個 32 位浮點數 (DXGI_FORMAT_R32G32B32_FLOAT) 指定,並使用兩個 32 位浮點數的紋理座標 (DXGI_FORMAT_R32G32_FLOAT) 。
若要存取頂點緩衝區的資料,您需要知道所存取的頂點,再加上以下額外緩衝區參數︰
- 位移 - 從緩衝區的起始到第一個頂點資料的位元組數目。 您可以使用 ID3D11DeviceCoNtext::IASetVertexBuffers 方法來指定位移。
- BaseVertexLocation - 從頂點緩衝區讀取頂點之前,新增至每個索引的值。
建立頂點緩衝區之前,您必須建立 ID3D11InputLayout 介面來定義其配置;這是藉由呼叫 ID3D11Device::CreateInputLayout 方法來完成。 建立輸入設定物件之後,您可以呼叫 ID3D11DeviceCoNtext::IASetInputLayout,將它系結至輸入組合器階段。
若要建立頂點緩衝區,請呼叫 ID3D11Device::CreateBuffer。
索引緩衝區
索引緩衝包含整數位移至頂點緩衝區,可用於更有效率地呈現基本類型。 索引緩衝區包含連續的 16 位元或 32 位元索引集,而每個索引用來識別頂點緩衝區中的頂點。 索引緩衝區可以視覺化,如下圖所示。
儲存在索引緩衝區中的循序索引,使用以下參數尋找︰
- Offset - 索引緩衝的基底位址的位元組數目。 位移會提供給 ID3D11DeviceCoNtext::IASetIndexBuffer 方法。
- StartIndexLocation - 指定基底位址中的第一個索引緩衝區元素,以及 IASetIndexBuffer中提供的位移。 開始位置會提供給 ID3D11DeviceCoNtext::D rawIndexed 或 ID3D11DeviceCoNtext::D rawIndexedInstanced 方法,並代表要轉譯的第一個索引。
- IndexCount - 要呈現的索引數目。 數位會提供給 DrawIndexed 方法
索引緩衝區的開頭 = 索引緩衝區基底位址 + 位移 (位元組) + StartIndexLocation * ElementSize (位元組) ;
在這個運算中,ElementSize 是各索引緩衝元素的大小,不是兩個就是四個位元組。
若要建立索引緩衝區,請呼叫 ID3D11Device::CreateBuffer。
常數緩衝區
常數緩衝區可讓您有效率地提供著色器常數資料至管線。 您可以使用常數緩衝區來儲存資料流輸出階段的結果。 概念上,常數緩衝區看起來很像單一元素頂點緩衝區,如下圖所示。
每個元素會儲存 1 到 4 個元件常數,取決於儲存的資料格式。 若要建立著色器常數緩衝區,請呼叫 ID3D11Device::CreateBuffer ,並指定 D3D11_BIND_FLAG 列舉類型的 D3D11_BIND_CONSTANT_BUFFER 成員。
常數緩衝區只能使用單一系結旗標 (D3D11_BIND_CONSTANT_BUFFER) ,無法與任何其他系結旗標結合。 若要將著色器常數緩衝區系結至管線,請呼叫下列其中一種方法: ID3D11DeviceCoNtext::GSSetConstantBuffers、 ID3D11DeviceCoNtext::P SSetConstantBuffers或 ID3D11DeviceCoNtext::VSSetConstantBuffers。
若要從著色器讀取著色器常數緩衝區,請使用 HLSL 載入函式 (例如 Load) 。 每個著色器階段允許最多 15 個著色器常數緩衝區,而每個緩衝區可保留最多 4096 個常數。
相關主題