Index Buff
에 대해 알아보자. 인덱스 버퍼를 사용하는 이유는 정점 버퍼에서 사용하는 GPU 메모리 사용량을 줄이기 위해서이다. 간단하게 색상을 포함하는 사각형을 보자.

정점 버퍼로만 이 사각형을 렌더링하기 위해서는 총 6
개의 정점 데이터가 필요하다. 각 정점이 위치( float[3]
)와 색( float[4]
)을 포함한다면 정점 버퍼의 메모리 사용량은 28 x 6 = 168 bytes가 된다. 하지만 인덱스 버퍼를 이용하게 되면 정점 데이터는 4개만 있으면 된다. 정점 버퍼의 메모리 사용량은 28 x 4 = 112 bytes로 줄어든다. 인덱스 버퍼의 사용량을 추가하더라도 112 + 24 = 136 bytes로 정점 버퍼만 사용하는 것보다 메모리 사용량이 줄어든다. 복잡한 형태의 메쉬로 가면 이 격차는 더더욱 커지게 된다.
Index Buffer만들기
인덱스 버퍼의 생성은 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 );
코드를 보면 알겠지만 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 ),
};
DirectX11은 시계 방향으로 정점을 참조해서 삼각형을 그린다는 사실에 유의해야 한다. 시계 반대 방향으로 인덱싱 되어 있고 후면을 그리지 않도록 설정되어 있다면 삼각형이 그려지지 않는다.
Rendering Pipeline에 연결하기
IASetIndexBuffer
함수를 사용하여 연결한다. 마이크로 소프트에서 레퍼런스를 참고할 수 있다.
ID3D11DeviceContext->IASetIndexBuffer( IndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
유의할 것은 DXGI_FORMAT_R32_UINT
로 지정된 포맷인데 여기서 인덱스 버퍼 데이터를 int
형으로 지정해주었기 때문에 4byte
로 지정한 것이다. 레퍼런스 링크에서 볼 수 있지만 인덱스 버퍼의 데이터 형식은 16비트
혹은 32비트
만이 지정가능하다.
Draw하기
정점 버퍼만을 가지고 드로우할 때와 드로우 함수가 달라진다.
ID3D11DeviceContext->DrawIndexed( 6, 0, 0 );
인덱스 버퍼를 사용하는 경우 DrawIndexed
함수를 이용해서 드로우 콜을 해야 하며 파라메터로는 인덱스의 개수를 지정해준다.
다음과 같이 사각형이 렌더링되는 것을 볼 수 있다.

전체 코드는 yunei0313/CRY at Rect-rendering에서 볼 수 있다.
이전글 : [DirectX11] 9. 여러개의 슬롯에 연결된 버텍스 버퍼를 렌더링 해보자.
다음글 : [DirectX11] 11. 이미지 – Texture2D에 대해 알아보자.