DirectX11 – Index Buffer

Microsoft DirectX11 AI

Index Buff는 중복된 정점 데이터를 최소화하기 위한 버퍼이다.

정점 버퍼로만 이 사각형을 렌더링하기 위해서는 총 6개의 정점 데이터가 필요하다. 각 정점이 위치( float[3] )와 색( float[4] )을 포함한다면 정점 버퍼의 메모리 사용량은 28 x 6 = 168 bytes가 된다. 하지만 인덱스 버퍼를 이용하게 되면 정점 데이터는 4개만 있으면 된다. 정점 버퍼의 메모리 사용량은 28 x 4 = 112 bytes로 줄어든다. 인덱스 버퍼의 사용량을 추가하더라도 112 + 24 = 136 bytes로 정점 버퍼만 사용하는 것보다 메모리 사용량이 줄어든다. 복잡한 형태의 메쉬로 가면 이 격차는 더더욱 커지게 된다.

Index Buffer만들기


인덱스 버퍼의 생성은DirectX11 – Vertex Buffer와 매우 유사하다. 버퍼의 타입 지정만 다른 정도이다.

int Indice[] = { 0, 1, 2, 1, 3, 2 };  
ID3D11Buffer* IndexBuffer = nullptr;  
  
D3D11_BUFFER_DESC bd;  
ZeroMemory( &bd, sizeof( D3D11_BUFFER_DESC ) );  
  
bd.Usage          = D3D11_USAGE_DEFAULT;    
bd.ByteWidth      = sizeof( int ) * 6;    
bd.BindFlags      = D3D11_BIND_INDEX_BUFFER;    
bd.CPUAccessFlags = 0;  
  
D3D11_SUBRESOURCE_DATA sd;  
ZeroMemory( &sd, sizeof( D3D11_SUBRESOURCE_DATA ) );  
  
sd.pSysMem = Indice;  
  
ID3D11Device->CreateBuffer( &bd, &sd, &IndexBuffer );
C++

코드를 보면 알겠지만 bd.BindFlags = D3D11_BIND_INDEX_BUFFER를 제외하고나머지는 정점 버퍼를 생성하는 코드와 동일하다. int Indice[] = { 0, 1, 2, 1, 3, 2 };가 인덱스 버퍼 데이터이며 정점 버퍼의 인덱스를 가리킨다. 차례대로 0, 1, 2번 정점을 이용해서 삼각형 1개를 그리고, 1, 3, 2번 정점을 이용해서 삼각형 1개를 그리는 것이다.

이 때 정점 버퍼는 아래와 같이 구성되어 있다고 생각하자.

SimpleVertexCombined verticesCombo[] =
{
    XMFLOAT3( -0.5f,  0.5f, 0.0f ),
    XMFLOAT3(  0.5f,  0.5f, 0.0f ),
    XMFLOAT3( -0.5f, -0.5f, 0.0f ),
    XMFLOAT3(  0.5f, -0.5f, 0.0f ),
};
C++

DirectX11은 시계 방향으로 정점을 참조해서 삼각형을 그린다는 사실에 유의해야 한다. 시계 반대 방향으로 인덱싱 되어 있고 후면을 그리지 않도록 설정되어 있다면 삼각형이 그려지지 않는다.

Rendering Pipeline에 연결하기


IASetIndexBuffer함수를 사용하여 연결한다. 마이크로 소프트에서 레퍼런스를 참고할 수 있다.

ID3D11DeviceContext->IASetIndexBuffer( IndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
C++

유의할 것은 DXGI_FORMAT_R32_UINT로 지정된 포맷인데 여기서 인덱스 버퍼 데이터를 int형으로 지정해주었기 때문에 4byte로 지정한 것이다. 레퍼런스 링크에서 볼 수 있지만 인덱스 버퍼의 데이터 형식은 16비트혹은 32비트만이 지정가능하다.

Draw하기


정점 버퍼만을 가지고 드로우할 때와 드로우 함수가 달라진다.

ID3D11DeviceContext->DrawIndexed( 6, 0, 0 );
C++

인덱스 버퍼를 사용하는 경우 DrawIndexed함수를 이용해서 드로우 콜을 해야 하며 파라메터로는 인덱스의 개수를 지정해준다.

다음과 같이 사각형이 렌더링되는 것을 볼 수 있다.

전체 코드는 cryundev/CRY at Rect-rendering에서 볼 수 있다.

이전글 : DirectX11 – 여러개의 슬롯에 연결된 버텍스 버퍼 렌더링

다음글 : DirectX11 – Texture Sampling

0 답글

댓글을 남겨주세요

Want to join the discussion?
Feel free to contribute!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다