[DX] 색인(Index)과 색인 버퍼(Index Buffer)

김진우·2025년 7월 22일

DirectX

목록 보기
25/32
post-thumbnail

색인(Index)

정점 데이터의 순서를 나타내는 정수 값이다.

삼각형 하나를 그릴 때 3개의 정점이 필요하다. 하지만 여러 삼각형이 인접하여 공통된 정점을 공유할 수 있다면, 동일한 정점을 다시 저장하지 않고 색인(Index)를 이용해 참조만 하면 된다.

// 정점 배열 (3D 좌표만 있다고 가정)
Vertex vertices[] = {
    {0, 0, 0},   // index 0
    {1, 0, 0},   // index 1
    {0, 1, 0},   // index 2
    {1, 1, 0}    // index 3
};
// 인덱스 배열 (삼각형 2개를 만든다)
unsigned short indices[] = {
    0, 1, 2,  // 삼각형 1
    2, 1, 3   // 삼각형 2
};

색인 버퍼(Index Buffer)

GPU에게 정점들을 어떤 순서로 그려야 하는지 알려주는 버퍼이다.

이 버퍼는 정점 버퍼(Vertex Buffer)와 함께 GPU에 바인딩 된다.
즉, 정점 버퍼(Vertex Buffer)와 짝을 이뤄 함께 쓰인다.

예시

  • 삼각형 2개로 사각형을 만들 때
v1 ------ v3
 | \      |
 |   \    |
 |     \  |
v0 ------ v2

이때 삼각형은 v0 - v1 - v2 , v2 - v1 - v3 순서대로 그려진다.

1. 정점 배열 (Vertex Buffer)

struct Vertex
{
    float x, y, z;
};

Vertex vertices[] =
{
    { -0.5f, -0.5f, 0.0f },  // v0
    { -0.5f,  0.5f, 0.0f },  // v1
    {  0.5f, -0.5f, 0.0f },  // v2
    {  0.5f,  0.5f, 0.0f }   // v3
};

2. 색인 배열 (Index Buffer)

unsigned short indices[] =
{
    0, 1, 2,  // 삼각형 1: v0-v1-v2
    2, 1, 3   // 삼각형 2: v2-v1-v3
};

3. 색인 버퍼 생성

// 색인 버퍼의 속성 설정
D3D11_BUFFER_DESC ibDesc = {};
ibDesc.Usage = D3D11_USAGE_DEFAULT;
ibDesc.ByteWidth = sizeof(indices);
ibDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;

// 색인 버퍼 데이터 설정
D3D11_SUBRESOURCE_DATA ibData = {};
ibData.pSysMem = indices;

// GPU에 색인 버퍼 생성
ID3D11Buffer* indexBuffer = nullptr;
device->CreateBuffer(&ibDesc, &ibData, &indexBuffer);

4. 사용 시 바인딩 + 그리기

// 정점 버퍼 바인딩
UINT stride = sizeof(Vertex);  // 정점 하나의 크기
UINT offset = 0;
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);

// 색인 버퍼 바인딩
deviceContext->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R16_UINT, 0);

// 입력 조립기 설정 (삼각형 리스트)
deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

0개의 댓글