[DX11_#1]D3D Buffer( 1 / 2 )

DirectX 11 2009. 9. 22. 20:49 Posted by 알 수 없는 사용자

안녕하세요. Q3에 합류한 안승근입니다.
앞으로 DX11에 와서 변경된 내용 중 기초적인 부분을 담당하여 글을 올리도록 하겠습니다.
 
대부분의 내용은 DX9와 비교해 변경된 사항에 대해 언급 하도록 하겠습니다.

글을 읽으시다 틀린 내용에 대해서는 코멘트를 주시면 감사하겠습니다.

 
 첫 주제는 D3D11 Buffer입니다.
D3D11에는 아래와 같이 총 3개의 버퍼 타입이 있습니다.

Buffer Type: Vertex Buffer, Index Buffer, Constant Buffer

 

1) Vertex Buffer

각 정점의 정보를 직접적으로 저장해놓고 사용하는 방식.

간단히 사용할 수 있으나 중복된 정점의 위치를 여러개 저장하고 사용하는 등 능률은 높지 않다.

 

 



2) Index Buffer

IndexVertex Buffer의 정점 정보를 얻어 사용할 수 있다.

 Vertex Buffer Index Buffer는 같은 정점에 대해서는 Index로 위치 정보를 공유해서 사용하기 때문에 능률이 높아진다.

 


* DX9
DX11의 버퍼 생성시 차이점

IDirect3DDevice9::CreateVertexBuffer

ð  ID3D11Device::CreateBuffer

DX9에서는 아래와 같이 각각의 버퍼를 생성하는 함수가 따로 존재하였습니다.

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),

                                           0, D3DFVF_CUSTOMVERTEX,

                                           D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )

{

    return E_FAIL;

}

 

if( FAILED( g_pd3dDevice->CreateIndexBuffer( 12 * sizeof(MYINDEX),

 0, D3DFMT_INDEX16,
 D3DPOOL_DEFAULT, &g_pIB, NULL ) ) )

{

    return E_FAIL;

}

 

정점을 생성하는 방법이 DX11에 와서는 한개의 함수로 통합해서 사용하고 아래와 같이 D3D11_BUFFER_DESC에 버퍼 생성에 필요한 옵션을 넣었고, 특히 멤버변수인 BindFlags를 변경해 어떤 버퍼를 생성할지 정할 수 있도록 하였습니다.
 위의 함수들을 다시 보면 왜 굳이 나눠 놓았을까 싶을 정도로 함수 이름만 다를뿐 파라미터가 거의 동일합니다.

   // Define the data-type that
   // describes a vertex.
   struct SimpleVertexCombined
   {
       D3DXVECTOR3 Pos; 
       D3DXVECTOR3 Col; 
   };

   // Supply the actual vertex data.
   SimpleVertexCombined verticesCombo[] =
   {
       D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
       D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),
       D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
       D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),
       D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
       D3DXVECTOR3( 0.0f, 0.5f, 0.0f ),
   };

   // Create indices.
  
unsigned int indices[] = { 0, 1, 2 };


   
// Setup constant buffers
    D3D11_BUFFER_DESC BufDesc;
    // Vertex Buffer Size
    BufDesc.ByteWidth        = sizeof( SimpleVertexCombined ) * 3;
    // Index Buffer Size

    // BufDesc.ByteWidth       = sizeof( unsigned int ) * 3;

    BufDesc.Usage = D3D11_USAGE_DYNAMIC;

    BufDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // D3D11_BIND_INDEX_BUFFER

// , D3D10_BIND_CONSTANT_BUFFER...

    BufDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

    BufDesc.MiscFlags = 0;

    pd3dDevice->CreateBuffer( &BufDesc, NULL, &g_pMirrorVertexBuffer );


 정점을 저장하는 버퍼역시 DX9에서는 VertexBuffer, Index Buffer가 각각 나누어져 있었던 것이 DX11에서는 한개로 통합되었습니다.
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 정점버퍼
LPDIRECT3DINDEXBUFFER9 g_pIB        = NULL; /// 인덱스버퍼

ID3D11Buffer*               g_pVertexBuffer = NULL;
 

* DX10과 DX11의 버퍼 생성시 차이점
 DX10
DX11은 사실상 함수 이름외에는 변한 것이 없습니다.
 
아래와 같이 사용하는 함수의 이름 중 DX의 버젼을 나타내는 숫자가 '10'에서 '11'이 된 것 외에는 사용되는 모든 함수가 파라미터리턴타입까지 동일하므로 DX11이라고 해서 따로 알아야 할 내용은 없습니다.

ID3D10Device::CreateBuffer

ð  ID3D11Device::CreateBuffer

 

버퍼에 관련된 내용 뿐만 아니라 대부분의 함수들이 DX10 DX11은 거의 비슷한 형태를 지니고 있습니다. 따라서 특별한 경우가 아니면 DX9와 비교해 변경된 것만을 적도록 하겠습니다.

다음 번의 글에는 Constant Buffer에 대해서 올리도록 하겠습니다.

'DirectX 11' 카테고리의 다른 글

[DX11_#3]기본적인 설정  (0) 2009.10.22
[DX11_#2]D3D Buffer( 2 / 2 )  (0) 2009.10.13
[JumpToDX11-4] ID3D11View  (0) 2009.09.07
[JumpToDX11-3] Feature Level  (0) 2009.08.31
[JumpToDX11-2]DeviceContext...넌 누구냣!!  (1) 2009.08.24