텍스처 배열
Debugging DirectX 12 shaders with PIX

Visual Studio로 DirectX 11 셰이더 디버깅

Microsoft는 Visual Studio 2012에 그래픽스 디버거를 도입했습니다. 이 디버거를 사용하여 Unity 에디터, Windows 스탠드얼론 또는 유니버설 Windows 플랫폼 같은 플랫폼에서 프레임을 캡처할 수 있습니다.

그래픽스 디버거의 문제를 몇 개 수정한 Visual Studio 2013을 사용하는 것이 좋습니다.

참고: Unity 에디터 안에는 여러 자식 창이 있기 때문에 그래픽스 디버거가 잘못된 창에서 프레임을 캡처할 수 있습니다. 올바른 창이 캡처되도록 하려면 ‘Maximize on Play’ 탭을 선택하고 캡처 전에 플레이 버튼을 눌러야 합니다. 하지만 그래도 올바른 창이 캡처된다는 보장이 없기 때문에 Unity 에디터를 사용하여 프레임을 캡처하는 것은 권장되지 않습니다.

참고: Unity가 DirectX 11에서 실행 중인 경우에만 프레임이 캡처됩니다. Player Settings(PC, Mac 및 Linux 스탠드얼론) -> Other Settings에서 DirectX 11을 선택할 수 있습니다.

Unity 에디터 또는 Windows 스탠드얼론에서 프레임을 캡처하는 절차:

  • Visual Studio 2013을 실행합니다.
  • File->New->Project->Visual C++->Empty Project로 이동합니다.
  • Project->Properties->Configuration Properties->Debugging으로 이동합니다.
  • Command 필드에서 $(TargetPath)를 Unity 에디터 또는 Windows 스탠드얼론 경로(예: C:\MyApp\MyApp.exe 등)로 대체합니다.
  • (선택 사항)Command Arguments-force-d3d11을 지정합니다. 그러면 Windows 스탠드얼론 또는 Unity 에디터가 DirectX 11에서 강제로 실행됩니다.
  • 프로젝트 프로터티
  • 그래픽스 디버거를 실행할 준비가 되었습니다. Debug->Graphics->Start Diagnostics로 이동합니다.
  • 모든 것이 올바르게 설정된 경우 애플리케이션 왼쪽 상단 모서리에 “Use ‘Print Screen’ key to capture a frame” 메시지가 보입니다. 아래 스크린샷을 참조하십시오.
  • 그래픽스 디버거와 함께 실행되는 Windows 스탠드얼론의 스크린샷

DirectX 11 셰이더 디버그 절차:

  • 셰이더를 디버그하려면 디버그 심볼을 사용하여 컴파일해야 하고, 그러려면 #pragma enable_d3d11_debug_symbols를 삽입해야 합니다.
  • 기초적인 예제를 만들어 보겠습니다.
    • 새 Unity 프로젝트를 만듭니다.
    • 에셋 창에서 새로운 셰이더를 만듭니다.
    • #pragma enable_d3d11_debug_symbols를 삽입합니다.
    • 새 머티리얼을 만들고 사용자 셰이더를 선택합니다.
    • 예를 들어, 큐브 같은 오브젝트에 머티리얼을 할당합니다.
    • Windows 스탠드얼론 애플리케이션을 빌드합니다.
    • 위에서 설명한 절차에 따라 프레임을 캡처합니다.

셰이더는 다음과 같아야 합니다.

Shader "Custom/NewShader" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert
        #pragma enable_d3d11_debug_symbols
        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

모든 작업을 올바르게 수행하면 아래와 같은 캡처된 프레임이 보입니다. 오른쪽 클릭하고 Pixel History를 선택한 후 사용자 셰이더가 할당된 오브젝트의 픽셀을 선택합니다.

캡처된 프레임
캡처된 프레임

Vertex Shader 옆의(위 스크린샷에 빨간색 원으로 표시된) play 버튼을 클릭하면 버텍스 셰이더를 디버그할 수 있습니다.

버텍스 셰이더 디버깅
버텍스 셰이더 디버깅

유니버설 Windows 플랫폼

유니버설 Windows 플랫폼의 경우 Unity에서 프로젝트를 미리 만들기 때문에 더미 Visual Studio 프로젝트를 만들지 않아도 되므로 좀 더 편리합니다.

프레임 캡처 및 셰이더 디버깅 절차는 Unity 에디터 또는 Windows 스탠드얼론의 경우와 동일합니다.

다른 셰이더 디버깅 기법

Unity 에디터에서는 RenderDoc을 사용하여 셰이더를 디버그할 수도 있습니다. 에디터 안에서 씬을 캡처하고 스탠드얼론 툴에서 디버그하면 됩니다.

텍스처 배열
Debugging DirectX 12 shaders with PIX