Cómo: Crear un búfer de constantes

Los búferes de constantes contienen datos constantes del sombreador. En este tema se muestra cómo inicializar un búfer de constantes en preparación para la representación.

Para inicializar un búfer de constantes

  1. Defina una estructura que describa los datos constantes del sombreador de vértices.

  2. Asigne memoria para la estructura que definió en el paso uno. Rellene este búfer con datos constantes del sombreador de vértices. Puede usar malloc o nuevo para asignar la memoria, o bien puede asignar memoria para la estructura de la pila.

  3. Cree una descripción del búfer rellenando una estructura de D3D11_BUFFER_DESC . Pase la marca D3D11_BIND_CONSTANT_BUFFER al miembro BindFlags y pase el tamaño de la estructura de descripción del búfer de constantes en bytes al miembro ByteWidth .

    Nota

    La marca D3D11_BIND_CONSTANT_BUFFER no se puede combinar con ninguna otra marca.

     

  4. Cree una descripción de datos subrecursos rellenando una estructura de D3D11_SUBRESOURCE_DATA . El miembro pSysMem de la estructura D3D11_SUBRESOURCE_DATA debe apuntar directamente a los datos constantes del sombreador de vértices que creó en el paso dos.

  5. Llame a ID3D11Device::CreateBuffer mientras pasa la estructura de D3D11_BUFFER_DESC , la estructura D3D11_SUBRESOURCE_DATA y la dirección de un puntero a la interfaz ID3D11Buffer para inicializar.

Estos ejemplos de código muestran cómo crear un búfer de constantes.

En este ejemplo se supone que g_pd3dDevice es un objeto ID3D11Device válido y que g_pd3dContext es un 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 );
    

En este ejemplo se muestra la definición de cbuffer de HLSL asociada.

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

Nota

Asegúrese de que coincida con el diseño de memoria VS_CONSTANT_BUFFER en C++ con el diseño de HLSL. Para obtener información sobre cómo HLSL controla el diseño en memoria, consulte Reglas de empaquetado para variables constantes.

 

Búferes

Cómo usar Direct3D 11