텍스쳐가 입혀진 큐브 오브젝트에 안개 효과를 주는 예제를 하고 있는데 예제에 나온대로 나오지 않고, 까만색으로만 나와서, Visual Studio 에서 제공하는 Visual Studio Graphics Analyzer 로 셰이더 디버깅을 해봤다, 예전에는 나도 Visual Studio Graphics Analyzer 를 어떻게 쓰는지 몰랐는데, 요즘은 예전보다 그나마 조금 더 알게되어서, 혹시나 Visual Studio Graphics Analyzer 사용법을 아예 모르는 사람들을 위해서, 간단한 셰이더 디버깅 과정을 올려본다
일단 최종 픽셀 컬러가 온통 까만색인것은 Pixel Shader 부분에서 0을 실수로 곱해진게 아닌가 추정해본다 Visual Studio Graphics Analyzer 를 사용하면 Shader 코드 또한 Debug 모드로 볼 수 있는데, 0이 어디서부터 곱해진건지 추적해보겠다.
일단 HLSL 코드를 디버깅 하기 위해서는 위와 같이 D3DCOMPILE_DEBUG를 기본적으로 D3DCompileFromFile 함수 인자로 넣어줘야 HLSL 코드 디버깅이 가능하다, 위와 같이 해주지 않으면
위와 같이 뜨면서 HLSL 코드 디버깅을 할 수 없으니 반드시 D3DCOMPILE_DEBUG 를 D3DCompileFromFile 함수의 인자로 넣어주자.
Debug/Start Graphics Debugging 을 누르면
어떤 동의를 할것을 물어보는데, 동의 하고 넘어가면
본인이 만든 프로그램이 실행되면서
diagsession 창이 나타난다 그때diagsession 창안에자세히 살펴보면 Capture Frame 버튼이 있는데 그것을 클릭해준다
그럼 위와같이 snapshot이 찍혀진다, 이때부터는 본인이 만든 프로그램은 종료해준다
찍혀진 스냅샷을 더블클릭하면 Visual Studio Graphics Analyzer 가 실행된다
Visual Studio Graphics Analyzer가 실행되면 위와 같이 나오는데, 이때 snapshot의 원하는 pixel을 찍으면 그 pixel의 어떤 과정을 거쳐서 나오는지를 픽셀 기록 창에서 볼수 있다, 필자는 검은색 부분을 찍고 DrawIndexed 부분을 살펴봤다
그럼 위와 같이 나오는데, vertex shader, pixel shader를 디버깅 할 수 있게 해준다, Play 버튼과 Stop 버튼 모두 우리가 익히 알고 있는 Debug 모드의 Play, Stop 과 동일하다, 또한 Play 상태에서 F10 을 누르면 한 줄 넘기기도 된다, 거의 일반 Debug 모드와 동일하다고 보면 된다
그럼 Pixel Shader 부터 Play 버튼을 누르고 F10으로 하나씩 내려가봤다
textureColor, fogColor, 전부 값이 유효했다(0이 아님)
다만 input.fogFactor 값이 0 이었다.
아직 input.fogFactor 가 원인이라고 보기에는 불분명하지만, 일단 예제에서 나와야될 값은 0이 아니었다, 즉 input.fogFactor가 0으로 나와서는 안되므로 input.fogFactor를 전달하는 vertex shader를 살펴보기로 했다.
역시나 fogFactor가 예상했던 대로 vertex shader 부터 0이 되었었고
자세히 살펴보니 선형 안개를 계산하는 부분이 잘못 구현되어 있었다,
약간의 실수로 양옆의 ( ) 를 안해줬다 (망할놈의 오타 -_-;;)
Visual Studio Graphics Analyzer 의 강점중 하나는, shader 코드를 수정하면, 그결과를 바로 볼 수 있게 해준다, 코드를 수정한뒤 저장하면, 파이프라인 단계창이나 출력병합기를 클릭하면 바로 볼 수 있다, 참고로 fogColor는 회색으로 맞췄었는데, 회색 그대로가 나온것이다, 그러나 여전히 안개효과는 보이지 않는다. 그래도 검은 색으로 나오는 문제는 해결했다.
fogStart, fogEnd 값은 vertex shader 에서 사용할 수 있는 constant buffer 에 존재하며, 각각 0.0f, 5.0f 이어야 하는데, 혹시 이 부분이 0이 되어서 그런게 아닐까 싶어서 직접 하드코딩 해서 실행해봤다
그제서야 문제없이 안개 효과가 보인다, 즉 fogStart, fogEnd 값이 도중에 0으로 초기화 되거나, constant buffer 로 전달받지 못해서 그런것 같았다
알고보니 VSSetConstantBuffers를 실행 했어야 했는데 PSSetConstantBuffers 함수를 실행 해버렸다, 이렇게 되면 VertexShader 에서 fogStart, fogEnd 값을 절대로 사용할 수 없다, 이 부분은 shader 코드가 아니기 때문에 Visual Studio Graphics Analyzer 에서 바로 결과물을 확인해 볼 수 없다, Graphics Analyzer를 종료한뒤, 이번에는 디버그 모드 없이 바로 실행 해봤다
정상 작동 된다, 이상으로 Visual Studio 에서 제공하는 Visual Studio Graphics Analyzer 를 통해 간단한 셰이더 디버깅을 해봤다.