Direct3D 11의 버퍼 소개
버퍼 리소스는 요소로 그룹화된 완전히 형식화된 데이터의 컬렉션입니다. 버퍼를 사용하여 위치 벡터, 일반 벡터, 꼭짓점 버퍼의 텍스처 좌표, 인덱스 버퍼의 인덱스 또는 디바이스 상태를 비롯한 다양한 데이터를 저장할 수 있습니다. 버퍼 요소는 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개의 상수까지 보유할 수 있습니다.
관련 항목