[DX11] IndexBuffer

LeeTaes·2024년 1월 9일
0

DirectX

목록 보기
7/9

IndexBuffer

IndexBuffer는 여러 정점에 대한 인덱스를 저장하기 위해 사용하는 버퍼입니다.
IndexBuffer를 사용하여 정점 데이터를 효율적으로 관리 가능합니다.
VertexBuffer와 InputLayout과 동일하게 IA 단계에 연결하여 사용합니다.


IndexBuffer 사용 이유

  • 인덱스 버퍼 없이 사각형을 만드는 경우는 다음과 같습니다.
	// 사이즈 조정 (4각형 = 3각형 2개로 제작 가능)
	_vertices.resize(6);

	// 위치 정보와 색상 정보를 설정합니다.
	_vertices[0].position = Vec3(-0.5f, -0.5f, 0.0f);
	_vertices[0].color = Color(1.0f, 0.0f, 0.0f, 0.0f);		

	_vertices[1].position = Vec3(0.0f, 0.5f, 0.0f);
	_vertices[1].color = Color(1.0f, 0.0f, 0.0f, 0.0f);		

	_vertices[2].position = Vec3(0.5f, -0.5f, 0.0f);
	_vertices[2].color = Color(1.0f, 0.0f, 0.0f, 0.0f);
    
    _vertices[3].position = Vec3(0.5f, -0.5f, 0.0f);
	_vertices[3].color = Color(1.0f, 0.0f, 0.0f, 0.0f);
    
    _vertices[4].position = Vec3(0.0f, 0.5f, 0.0f);
	_vertices[4].color = Color(1.0f, 0.0f, 0.0f, 0.0f);	
    
    _vertices[5].position = Vec3(0.5f, 0.5f, 0.0f);
	_vertices[5].color = Color(1.0f, 0.0f, 0.0f, 1.0f);
  • 위와 같이 중복되는 정점들을 저장하기 위해 공간을 사용해야 합니다.
  • 인덱스 버퍼를 사용해 다시 구현해본다면?

	// 사이즈 조정
	_vertices.resize(4);
	// 위치 정보와 색상 정보를 설정합니다.
	_vertices[0].position = Vec3(-0.5f, -0.5f, 0.0f);
	_vertices[0].color = Color(1.0f, 0.0f, 0.0f, 1.0f);		
	_vertices[1].position = Vec3(-0.5f, 0.5f, 0.0f);
	_vertices[1].color = Color(1.0f, 0.0f, 0.0f, 1.0f);
	_vertices[2].position = Vec3(0.5f, -0.5f, 0.0f);
	_vertices[2].color = Color(1.0f, 0.0f, 0.0f, 1.0f);
	_vertices[3].position = Vec3(0.5f, 0.5f, 0.0f);
	_vertices[3].color = Color(1.0f, 0.0f, 0.0f, 1.0f);
	
    ...

	// index
	// 인덱스 컨테이너에 정보를 저장합니다.
	// * 저장하는 방향은 일정해야 합니다.
	_indices = { 0, 1, 2, 2, 1, 3 };
  • 위와 같이 4개의 정점 정보만 생성하여 2개의 삼각형을 만들 수 있습니다.
  • 즉, 정점 버퍼만 사용하게 된다면 정점들에 대한 정보를 모두 넘겨줘야 하지만 인덱스 버퍼를 사용함으로써 간단한 인덱스 정보들만 넘겨줘도 동일한 동작을 만들어 줄 수 있습니다.

인덱스 버퍼 생성 코드

	// 버퍼 생성에 사용될 DESC를 생성합니다.
	D3D11_BUFFER_DESC desc;
	ZeroMemory(&desc, sizeof(desc));

	desc.Usage = D3D11_USAGE_IMMUTABLE;
	// * D3D11_BIND_INDEX_BUFFER : IndexBuffer를 바인딩하는 용도로 사용하겠다고 설정
	desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
	desc.ByteWidth = (uint32)sizeof(uint32) * _indices.size();

	D3D11_SUBRESOURCE_DATA data;
	ZeroMemory(&data, sizeof(data));
	// 첫 번째 데이터의 시작 주소를 저장합니다.
	data.pSysMem = _indices.data();

	// 버퍼를 생성해줍니다. (_indexBuffer에 결과물을 저장합니다.)
	HRESULT hr = _device->CreateBuffer(&desc, &data, _indexBuffer.GetAddressOf());
	CHECK(hr);

인덱스 버퍼 연결 코드

_deviceContext->IASetIndexBuffer(_indexBuffer.Get(), DXGI_FORMAT_R32_UINT, 0);
  • 실행 결과
profile
클라이언트 프로그래머 지망생

0개의 댓글