버퍼 리소스는 요소로 그룹화된 완전히 형식화된 데이터의 컬렉션입니다. 버퍼를 사용하여 위치 벡터, 일반 벡터, 꼭짓점 버퍼의 텍스처 좌표, 인덱스 버퍼의 인덱스 또는 디바이스 상태를 비롯한 다양한 데이터를 저장할 수 있습니다. 버퍼 요소는 1~4개의 구성 요소로 구성됩니다. 버퍼 요소에는 압축된 데이터 값(예: R8G8B8A8 표면 값), 단일 8비트 정수 또는 4개의 32비트 부동 소수점 값이 포함될 수 있습니다.
버퍼는 구조화되지 않은 리소스로 만들어집니다. 구조화되지 않으므로 버퍼는 mipmap 수준을 포함할 수 없으며 읽을 때 필터링할 수 없으며 다중 샘플링할 수 없습니다.
버퍼 형식
다음은 Direct3D 11에서 지원하는 버퍼 리소스 종류입니다. 모든 버퍼 형식은 ID3D11Buffer 인터페이스에 의해 캡슐화됩니다.
꼭짓점 버퍼
꼭짓점 버퍼에는 기하 도형을 정의하는 데 사용되는 꼭짓점 데이터가 포함됩니다. 꼭짓점 데이터에는 위치 좌표, 색 데이터, 질감 좌표 데이터, 일반 데이터 등이 포함됩니다.
꼭짓점 버퍼의 가장 간단한 예는 위치 데이터만 포함하는 것입니다. 다음 그림과 같이 시각화할 수 있습니다.
위치 데이터그림
꼭짓점 버퍼에는 3D 꼭짓점을 완전히 지정하는 데 필요한 모든 데이터가 포함되어 있는 경우가 많습니다. 예를 들어 꼭짓점당 위치, 법선 및 텍스처 좌표가 포함된 꼭짓점 버퍼가 있습니다. 이 데이터는 일반적으로 다음 그림과 같이 꼭짓점당 요소 집합으로 구성됩니다.
이 꼭짓점 버퍼에는 꼭짓점당 데이터가 포함됩니다. 각 꼭짓점은 세 가지 요소(위치, 법선 및 텍스처 좌표)를 저장합니다. 위치와 법선은 각각 일반적으로 세 개의 32비트 부동 소수점(DXGI_FORMAT_R32G32B32_FLOAT)을 사용하여 지정되며, 텍스처 좌표는 두 개의 32비트 부동 소수점(DXGI_FORMAT_R32G32_FLOAT)을 사용하여 지정됩니다.
꼭짓점 버퍼에서 데이터에 액세스하려면 액세스할 꼭짓점과 다음 추가 버퍼 매개 변수를 알아야 합니다.
- 오프셋 - 버퍼 시작부터 첫 번째 꼭짓점의 데이터까지의 바이트 수입니다. ID3D11DeviceContext::IASetVertexBuffers 메서드를 사용하여 오프셋을 지정할 수 있습니다.
- BaseVertexLocation - 꼭짓점 버퍼에서 꼭짓점을 읽기 전에 각 인덱스에 추가된 값입니다.
꼭짓점 버퍼를 만들기 전에 ID3D11InputLayout 인터페이스를 만들어 레이아웃을 정의해야 합니다. 이 작업은 ID3D11Device::CreateInputLayout 메서드를 호출하여 수행됩니다. 입력 레이아웃 개체를 만든 후 ID3D11DeviceContext::IASetInputLayout호출하여 입력 어셈블러 단계에 바인딩할 수 있습니다.
꼭짓점 버퍼를 만들려면 ID3D11Device::CreateBuffer호출합니다.
인덱스 버퍼
인덱스 버퍼는 꼭짓점 버퍼에 정수 오프셋을 포함하며 기본 형식을 보다 효율적으로 렌더링하는 데 사용됩니다. 인덱스 버퍼에는 16비트 또는 32비트 인덱스의 순차 집합이 포함됩니다. 각 인덱스는 꼭짓점 버퍼에서 꼭짓점을 식별하는 데 사용됩니다. 인덱스 버퍼는 다음 그림과 같이 시각화할 수 있습니다.
인덱스 버퍼에 저장된 순차 인덱스는 다음 매개 변수와 함께 있습니다.
- 오프셋 - 인덱스 버퍼의 기준 주소에서부터의 바이트 수입니다. 오프셋은 ID3D11DeviceContext::IASetIndexBuffer 메서드에 제공됩니다.
- StartIndexLocation - 기본 주소의 첫 번째 인덱스 버퍼 요소와 IASetIndexBuffer제공된 오프셋을 지정합니다. 시작 위치는 ID3D11DeviceContext::D rawIndexed 또는 ID3D11DeviceContext::D rawIndexedInstanced 메서드에 제공되며 렌더링할 첫 번째 인덱스를 나타냅니다.
- IndexCount - 렌더링할 인덱스 수입니다. 이 숫자는 DrawIndexed 메서드에 제공됩니다.
인덱스 버퍼의 시작 = 인덱스 버퍼 기본 주소 + 오프셋(바이트) + 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::PSSetConstantBuffers또는 ID3D11DeviceContext::VSSetConstantBuffers.
셰이더에서 셰이더 상수 버퍼를 읽으려면 HLSL 로드 함수(예: Load)를 사용합니다. 각 셰이더 단계에서는 최대 15개의 셰이더 상수 버퍼를 허용합니다. 각 버퍼는 최대 4096개의 상수까지 보유할 수 있습니다.
관련 항목