Direct3D 11의 버퍼 소개

버퍼 리소스는 요소로 그룹화 된 완전히 형식화 된 데이터의 컬렉션입니다. 버퍼를 사용 하 여 위치 벡터, 법선 벡터, 꼭 짓 점 버퍼의 질감 좌표, 인덱스 버퍼의 인덱스 또는 장치 상태를 비롯 한 다양 한 데이터를 저장할 수 있습니다. Buffer 요소는 1 ~ 4 개의 구성 요소로 구성 됩니다. 버퍼 요소에는 압축 된 데이터 값 (예: R8G8B8A8 surface 값), 단일 8 비트 정수 또는 4 32 비트 부동 소수점 값이 포함 될 수 있습니다.

버퍼는 비구조적 리소스로 생성 됩니다. 구조화 되지 않으므로 버퍼는 밉 맵 수준을 포함할 수 없으며 읽을 때 필터링 할 수 없으며 다중 샘플 수 없습니다.

버퍼 유형

다음은 Direct3D 11에서 지원 되는 버퍼 리소스 형식입니다. 모든 버퍼 형식은 ID3D11Buffer 인터페이스에 의해 캡슐화 됩니다.

꼭 짓 점 버퍼

꼭 짓 점 버퍼는 기 하 도형을 정의 하는 데 사용 된 꼭 짓 점 데이터를 포함 합니다. 꼭 짓 점 데이터에는 위치 좌표, 색 데이터, 질감 좌표 데이터, 일반 데이터 등이 포함 됩니다.

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

위치 데이터를 포함 하는 꼭 짓 점 버퍼의 그림

더 자주, 꼭 짓 점 버퍼에는 3D 꼭 짓 점을 완전히 지정 하는 데 필요한 모든 데이터가 포함 됩니다. 이에 대 한 예는 꼭 짓 점 별 위치, 법선 및 질감 좌표를 포함 하는 꼭 짓 점 버퍼 일 수 있습니다. 이 데이터는 일반적으로 다음 그림에 표시 된 것 처럼 꼭 짓 점 별 요소 집합으로 구성 됩니다.

position, normal 및 질감 데이터를 포함 하는 꼭 짓 점 버퍼의 그림

이 꼭 짓 점 버퍼는 꼭 짓 점 별 데이터를 포함 합니다. 각 꼭 짓 점에는 세 개의 요소 (위치, 보통 및 질감 좌표)가 저장 됩니다. Position 및 normal은 일반적으로 3 32 비트 float (DXGI _ format _ R32G32B32 _ float) 및 2 32 비트 float (dxgi _ format _ R32G32 float)를 사용 하는 질감 좌표를 사용 하 여 지정 됩니다 _ .

꼭 짓 점 버퍼의 데이터에 액세스 하려면 액세스할 꼭 짓 점 및 다음 추가 버퍼 매개 변수를 알고 있어야 합니다.

  • Offset-버퍼의 시작부터 첫 번째 꼭 짓 점에 대 한 데이터 까지의 바이트 수입니다. 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 _ 플래그 열거 형식의 D3D11 _ BIND _ 상수 _ 버퍼 멤버를 지정 합니다.

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

셰이더에서 셰이더 상수 버퍼를 읽으려면 HLSL load 함수 (예: load)를 사용 합니다. 각 셰이더 단계는 최대 15 개의 셰이더 상수 버퍼를 허용 합니다. 각 버퍼는 최대 4096 개의 상수를 보유할 수 있습니다.

버퍼