정점 데이터의 순서를 나타내는 정수 값이다.
삼각형 하나를 그릴 때 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 };
GPU에게 정점들을 어떤 순서로 그려야 하는지 알려주는 버퍼이다.
이 버퍼는 정점 버퍼(Vertex Buffer)와 함께 GPU에 바인딩 된다.
즉, 정점 버퍼(Vertex Buffer)와 짝을 이뤄 함께 쓰인다.
v1 ------ v3
| \ |
| \ |
| \ |
v0 ------ v2
이때 삼각형은 v0 - v1 - v2 , v2 - v1 - v3 순서대로 그려진다.
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
};
unsigned short indices[] =
{
0, 1, 2, // 삼각형 1: v0-v1-v2
2, 1, 3 // 삼각형 2: v2-v1-v3
};
// 색인 버퍼의 속성 설정
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);
// 정점 버퍼 바인딩
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);