Sdílet prostřednictvím


Jak na to: Vytvoření konstantní vyrovnávací paměti

Konstantní buffery obsahují konstantní data shaderů. Toto téma ukazuje, jak inicializovat konstantní vyrovnávací paměť při přípravě na vykreslení.

Inicializovat konstantní vyrovnávací paměť

  1. Definujte strukturu, která popisuje konstantní data vrcholového shaderu.

  2. Přidělte paměť pro strukturu, kterou jste definovali v kroku 1. Vyplňte tuto vyrovnávací paměť konstantními daty vrcholového shaderu. K přidělení paměti můžete použít malloc nebo new, nebo můžete přidělit paměť pro strukturu ze zásobníku.

  3. Vytvořte popis vyrovnávací paměti vyplněním struktury D3D11_BUFFER_DESC. Předejte příznak D3D11_BIND_CONSTANT_BUFFER členu BindFlags a zadejte velikost struktury popisu konstantní vyrovnávací paměti v bajtech členu ByteWidth.

    Poznámka

    Příznak D3D11_BIND_CONSTANT_BUFFER nelze kombinovat s jinými příznaky.

     

  4. Vytvořte popis dat podsouboru vyplněním struktury D3D11_SUBRESOURCE_DATA. pSysMem člen struktury D3D11_SUBRESOURCE_DATA musí odkazovat přímo na konstantní data vrcholového shaderu, která jste vytvořili v kroku 2.

  5. Volání ID3D11Device::CreateBuffer při předávání struktury D3D11_BUFFER_DESC, struktury D3D11_SUBRESOURCE_DATA a adresy ukazatele na rozhraní ID3D11Buffer k inicializaci.

Tyto příklady kódu ukazují, jak vytvořit konstantní vyrovnávací paměť.

Tento příklad předpokládá, že g_pd3dDevice je platný ID3D11Device objekt a že g_pd3dContext je platný ID3D11DeviceContext objektu.

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

Tento příklad ukazuje přidruženou definici HLSL cbuffer.

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

Poznámka

Ujistěte se, že rozložení paměti VS_CONSTANT_BUFFER v jazyce C++ odpovídá rozložení HLSL. Informace o tom, jak HLSL zpracovává rozložení v paměti, naleznete v tématu Balicí pravidla pro konstantní proměnné.

 

Vyrovnávací paměti

Jak používat Direct3D 11