방법: 상수 버퍼 만들기

상수 버퍼에는 셰이더 상수 데이터가 포함됩니다. 이 항목에서는 렌더링을 준비하기 위해 상수 버퍼 를 초기화하는 방법을 보여줍니다.

상수 버퍼를 초기화하려면

  1. 꼭짓점 셰이더 상수 데이터를 설명하는 구조를 정의합니다.

  2. 1단계에서 정의한 구조체에 대한 메모리를 할당합니다. 꼭짓점 셰이더 상수 데이터로 이 버퍼를 채웁니다. malloc 또는 new를 사용하여 메모리를 할당하거나 스택에서 구조체에 대한 메모리를 할당할 수 있습니다.

  3. D3D11_BUFFER_DESC 구조를 입력하여 버퍼 설명을 만듭니다. D3D11_BIND_CONSTANT_BUFFER 플래그를 BindFlags 멤버에 전달하고 상수 버퍼 설명 구조체의 크기를 바이트 단위로 ByteWidth 멤버에 전달합니다.

    참고

    D3D11_BIND_CONSTANT_BUFFER 플래그는 다른 플래그와 결합할 수 없습니다.

     

  4. D3D11_SUBRESOURCE_DATA 구조를 입력하여 하위 리소스 데이터 설명을 만듭니다. D3D11_SUBRESOURCE_DATA 구조체의 pSysMem 멤버는 2단계에서 만든 꼭짓점 셰이더 상수 데이터를 직접 가리킵니다.

  5. 초기화할 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이 메모리의 레이아웃을 처리하는 방법에 대한 자세한 내용은 상수 변수에 대한 패킹 규칙을 참조하세요.

 

버퍼

Direct3D 11을 사용하는 방법