서론: 자체제작 엔진의 첫 관문, DirectX!
- 엔진으로 가는 첫 번째 관문은 바로 그래픽스 API인 DirectX로 결정했다!
- 일전에도 그래픽스 공부를 진행하긴 했었지만 OpenGL과 freeglut을 활용해서 간단한 데모들만 만들었을 뿐더러, 당시의 목표는 그래픽스 이론 자체가 중점이었기 때문에 시스템 관점에서의 그래픽스 엔진에 대해선 제대로 공부하지 못했었다.
- 그래서, 이번 기회에 엔진의 기반이 될 렌더러를 DirectX로 제작하며 그래픽스 엔진과 Windows 시스템에 대해 좀 더 깊이 공부해볼 생각이다.
- 이를 위한 첫 번째 스텝은 바로 윈도우에서 제공한 DirectX 튜토리얼을 나의 게임엔진 아키텍쳐에 맞춰 클론 코딩해 보는 것이다!
근데 얘 왜이래…

(디지털 세계 드가는줄…)
- 처음 위와 같은 에러가 뜬 걸 보고 경악을 했다… 아무리 코드를 잘못 짰기로서니 이건 뭐… 거의 GPU가 비명을 지르는 수준이 아닌가… 지정된 윈도우 영역 밖을 벗어나 스크린 버퍼 자체를 어지럽히다니… 아마 드라이버의 Present과정에서 flip을 진행하다 에러가 난 것으로 보인다.
- 특정버퍼, 에셋을 만들어놓고 DeviceContext에 Set(OpenGL로 치면 Binding)을 해주지 않은 것 같다. 뭐 이정도는 비주얼 스튜디오 디버거로 찾으면 빠르니까 후딱 디버깅을 진행해보자.

(Ah….)
- 세상에… dll으로 로드된 DirectX객체라서 비주얼 스튜디오 기본 디버거에 연결되지 않는다… 이대로 디버깅을 포기하거나 쌩 노가다 디버깅을 해야하는 것인가…
- 할 수 있지만, 나는 개발툴에 미쳐있는 마이크로소프트를 믿기때문에 당연히 DirectX 전용 디버거가 어딘가에 존재할 것이라 생각했고 구글링을 시작했다.
본론: Visual Studio Graphics Diagnostics
사용방법
- 사용방법은 아주아주 간단하다. 애초에 마이크로소프트가 Visual Studio자체에 DirectX라이브러리와 관련 기능들을 모두 내장시켜줬기 때문에 Visual Studio Installer에서 DirectX, 게임개발 관련 기능들을 설치해줬다면 별다른 설정 없이 사용 가능하다.
- 그냥 메뉴바에서 “디버그>그래픽>그래픽 디버깅 시작”을 눌러주기만 하면 된다.
(Alt + F5 로도 가능)

- 그러고 나서 사용자 권한을 허락해주면 다음과 같이 창이 뜬다.

- 이렇게 되면 기본적인 성능 프로파일링부터 오브젝트, GPU버퍼 등등… 상상 이상의 많은 기능들이 내포된 디버거를 활용 가능하다.
간단한 기능 설명!
1. 프레임 캡쳐 기능

- 프레임 캡쳐 기능을 활용하면 현재 내가 렌더링한 프레임의 덤프 파일을 캡쳐해준다.
2. Visual Studio Graphics Analyzer

- 위의 캡쳐한 프레임을 더블클릭하면 “Visual Studio Graphics Analyzer”창이 뜨면서 위와 같은 디버깅 정보가 상세하게 뜨게된다.
- 특히, 아래의 “개체 테이블”을 보게되면 비주얼 스튜디오 기본 조사식에 나오지 않았던 D3D객체들의 상세한 내용들을 볼 수 있다.

- 위처럼 내가 시스템에서 버텍스 버퍼에 보내놓은 정점 정보도 조회 가능하다.
3. Shader Break point
- 왼쪽의 “이벤트 목록”창을 보게 되면 내가 해당 프레임에 어떤 작업을 했는지에 대해 전부 띄워준다.
- 특히, 여기서 “Draw”관련 정보(드로우콜)들을 클릭하게 되면 각 스테이지별, 셰이더별로 어떤 정보가 이력됐는지 맨 아래에 있는 “뷰” 창에서 볼 수 있는데

- “뷰” 창의 각 정점 요소들에 대해 초록색 화살표를 누르게 되면 아래처럼 새로운 창이 떠서 각각의 vertex 요소들에 대해 브레이크 포인트를 찍어보고 어떤 값이 출력되는지에 대해 추적할 수 있다.

이 외에도…
결론: 그래서? 내가 짠 코드는 뭐가 문제였을까?
- 버퍼 크기와 저장된 데이터를 보니 드로우 콜 자체는 문제가 없고, 아마 드로우 콜을 위해 데이터들을 DeviceCiontext에 Set(Bind)하는 과정중에 무언가 빠져있을 것이라 생각했다.
- 그래서 드로우 콜만 주석처리 하고 DeviceContext객체를 디버거를 통해 확인해본 결과…
진짜 결론: 나는 바보다

(진짜 바본가?)