Procedura: Creare un buffer costante

I buffer costanti contengono dati costanti dello shader. In questo argomento viene illustrato come inizializzare un buffer costante in preparazione per il rendering.

Per inizializzare un buffer costante

  1. Definire una struttura che descrive i dati costanti del vertex shader.

  2. Allocare memoria per la struttura definita nel passaggio 1. Riempire questo buffer con i dati costanti del vertex shader. È possibile usare malloc o new per allocare la memoria oppure allocare memoria per la struttura dallo stack.

  3. Creare una descrizione del buffer compilando una struttura D3D11_BUFFER_DESC . Passare il flag D3D11_BIND_CONSTANT_BUFFER al membro BindFlags e passare le dimensioni della struttura di descrizione del buffer costante in byte al membro ByteWidth .

    Nota

    Il flag D3D11_BIND_CONSTANT_BUFFER non può essere combinato con altri flag.

     

  4. Creare una descrizione dei dati di sottorisorsa compilando una struttura D3D11_SUBRESOURCE_DATA . Il membro pSysMem della struttura D3D11_SUBRESOURCE_DATA deve puntare direttamente ai dati costanti del vertex shader creati nel passaggio 2.

  5. Chiamare ID3D11Device::CreateBuffer passando la struttura D3D11_BUFFER_DESC , la struttura D3D11_SUBRESOURCE_DATA e l'indirizzo di un puntatore all'interfaccia ID3D11Buffer per l'inizializzazione.

Questi esempi di codice illustrano come creare un buffer costante.

Questo esempio presuppone che g_pd3dDevice sia un oggetto ID3D11Device valido e che g_pd3dContext sia un oggetto ID3D11DeviceContext valido.

ID3D11Buffer*   g_pConstantBuffer11 = NULL;

// Define the constant data used to communicate with shaders.
struct VS_CONSTANT_BUFFER
{
    XMFLOAT4X4 mWorldViewProj;                              
    XMFLOAT4 vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;                                            
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
} VS_CONSTANT_BUFFER;

// Supply the vertex shader constant data.
VS_CONSTANT_BUFFER VsConstData;
VsConstData.mWorldViewProj = {...};
VsConstData.vSomeVectorThatMayBeNeededByASpecificShader = XMFLOAT4(1,2,3,4);
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader = 3.0f;
VsConstData.fTime = 1.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader2 = 2.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader3 = 4.0f;

// Fill in a buffer description.
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;

// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = &VsConstData;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;

// Create the buffer.
hr = g_pd3dDevice->CreateBuffer( &cbDesc, &InitData, 
                                 &g_pConstantBuffer11 );

if( FAILED( hr ) )
   return hr;

// Set the buffer.
g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer11 );
    

Questo esempio mostra la definizione cbuffer HLSL associata.

cbuffer VS_CONSTANT_BUFFER : register(b0)
{
    matrix mWorldViewProj;
    float4  vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
};

Nota

Assicurarsi di corrispondere al layout di memoria VS_CONSTANT_BUFFER in C++ con il layout HLSL. Per informazioni su come HLSL gestisce il layout in memoria, vedi Regole di compressione per variabili costanti.

 

Buffer

Come usare Direct3D 11