티스토리 뷰
다중표본화를 위해서는 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
- DirectX
- Multipalyer
- 시애틀의 잠 못 이루는 밤
- 언리얼#c++#기능
- Linux
- directx3d
- c++
- 영화리뷰
- ActorComponent
- html5
- 1993
- Direct12
- 언리얼#게임
- ReplicatedUsing
- ros
- UnReal
- DirectX12
- 4.27
- ubuntu
- Replicated
- 게임
- 언리얼#프로그래밍#c++#포트폴리오준비#블루프린트->c++전환
- 언리얼#c++#Interface
- 언리얼
- Direct3D
- 언리얼엔진#FPS
- Multiplayer
- LockonSystem
- ros2
- 게임프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |