Share via


Procédure : créer une mémoire tampon constante

Les mémoires tampons constantes contiennent des données de constante du nuanceur. Cette rubrique montre comment initialiser une mémoire tampon constante en préparation du rendu.

Pour initialiser une mémoire tampon constante

  1. Définissez une structure qui décrit les données de constante du nuanceur de vertex.

  2. Allouez de la mémoire pour la structure que vous avez définie à l’étape 1. Remplissez cette mémoire tampon avec des données de constante de nuanceur de vertex. Vous pouvez utiliser malloc ou new pour allouer la mémoire, ou vous pouvez allouer de la mémoire pour la structure à partir de la pile.

  3. Créez une description de mémoire tampon en remplissant une structure D3D11_BUFFER_DESC . Transmettez l’indicateur D3D11_BIND_CONSTANT_BUFFER au membre BindFlags et transmettez la taille de la structure de description de mémoire tampon constante en octets au membre ByteWidth .

    Notes

    L’indicateur D3D11_BIND_CONSTANT_BUFFER ne peut pas être combiné avec d’autres indicateurs.

     

  4. Créez une description des données de sous-ressource en remplissant une structure D3D11_SUBRESOURCE_DATA . Le membre pSysMem de la structure D3D11_SUBRESOURCE_DATA doit pointer directement vers les données de constante du nuanceur de vertex que vous avez créées à l’étape 2.

  5. Appelez ID3D11Device::CreateBuffer en passant la structure D3D11_BUFFER_DESC , la structure D3D11_SUBRESOURCE_DATA et l’adresse d’un pointeur vers l’interface ID3D11Buffer à initialiser.

Ces exemples de code montrent comment créer une mémoire tampon constante.

Cet exemple part du principe que g_pd3dDevice est un objet ID3D11Device valide et que g_pd3dContext est un objet ID3D11DeviceContext valide.

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

Cet exemple montre la définition cbuffer HLSL associée.

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

Notes

Veillez à faire correspondre la disposition de mémoire VS_CONSTANT_BUFFER en C++ avec la disposition HLSL. Pour plus d’informations sur la façon dont HLSL gère la disposition en mémoire, consultez Règles d’emballage pour les variables constantes.

 

Mémoires tampons

Comment utiliser Direct3D 11