Visual Studio에서 DirectX11 디버깅하기

JellyPower·2023년 8월 23일
0
post-thumbnail

서론: 자체제작 엔진의 첫 관문, DirectX!

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

근데 얘 왜이래…

(디지털 세계 드가는줄…)

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

    (Ah….)
  • 세상에… dll으로 로드된 DirectX객체라서 비주얼 스튜디오 기본 디버거에 연결되지 않는다… 이대로 디버깅을 포기하거나 쌩 노가다 디버깅을 해야하는 것인가…
  • 할 수 있지만, 나는 개발툴에 미쳐있는 마이크로소프트를 믿기때문에 당연히 DirectX 전용 디버거가 어딘가에 존재할 것이라 생각했고 구글링을 시작했다.

본론: Visual Studio Graphics Diagnostics

  • 당연히도 비주얼 스튜디오에 내장된 그래픽스 디버거가 따로 있었다.

    Graphics diagnostics - Visual Studio

  • 오늘은 해당 디버거의 사용방법에 대해 간단히 알아보고자 한다. 개발툴에 미친놈들답게 내가 상상한 것 이상의 많은 기능들이 담겨있다.

사용방법

  1. 사용방법은 아주아주 간단하다. 애초에 마이크로소프트가 Visual Studio자체에 DirectX라이브러리와 관련 기능들을 모두 내장시켜줬기 때문에 Visual Studio Installer에서 DirectX, 게임개발 관련 기능들을 설치해줬다면 별다른 설정 없이 사용 가능하다.
  2. 그냥 메뉴바에서 “디버그>그래픽>그래픽 디버깅 시작”을 눌러주기만 하면 된다.
    (Alt + F5 로도 가능)

  3. 그러고 나서 사용자 권한을 허락해주면 다음과 같이 창이 뜬다.
    - 이렇게 되면 기본적인 성능 프로파일링부터 오브젝트, GPU버퍼 등등… 상상 이상의 많은 기능들이 내포된 디버거를 활용 가능하다.

간단한 기능 설명!

1. 프레임 캡쳐 기능

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

2. Visual Studio Graphics Analyzer

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

- 위처럼 내가 시스템에서 버텍스 버퍼에 보내놓은 정점 정보도 조회 가능하다.

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

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

이 외에도…

  • GPU사용량을 더 면밀하게 조사한다던가 하는 다양한 기능들이 있다.

  • 디버거의 자세한 기능들의 명세, 사용법은 전부 마이크로소프트 공식 홈페이지에 올라와있으니 찾아서 읽어보도록 하자.

    Graphics diagnostics - Visual Studio

결론: 그래서? 내가 짠 코드는 뭐가 문제였을까?

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

진짜 결론: 나는 바보다


(진짜 바본가?)

profile
게임엔진코드싸개(진)

0개의 댓글