SwapChain의 DXGI_FORMAT 종류

프로그래밍/DirectX

DirectX에서 SwapChain을 생성할때 후면버퍼의 Format을 설정하는 부분이 있다.

 

1
2
3
4
5
6
7
8
9
// Swap chain
DXGI_SWAP_CHAIN_DESC sd;
sd.BufferDesc.Width = m_width;
sd.BufferDesc.Height = m_height;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
cs

 

책에서나 다른 예제에서는 대충 "DXGI_FORMAT_R8G8B8A8_UNORM 을 자주 쓴다." 라는 말만 적혀있지, 왜 그걸 자주 쓰며 다른 Format에는 어떤 것이 있는지는 잘 나와있지 않다.

 

호기심에 DXGI_FORMAT의 다른 값을 넣어봤다.

DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_UINT 등등...

 

결과는 SwapChain 생성에 실패했다.

 

구글링을 해보았지만, 대부분 "DXGI_FORMAT_R8G8B8A8_UNORM을 기본으로 사용한다" 라는 튜토리얼 형식의 똑같은 설명 뿐이고 다른 Format을 사용하는 예제는 보이지 않았다.

 

내가 중간에 잘못 쓴 코드가 있는 것인지, 컴퓨터가 문제인지 알 수 없어서 한참을 찾아본 끝에서야 MSDN에서 관련 내용을 찾을 수 있었다.

 

This structure is used by the GetDisplayModeList and FindClosestMatchingMode methods.

The following format values are valid for display modes and when you create a bit-block transfer (bitblt) model swap chain. The valid values depend on the feature level that you are working with.

 

즉, SwapChain의 후면버퍼와 같이 디스플레이에 관련된 DXGI_FORMAT은 위에 나열된 형식밖에 되지 않는다는 것.

DirectX의 버전이 올라가면서 표현 가능한 색상의 비트수만 커질뿐, 본질적인 형태는 크게 변하지 않은 듯 하다.

그래서 보통 "대부분의 경우에는 DXGI_FORMAT_R8G8B8A8_UNORM을 사용한다" 라고 설명하고 사용한 것 같다.

 

DXGI_FORMAT_R8G8B8A8_SNORM나 DXGI_FORMAT_R8G8B8A8_UINT와 같은 Format은 아예 지원하지 않는 형식이기 때문에 SwapChain을 만들지 못하고 오류가 발생한 것으로 보인다.

 

https://docs.microsoft.com/ko-kr/previous-versions/windows/desktop/legacy/bb173064(v=vs.85)

 

DXGI_MODE_DESC structure (Windows)

DXGI_MODE_DESC structure 05/18/2018 2 minutes to read In this article --> Describes a display mode. Syntax typedef struct DXGI_MODE_DESC { UINT                     Width; UINT                     Height; DXGI_RATIONAL            RefreshRate; DXGI_FORMAT   

docs.microsoft.com