Direct3D 11의 버퍼 소개

버퍼 리소스는 완벽하게 입력된 데이터 컬렉션이며, 요소로 그룹화됩니다. 버퍼를 사용하면 위치 벡터, 기본 벡터, 꼭짓점 버퍼의 텍스처 좌표, 인덱스 버퍼의 인덱스, 디바이스 상태 같이 다양한 데이터를 저장할 수 있습니다. 버퍼 요소는 1 ~ 4개 구성 요소로 이루어집니다. 버퍼 요소에는 압축된 데이터 값(R8G8B8A8 표면 값), 8비트 정수 하나 또는 32비트 부동 소수점 값 네 개가 포함될 수 있습니다.

버퍼는 구조화되지 않은 리소스로 생성됩니다. 버퍼가 구조화되지 않았기 때문에 Mipmap 수준을 포함할 수 없고, 읽었을 때 필터링될 수 없으며 다중 샘플링될 수 없습니다.

버퍼 유형

Direct3D 11이 지원하는 버퍼 리소스 유형은 다음과 같습니다. 모든 버퍼 형식은 ID3D11Buffer 인터페이스에 의해 캡슐화됩니다.

꼭짓점 버퍼

꼭짓점 버퍼에 기하 도형을 정의하는 데 사용되는 꼭짓점 데이터가 포함됩니다. 꼭짓점 데이터에는 위치 좌표, 색상 데이터, 텍스처 좌표 데이터, 기본 데이터 등이 포함되어 있습니다.

위치 데이터만 포함하는 경우가 가장 단순한 꼭짓점 버퍼의 예입니다. 다음 그림과 같이 시각화할 수 있습니다.

위치 데이터가 포함된 꼭짓점 버퍼 그림

3D 꼭짓점을 완벽하게 지정하는 데 필요한 모든 데이터를 포함하는 경우가 더 많습니다. 꼭짓점별 위치, 일반 및 텍스처 좌표가 포함된 꼭짓점 버퍼가 한 예입니다. 이 데이터는 일반적으로 다음 그림과 같이 꼭짓점별 요소 세트로 구성됩니다.

위치, 법선 및 텍스처 데이터가 포함된 꼭짓점 버퍼 그림

이 꼭짓점 버퍼는 꼭짓점별 데이터를 포함하고 각 꼭짓점은 세 가지 요소(위치, 일반 및 텍스처 좌표)를 저장합니다. 위치와 표준은 일반적으로 32비트 부동 소수점(DXGI_FORMAT_R32G32B32_FLOAT) 3개와 32비트 부동 소수점 2개(DXGI_FORMAT_R32G32_FLOAT)를 사용하여 텍스처 좌표를 사용하여 지정됩니다.

꼭짓점 버퍼에서 데이터에 액세스하려면 액세스할 꼭짓점뿐 아니라 다음과 같은 추가 버퍼 매개 변수를 알아야 합니다.

  • 오프셋 - 버퍼 시작부터 첫 번째 꼭짓점의 데이터까지 바이트 수입니다. ID3D11DeviceContext::IASetVertexBuffers 메서드를 사용하여 오프셋을 지정할 수 있습니다.
  • BaseVertexLocation - 꼭짓점 버퍼에서 꼭짓점을 읽기 전에 각 인덱스에 추가된 값입니다.

꼭짓점 버퍼를 만들기 전에 ID3D11InputLayout 인터페이스를 만들어 레이아웃을 정의해야 합니다. 이 작업은 ID3D11Device::CreateInputLayout 메서드를 호출하여 수행됩니다. 입력 레이아웃 개체를 만든 후 ID3D11DeviceContext::IASetInputLayout을 호출하여 입력 어셈블러 단계에 바인딩할 수 있습니다.

꼭짓점 버퍼를 만들려면 ID3D11Device::CreateBuffer를 호출합니다.

인덱스 버퍼

인덱스 버퍼는 꼭짓점 버퍼에 대한 정수 오프셋을 포함하며, 원형을 효율적으로 렌더링하는 데 사용됩니다. 인덱스 버퍼는 16비트 또는 32비트 인덱스의 순차 세트를 포함하며, 각 인덱스는 꼭짓점 버퍼에서 꼭짓점을 식별하는 데 사용됩니다. 인덱스 버퍼는 다음 그림과 같이 시각화할 수 있습니다.

인덱스 버퍼 그림

인덱스 버퍼에 저장된 순차 인덱스는 다음 매개 변수로 배치됩니다.

인덱스 버퍼의 시작 = 인덱스 버퍼 기본 주소 + 오프셋(바이트) + StartIndexLocation * ElementSize(바이트);

이 계산에서 ElementSize는 각 인덱스 버퍼 요소의 크기로, 2바이트 또는 4바이트입니다.

인덱스 버퍼를 만들려면 ID3D11Device::CreateBuffer를 호출합니다.

상수 버퍼

상수 버퍼를 통해 파이프라인에 셰이더 상수 데이터를 효율적으로 제공할 수 있습니다. 상수 버퍼를 사용해 스트림 출력 단계의 결과를 저장할 수 있습니다. 개념적으로 상수 버퍼는 다음 그림과 같이 단일 요소 꼭짓점 버퍼처럼 보입니다.

셰이더 상수 버퍼 그림

각 요소는 저장된 데이터의 형식에 의해 결정되는 1 ~4개 구성 요소 상수를 저장합니다. 셰이더 상수 버퍼를 만들려면 ID3D11Device::CreateBuffer 를 호출하고 D3D11_BIND_FLAG 열거형 형식의 D3D11_BIND_CONSTANT_BUFFER 멤버를 지정합니다.

상수 버퍼는 다른 바인딩 플래그와 결합할 수 없는 단일 바인딩 플래그(D3D11_BIND_CONSTANT_BUFFER)만 사용할 수 있습니다. 셰이더 상수 버퍼를 파이프라인에 바인딩하려면 ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers 또는 ID3D11DeviceContext::VSSetConstantBuffers 메서드 중 하나를 호출합니다.

셰이더에서 셰이더 상수 버퍼를 읽으려면 HLSL 로드 함수(예: Load)를 사용합니다. 각 셰이더 단계는 최대 15개의 셰이더 상수 버퍼를 허용하며 각 버퍼는 최대 4,096개 상수를 보관할 수 있습니다.

버퍼