megayuchi엔진의 UWP버전에 데스크탑 버전의 기능을 거의 99% 포팅했다.
DirectX 11은 실제로 DirectX 11의 기능을 준수하지 못하는 디바이스에서도 작동할 수 있다. Feature Level이란 단계로 구분하는데 9.0, 9.1, 9.3 , 10.0 , 11.0 등으로 구분한다.
예를 들어 DirectX 9세대의 그래픽 카드인 경우 Feature Level 9.0으로 D3DDevice를 생성할 수 있다. 당연히 DX11의 기능은 사용하지 못한다. 다만 프로그래밍은 DX11로 할 수 있다.
이 경우 몇 가지 문제가 있다.
- HLSL Shader는 문법상VS4.0,PS4.0이상을 사용할 수 있지만 기능과 명령어 개수의 제한은 DX9의 것을 따른다. 따라서 실질적으로는 Feature Level9와 11의 Shader를 따로 작성해야한다.
- 상수 레지스터의 개수도 DX9의 제약을 그대로 적용받는다. 따라서 constant buffer의 사이즈 제약 때문에 결국 Feature Level9와 11의 코드를 따로 작성해야한다.
- API에서의 제약도 DX9의 제약을 그대로 적용받는다. 예를 들면 샘플러의 종류 제한이라든가 OMSetRenderTarget()에서 동시에 설정할 수 있는 렌더타겟 개수등이다. 따라서 API를 호출하는 코드도 Feature Level9와 11의 코드를 따로 작성해야한다.
웬만한 데스크탑이나 요새 나오는 intel 내장 그래픽의 태블릿에선 전혀 문제가 없다. 문제는 폰이다. 퀄컴의 adreno 405 이전의 모바일 GPU들은 DirectX Feature Level 11을 지원하지 않는다.
adreno 405이상을 탑재한 AP는 스냅드래곤 808, 810 등이다. 이 칩을 내장한 폰은 이제 출시하는 루미아950,950XL뿐이다.
그래서 예전에 Windows Phone을 위해 엔진포팅을 작업을 할때 DirectX 11을 사용하긴 했으나 Feature Level 9.3을 이용할 수 밖에 없었다.
그러다보니 코드가 데스크탑버전과 꽤 달라져버렸다.
이제 DX Feature Level 11을 지원하는 루미아 950의 출시와 제대로 된 Windows Runtime을 탑재한 Windows 10 Moblie의 출시에 맞춰서 데스크탑의 DX11렌더링 코드를 모바일엔진에도 적용했다.
스샷은 별볼일 없지만 그래도 포스트 프로세싱이 확실히 적용되어 Glow와 외곽선이 들어가 있다. Cascade ShadowMap을 이용한 실시간 그림자도 적용되어있다.
물론 DirectX Feature Level 9.3이라고 해서 그림자를 넣을수 없거나 포스트 이펙트를 줄수 없는 것은 아니다. 코드를 두벌짜기가 짜증나서 최소한 돌아가는 정도로만 구현했던 것이다. 언젠간 모바일에서도 Feature Level 11을 지원하겠거니 해서 그림자와 이펙트는 아예 구현하지 않았었다.


UWP의 DirectX 11이 데스크탑 버전의 DirectX 11과 다르게 작동하면 어쩌나 걱정했는데 일단 그 부분은 전혀 문제가 없었다.
물론 실제 폰에서도 제대로 작동할런지는 돌려봐야 ….
이제 루미아 950을 구해서 실제로 DX Feature Level 11을 지원하는지 테스트해봐야겠다.