如何:建立常數緩衝區
常數緩衝區 包含著色器常數資料。 本主題說明如何初始化 常數緩衝區 ,以準備轉譯。
初始化常數緩衝區
定義描述頂點著色器常數資料的結構。
為您在步驟一中定義的結構配置記憶體。 使用頂點著色器常數資料填入此緩衝區。 您可以使用 malloc 或 new 來配置記憶體,也可以從堆疊配置結構的記憶體。
填入 D3D11_BUFFER_DESC 結構來建立緩衝區描述。 將D3D11_BIND_CONSTANT_BUFFER旗標傳遞至 BindFlags 成員,並將常數緩衝區描述結構的大小以位元組為單位傳遞至 ByteWidth 成員。
注意
D3D11_BIND_CONSTANT_BUFFER旗標無法與任何其他旗標結合。
填入 D3D11_SUBRESOURCE_DATA 結構,以建立子資源資料描述。 D3D11_SUBRESOURCE_DATA結構的pSysMem成員必須直接指向您在步驟二中建立的頂點著色器常數資料。
呼叫 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 如何處理記憶體中配置的資訊,請參閱 常數變數的封裝規則。
相關主題