共用方式為


建立緩衝區資源 (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)都必須在建立時初始化。 使用任何其他使用旗標的緩衝區可以在使用 CopyResourceCopySubresourceRegion UpdateSubresource 初始化之後更新,或使用 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介面實例會處理建立、系結和組合常數緩衝區的程式。 在此情況下,只需要使用 GetVariableByName其中一個 GetVariable 方法從效果中取得變數,並使用 SetMatrix其中一個 SetVariable 方法更新變數。 如需使用 ID3D10Effect介面 管理常數緩衝區的範例,請參閱 教學課程 7:紋理對應和常數緩衝區

資源 (Direct3D 10)