版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyafang123/article/details/89638051
常量缓冲区包含着色器常量数据.本节描述如何在准备渲染时初始化常量缓冲区。
初始化常量缓冲区
- 定义描述常量数据的结构。
- 通过填充D3D11_BUFFER_DESC结构创建缓冲区描述,将D3D11_BIND_CONSTANT_BUFFER标志传递给BindFlags成员,并将常量缓冲区描述结构的大小(以字节为单位)传递给ByteWidth成员。注意,D3D11_BIND_CONSTANT_BUFFER标志不能与任何其他标志组合。
- 调用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
{
D3DXMATRIX mWorldViewProj;
D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
float fSomeFloatThatMayBeNeededByASpecificShader;
float fTime;
float fSomeFloatThatMayBeNeededByASpecificShader2;
float fSomeFloatThatMayBeNeededByASpecificShader3;
};
// 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;
// Create the buffer.
hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL,
&g_pConstantBuffer11 );
if( FAILED( hr ) )
return hr;
// Set the buffer.
g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer11 );