Como criar um buffer constante

Os buffers constantes contêm dados constantes do sombreador. Este tópico mostra como inicializar um buffer constante na preparação para renderização.

Para inicializar um buffer constante

  1. Defina uma estrutura que descreve os dados constantes do sombreador de vértice.

  2. Aloque memória para a estrutura que você definiu na etapa um. Preencha esse buffer com dados constantes do sombreador de vértice. Você pode usar malloc ou novo para alocar a memória ou alocar memória para a estrutura da pilha.

  3. Crie uma descrição do buffer preenchendo uma estrutura de D3D11_BUFFER_DESC . Passe o sinalizador D3D11_BIND_CONSTANT_BUFFER para o membro BindFlags e passe o tamanho da estrutura de descrição do buffer constante em bytes para o membro ByteWidth .

    Observação

    O sinalizador D3D11_BIND_CONSTANT_BUFFER não pode ser combinado com nenhum outro sinalizador.

     

  4. Crie uma descrição de dados de sub-recursos preenchendo uma estrutura de D3D11_SUBRESOURCE_DATA . O membro pSysMem da estrutura D3D11_SUBRESOURCE_DATA deve apontar diretamente para os dados constantes do sombreador de vértice que você criou na etapa dois.

  5. Chame ID3D11Device::CreateBuffer ao passar a estrutura D3D11_BUFFER_DESC , a estrutura D3D11_SUBRESOURCE_DATA e o endereço de um ponteiro para a interface ID3D11Buffer a ser inicializada.

Esses exemplos de código demonstram como criar um buffer constante.

Este exemplo pressupõe que g_pd3dDevice é um objeto ID3D11Device válido e que g_pd3dContext é um objeto ID3D11DeviceContext válido.

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 );
    

Este exemplo mostra a definição HLSL cbuffer associada.

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

Observação

Certifique-se de corresponder ao layout de memória VS_CONSTANT_BUFFER em C++ com o layout HLSL. Para obter informações sobre como o HLSL lida com o layout na memória, consulte Regras de empacotamento para variáveis constantes.

 

Buffers

Como usar o Direct3D 11