본문 바로가기
Development

DX11 IASetIndexBuffer R32_UINT 포맷 invalid 오류

by LiiYuu 2021. 5. 22.
 

이것 때문에 이틀 동안 삽질한 것 같다... __ __

 

device, immediate context 생성하고 필요한 리소스들 만들어서 바인딩하고 드로우

삼각형이 제대로 나오지가 않고 검은 화면만 나와서  VS 그래픽 디버거 돌려보았는데

저 부분에서 계속 예외가 발생...

 

 

출력 창에서 오류 내역을 보면, IASetIndexBuffer 시 인덱스 버퍼의 포맷을 R32_UINT 로 사용할 수 없다고 나온다.

더보기

D3D11 ERROR: ID3D11DeviceContext::IASetIndexBuffer: The Format (0x2a, R32_UINT) is not valid for usage as an IAIndexBuffer Format. [ STATE_SETTING ERROR #242: DEVICE_IASETINDEXBUFFER_FORMAT_INVALID]


D3D11: **BREAK** enabled for the previous message, which was: [ ERROR STATE_SETTING #242: DEVICE_IASETINDEXBUFFER_FORMAT_INVALID ]

그래서 인덱스 버퍼 타입 바꾸고 R16_UINT 로 설정해서 실행했더니 예외 발생은 안 하고 잘 돌아가기는 함...

 

뭐가 문제일까 하면서 여러가지 바꾸면서 삽질하다가

혹시 R32_UINT 포맷을 지금 환경에서 지원을 안 하는 건가??라는 생각으로 immediate context 생성 부분을 확인하면서... 

저것을 보고 모든 악의 원인을 알게되었다...

D3D11CreateDevice 에서 device 와 immedate context 생성 시, 저 feature level 배열을 넣어주고 있었는데 여기서 2가지 실수 가 있었다.

 

1. D3D_FEATURE_LEVEL_9_1 는 IASetIndexBuffer 시 R32_UINT 포맷을 지원 안 한다.

https://docs.microsoft.com/ko-kr/windows/win32/direct3d11/d3d11-graphics-reference-10level9-context#id3d11devicecontextiasetindexbuffer

 

2. D3D11CreateDevice 의 pFeatureLevels 역할

장치 생성 시 pFeatureLevels 매개 변수에 넣은 feature level 배열의 첫 번째 원소부터 보며 gpu 가 해당 level 을 지원할 경우 그 level 기준으로 생성하게 된다.

그래서 지원 가능한 첫 번째 9_1 로 생성이 되어 R32_UINT 를 사용 못한다고 나온 것이다...

 
 
 
 
 
 

'Development' 카테고리의 다른 글

convolution matrix  (0) 2021.08.08
DirectX 12 를 공부하면서  (0) 2021.07.03
Go 를 이용한 Discord SVN 커밋 알림 봇 제작  (0) 2020.12.12