(Direct3D 10) 建立緩衝區資源

建立緩衝區需要定義緩衝區將儲存的資料、提供初始化資料,以及設定適當的使用方式和系結旗標。 若要建立紋理,請參閱 建立紋理資源 (Direct3D 10)

建立頂點緩衝區

建立 頂點緩衝區 的步驟如下。

建立緩衝區描述

建立頂點緩衝區時, (請參閱 D3D10_BUFFER_DESC) 用來定義如何在緩衝區內組織資料、管線如何存取緩衝區,以及緩衝區的使用方式。

下列範例示範如何為包含位置和色彩值的頂點的單一三角形建立緩衝區描述。

struct SimpleVertex
{
    D3DXVECTOR3 Position;  
    D3DXVECTOR3 Color;  
};

    D3D10_BUFFER_DESC bufferDesc;
    bufferDesc.Usage            = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth        = sizeof( SimpleVertex ) * 3;
    bufferDesc.BindFlags        = D3D10_BIND_VERTEX_BUFFER;
    bufferDesc.CPUAccessFlags   = 0;
    bufferDesc.MiscFlags        = 0;

在此範例中,緩衝區描述是使用方式CPU 存取和其他旗標的所有預設設定初始化。 其他設定則用於 系結旗標 ,此旗標只會將資源識別為頂點緩衝區,以及緩衝區的大小。

使用方式和 CPU 存取旗標對於效能很重要。 這兩個旗標會一起決定資源存取的頻率、可以載入資源的記憶體類型,以及哪些處理器需要存取資源。 此資源的預設使用量不會非常頻繁地更新。 將 CPU 存取設定為 0 表示 CPU 不需要讀取或寫入資源。 結合使用,這表示執行時間可以將資源載入 GPU 的最高效能記憶體,因為資源不需要 CPU 存取。

如預期般,處理器在最佳效能與任何時間協助工具之間有取捨。 例如,沒有 CPU 存取的預設使用量表示資源可以獨佔方式提供給 GPU 使用。 這可能包括將資源載入 CPU 無法直接存取的記憶體中。 只能使用 UpdateSubresource修改資源。

建立緩衝區的初始化資料

緩衝區只是專案的集合,並配置為 1D 陣列。 因此,系統記憶體音調和系統記憶體配量配量音調都相同;頂點資料宣告的大小。 當使用 子資源描述建立緩衝區時,應用程式可以提供初始化資料,其中包含實際資源資料的指標,並包含該資料的大小和配置的相關資訊。

使用不可變使用方式建立的任何緩衝區 (請參閱 D3D10_USAGE_IMMUTABLE) 必須在建立時初始化。 使用 CopyResourceCopySubresourceRegionUpdateSubresource初始化之後,也可以使用 Map 方法來存取其基礎記憶體,來更新使用任何其他使用旗標的緩衝區。

建立緩衝區

使用緩衝區描述和初始化資料 (,這是選擇性的) 呼叫 CreateBuffer 來建立頂點緩衝區。 下列程式碼片段示範如何從應用程式所宣告的頂點資料陣列建立頂點緩衝區。

struct SimpleVertexCombined
{
    D3DXVECTOR3 Pos;  
    D3DXVECTOR3 Col;  
};


ID3D10InputLayout* g_pVertexLayout = NULL;
ID3D10Buffer*      g_pVertexBuffer[2] = { NULL, NULL };
ID3D10Buffer*      g_pIndexBuffer = NULL;


SimpleVertexCombined verticesCombo[] =
{
    D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
    D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),
    D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
    D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),
    D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
    D3DXVECTOR3( 0.0f, 0.5f, 0.0f ),
};


    D3D10_BUFFER_DESC bufferDesc;
    bufferDesc.Usage            = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth        = sizeof( SimpleVertexCombined ) * 3;
    bufferDesc.BindFlags        = D3D10_BIND_VERTEX_BUFFER;
    bufferDesc.CPUAccessFlags   = 0;
    bufferDesc.MiscFlags        = 0;
    
    D3D10_SUBRESOURCE_DATA InitData;
    InitData.pSysMem = verticesCombo;
    InitData.SysMemPitch = 0;
    InitData.SysMemSlicePitch = 0;
    hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer[0] );

建立索引緩衝區

建立索引緩衝區非常類似于建立頂點緩衝區;有兩個差異。 索引緩衝區只包含 16 位或 32 位的資料 (,而不是頂點緩衝區可用的各種格式。 索引緩衝區也需要索引緩衝區系結旗標。

下列範例示範如何從索引資料陣列建立索引緩衝區。

ID3D10Buffer *g_pIndexBuffer = NULL;

    // Create indices
    unsigned int indices[] = { 0, 1, 2 };

    D3D10_BUFFER_DESC bufferDesc;
    bufferDesc.Usage           = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth       = sizeof( unsigned int ) * 3;
    bufferDesc.BindFlags       = D3D10_BIND_INDEX_BUFFER;
    bufferDesc.CPUAccessFlags  = 0;
    bufferDesc.MiscFlags       = 0;

    D3D10_SUBRESOURCE_DATA InitData;
    InitData.pSysMem = indices;
    InitData.SysMemPitch = 0;
    InitData.SysMemSlicePitch = 0;
    hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pIndexBuffer );
    if( FAILED( hr ) )
        return hr;
  
    g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );

建立常數緩衝區

Direct3D 10 引進常數緩衝區。 常數緩衝區或著色器常數緩衝區是包含著色器常數的緩衝區。 以下是建立常數緩衝區的範例,取自 HLSLWithoutFX10 範例

ID3D10Buffer*   g_pConstantBuffer10 = NULL;

struct VS_CONSTANT_BUFFER
{
    D3DXMATRIX mWorldViewProj;      //mWorldViewProj will probably be global to all shaders in a project.
                                    //It's a good idea not to move it around between shaders.
    D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;                    //fTime may also be global to all shaders in a project.
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
};

    D3D10_BUFFER_DESC cbDesc;
    cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
    cbDesc.Usage = D3D10_USAGE_DYNAMIC;
    cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
    cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
    cbDesc.MiscFlags = 0;
    hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer10 );
    if( FAILED( hr ) )
       return hr;

    g_pd3dDevice->VSSetConstantBuffers( 0, 1, g_pConstantBuffer10 );

請注意,使用 ID3D10Effect 介面時ID3D10Effect 介面 實例會處理建立、系結和組合常數緩衝區的程式。 在此情況下,只有 nescesary,才能使用 GetVariableByName 等其中一個 GetVariable 方法從效果取得變數,並使用 SetMatrix等其中一個 SetVariable 方法更新變數。 如需使用 ID3D10Effect 介面 來管理常數緩衝區的範例,請參閱 教學課程 7:紋理對應和常數緩衝區

(Direct3D 10)