如何:建立常數緩衝區

常數緩衝區 包含著色器常數資料。 本主題說明如何初始化 常數緩衝區 ,以準備轉譯。

初始化常數緩衝區

  1. 定義描述頂點著色器常數資料的結構。

  2. 為您在步驟一中定義的結構配置記憶體。 使用頂點著色器常數資料填入此緩衝區。 您可以使用 mallocnew 來配置記憶體,也可以從堆疊配置結構的記憶體。

  3. 填入 D3D11_BUFFER_DESC 結構來建立緩衝區描述。 將D3D11_BIND_CONSTANT_BUFFER旗標傳遞至 BindFlags 成員,並將常數緩衝區描述結構的大小以位元組為單位傳遞至 ByteWidth 成員。

    注意

    D3D11_BIND_CONSTANT_BUFFER旗標無法與任何其他旗標結合。

     

  4. 填入 D3D11_SUBRESOURCE_DATA 結構,以建立子資源資料描述。 D3D11_SUBRESOURCE_DATA結構的pSysMem成員必須直接指向您在步驟二中建立的頂點著色器常數資料。

  5. 呼叫 ID3D11Device::CreateBuffer ,同時傳遞 D3D11_BUFFER_DESC 結構、 D3D11_SUBRESOURCE_DATA 結構,以及要初始化之 ID3D11Buffer 介面指標的位址。

這些程式碼範例示範如何建立常數緩衝區。

本範例假設 g_pd3dDevice 是有效的 ID3D11Device 物件, 而g_pd3dCoNtext 是有效的 ID3D11DeviceCoNtext 物件。

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

此範例顯示相關聯的 HLSL cbuffer 定義。

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

注意

請務必比對 C++ 中的VS_CONSTANT_BUFFER記憶體配置與 HLSL 配置。 如需 HLSL 如何處理記憶體中配置的資訊,請參閱 常數變數的封裝規則

 

緩衝區

如何使用 Direct3D 11