티스토리 뷰

반응형

다중표본화를 위해서는 DXGI_SAMPLE_DESC라는 구조체를 적절히 채워야 한다. 이 구조체는 다음과 같이 두개의 멤버( 자료 빌드 ) 로 이루어져 있다.

typedef struct DXGI_SAMPLE_DESC {
  UINT Count;
  UINT Quality;
} DXGI_SAMPLE_DESC;
 

DXGI_SAMPLE_DESC (dxgicommon.h) - Win32 apps

Describes multi-sampling parameters for a resource.

learn.microsoft.com

 

 

Count 멤버는픽셀당 추출한 표본의 개수를 지정하고 Quality 멤버는 원하는 품질 수준 (quality level ) 을 지정 한다 ( '품질 수준 ' 의 구체적인 의미는 하드웨어 제조사마다 다를 수 있다 ). 표본 개수라 많을수록, 그리고 품질 수준이 높을수록 렌더링 비용도 증가하므로, 비용과 속도 사이의 점층선을 잘 잡아야한다. 품질 수준들의 범위는 텍스처 형식과 필셀당 표본 개수에 의존한다. 주어진 텍스처 형식과 표본 개수의 조합에 대한 품질 수준들의 개수는 ID3D12Device::CheckFeatureSupport라는 메서드도 알아낼 수 있다. 다음는 이 메서드를 사용하는 예이다.

typedef struct D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS {
  DXGI_FORMAT                           Format;
  UINT                                  SampleCount;
  D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags;
  UINT                                  NumQualityLevels;
} D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS;
 

D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS (d3d12.h) - Win32 apps

Describes the multi-sampling image quality levels for a given format and sample count.

learn.microsoft.com

정의.

D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msQualityLevels;
msQualityLevels.Format = mBackBufferFormat;
msQualityLevels.SampleCount = 4;
msQualityLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE;
msQualityLevels.NumQualityLevels = 0;

ThrowIfFailed(md3dDevice->CheckFeatureSupport(
	D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS,
	&msQualityLevels,
	sizeof(msQualityLevels)));

 

이 메서드의 둘째 매개변수가 입력과 출력 모두에 쓰인다는 점을 주목하기 바란다. 이 메서드는 둘째 매개변수로 지정된 구조체에서 텍스처 형식과 표본 개수를 읽고, 그에 해당하는 품질 수준 개수를 그 구조체의 NumQualityLevels 멤버에 설정한다. 주어진 텍스처 형식과 표본 개수의 조합에 대해 유효한 품질 수준들은 0에서 NumQualityLevels - 1 까지이다.

한 픽셀에서 추출할 수 있는 최대 표본 개수는 다음과 같이 정의된다.

#define D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT ( 32 )

그러나 실제 응용에서는 다중표본화의 성능 및 메모리 비용을 합리적인 수준으로 유지하기 위해 표본을 4개나 8개만 추출하는 경우가 많다. 다중표본화를 사용하고 싶지 않으면 표본 개수를 1로, 품질 수준을 0으로 설정 하면 된다. 모든 Direct3D 12 대응 장치는 모든 렌더 대상 형식에 대해 4x 다중표본화를 지원한다.

 

참고 : DXGI_SAMPLE_DESC 구조체는 교환 사술 버퍼들과 깊이 버퍼 모두에 필요있다. 또한, 후면버퍼와 깊이 버퍼를 생성할때 동일한 다중표본화 설정을 적용해야한다.

 


기능 수준 ( feature level ) 이라는 개념은 Direct3D 11에서 도입된 것으로, 코드에서는 D3D_FEATURE_LEVEL이라는 열거형으로 대표된다. 기능 수준들은 대략 버전 9에서 12까지며 여러 Direct3D 버전들에 대응된다.

typedef enum D3D_FEATURE_LEVEL {
  D3D_FEATURE_LEVEL_1_0_CORE			0x1000,
  D3D_FEATURE_LEVEL_9_1				0x9100,
  D3D_FEATURE_LEVEL_9_2				0x9200,
  D3D_FEATURE_LEVEL_9_3				0x9300,
  D3D_FEATURE_LEVEL_10_0			0xa000,
  D3D_FEATURE_LEVEL_10_1			0xa100,
  D3D_FEATURE_LEVEL_11_0			0xb000,
  D3D_FEATURE_LEVEL_11_1			0xb100,
  D3D_FEATURE_LEVEL_12_0			0xc000,
  D3D_FEATURE_LEVEL_12_1			0xc100,
  D3D_FEATURE_LEVEL_12_2			0xc200
} D3D_FEATURE_LEVEL;
 

D3D_FEATURE_LEVEL(d3dcommon.h) - Win32 apps

Direct3D 디바이스를 대상으로 하는 기능 집합에 대해 설명합니다.

learn.microsoft.com

기능 수준들은 GPU가 지원하는 기능들의 엄격한 집합을 정의한다. ( 각 기능 수준이 지원하는 구체적인 기능들은 SDK 문서화를 참고할 것 ). 예를 들어 기능수준 11을 지원하는 GPU는 반드시 Direct3D 11의 기능 집합 전체를 지원해야 한다.

( 단 , 대중표본화 표본 개수 같은 것들은 여전한 질의를 통해서 확인할 필요가 있다. 이는 서로 다른 Direct11 하드웨어들의 다양성을 보장하기 위한 것이다). 이러한 기능수준을 응용 프로그램 개발을 편하게 해주는 요인이다.

( 12_0 또 있고, 12_1도 있다 ). 현재 GPU의 기능 수준을 파악하기만 하면, 구체적으로 어떤 기능을 사용할 수 있는지를 확인할 수 있기 때문이다. 사용자의 하드웨어가 특정 기능 수준을 지원하지 않는 경우 응용프로그램이 실행을 아예 포기하는 대신 더 낮은 기능 수준으로 후퇴하는 전략을 사용할 수도 있다.

예를 들어 대상 사용자층을 넓히기 위해 Direct3D 12뿐만 아니라 Direct3D 11, 10, 9.3 수준 하드웨어까지 지원하기도 한다고 하자. 이 경우 응용 프로그램은 높은 수준에서 낮은 수준으로 기능 수준으로 점검 한다. 즉, 응용 프로그램은 먼저 하드웨어가 Direct3D 12를 지원하는지 점검하고, 아니라면 Direct3D 11도 ( 경우에는 9.3까지 ) 내려간다.

반응형

'DirectX12 > Direct3D' 카테고리의 다른 글

Direct3D Hull Shader triangle patch (작성 중.)  (0) 2023.10.18
DXGI(DirectX Graphics Infrastructure).  (0) 2023.08.19
다중표본화의 이론.  (0) 2023.06.04
자원과 서술자.  (0) 2023.05.27
깊이 버퍼링(Depth Buffering).  (0) 2023.05.25
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함