Freigeben über


Vorgehensweise: Erstellen eines Konstantenpuffers

Konstantenpuffer enthalten Shaderkonstantendaten. In diesem Thema wird gezeigt, wie Sie einen Konstantenpuffer in Vorbereitung auf das Rendern initialisieren.

So initialisieren Sie einen Konstantenpuffer

  1. Definieren Sie eine Struktur, die die Vertex-Shaderkonstantendaten beschreibt.

  2. Ordnen Sie Arbeitsspeicher für die Struktur zu, die Sie in Schritt 1 definiert haben. Füllen Sie diesen Puffer mit Vertex-Shaderkonstantendaten. Sie können malloc oder new verwenden, um den Arbeitsspeicher zuzuweisen, oder Sie können Arbeitsspeicher für die Struktur aus dem Stapel zuweisen.

  3. Erstellen Sie eine Pufferbeschreibung, indem Sie eine D3D11_BUFFER_DESC Struktur ausfüllen. Übergeben Sie das D3D11_BIND_CONSTANT_BUFFER-Flag an das BindFlags-Element , und übergeben Sie die Größe der Beschreibungsstruktur des konstanten Puffers in Bytes an das ByteWidth-Element .

    Hinweis

    Das D3D11_BIND_CONSTANT_BUFFER-Flag kann nicht mit anderen Flags kombiniert werden.

     

  4. Erstellen Sie eine Beschreibung der Unterressourcendaten, indem Sie eine D3D11_SUBRESOURCE_DATA-Struktur ausfüllen. Das pSysMem-Element der D3D11_SUBRESOURCE_DATA-Struktur muss direkt auf die Vertex-Shaderkonstante zeigen, die Sie in Schritt 2 erstellt haben.

  5. Rufen Sie ID3D11Device::CreateBuffer auf, während Sie die D3D11_BUFFER_DESC-Struktur , die D3D11_SUBRESOURCE_DATA-Struktur und die Adresse eines Zeigers auf die ID3D11Buffer-Schnittstelle übergeben, die initialisiert werden soll.

In diesen Codebeispielen wird veranschaulicht, wie ein Konstantenpuffer erstellt wird.

In diesem Beispiel wird davon ausgegangen, dass g_pd3dDevice ein gültiges ID3D11Device-Objekt ist und g_pd3dContext ein gültiges ID3D11DeviceContext-Objekt ist.

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

Dieses Beispiel zeigt die zugeordnete HLSL cbuffer-Definition.

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

Hinweis

Stellen Sie sicher, dass Sie das VS_CONSTANT_BUFFER Speicherlayout in C++ mit dem HLSL-Layout abgleichen. Informationen dazu, wie HLSL das Layout im Arbeitsspeicher verarbeitet, finden Sie unter Packregeln für konstante Variablen.

 

Puffer

Verwenden von Direct3D 11