방법: 상수 버퍼 만들기
상수 버퍼에는 셰이더 상수 데이터가 포함됩니다. 이 항목에서는 렌더링을 준비하기 위해 상수 버퍼 를 초기화하는 방법을 보여줍니다.
상수 버퍼를 초기화하려면
꼭짓점 셰이더 상수 데이터를 설명하는 구조를 정의합니다.
1단계에서 정의한 구조체에 대한 메모리를 할당합니다. 꼭짓점 셰이더 상수 데이터로 이 버퍼를 채웁니다. malloc 또는 new를 사용하여 메모리를 할당하거나 스택에서 구조체에 대한 메모리를 할당할 수 있습니다.
D3D11_BUFFER_DESC 구조를 입력하여 버퍼 설명을 만듭니다. D3D11_BIND_CONSTANT_BUFFER 플래그를 BindFlags 멤버에 전달하고 상수 버퍼 설명 구조체의 크기를 바이트 단위로 ByteWidth 멤버에 전달합니다.
참고
D3D11_BIND_CONSTANT_BUFFER 플래그는 다른 플래그와 결합할 수 없습니다.
D3D11_SUBRESOURCE_DATA 구조를 입력하여 하위 리소스 데이터 설명을 만듭니다. D3D11_SUBRESOURCE_DATA 구조체의 pSysMem 멤버는 2단계에서 만든 꼭짓점 셰이더 상수 데이터를 직접 가리킵니다.
초기화할 ID3D11Buffer 인터페이스에 대한 D3D11_BUFFER_DESC 구조체, D3D11_SUBRESOURCE_DATA 구조체 및 포인터의 주소를 전달하면서 ID3D11Device::CreateBuffer를 호출합니다.
이러한 코드 예제에서는 상수 버퍼를 만드는 방법을 보여 줍니다.
이 예제에서는 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이 메모리의 레이아웃을 처리하는 방법에 대한 자세한 내용은 상수 변수에 대한 패킹 규칙을 참조하세요.
관련 항목