텍스처 배열
PIX로 DirectX 12 셰이더 디버깅

Visual Studio로 DirectX 11/12 셰이더 디버깅

Microsoft Visual Studio(2012 버전 이상)에서 제공되는 Graphics Debugger를 사용하여 Unity 에디터, Windows 스탠드얼론 또는 유니버설 Windows 플랫폼에서 애플리케이션의 개별 프레임을 캡처하여 디버깅할 수 있습니다.

Visual Studio에서 Graphics Debugger를 설치하려면 다음 단계를 따르십시오.

  1. Tools > Get Tools and Features 로 이동합니다

  2. Individual components 탭에서 Games and Graphics 로 스크롤한 후 Graphics debugger and GPU profiler for DirectX 체크박스를 선택합니다.

  3. Modify 를 클릭합니다.

  4. 설치가 완료될 때까지 기다린 후 지침에 따라 컴퓨터를 재시작합니다.

Visual Studio로 DirectX 셰이더 캡처

프레임을 캡처하려면 Unity 에디터에서 실행되는 버전이 아니라 Unity 애플리케이션의 빌드된 버전을 사용해야 합니다. 이는 에디터에 한 번에 여러 개의 자식 창이 열려 있는 경우 그래픽스 디버거가 의도하지 않은 창에서 프레임을 캡처할 수도 있기 때문입니다.

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

두 플랫폼 중 한 곳에서 그래픽스 디버거를 사용하려면 다음 단계에 따라 더미 Visual Studio 프로젝트를 생성해야 합니다.

  1. Visual Studio 2017을 실행합니다.

  2. File > New > Project > Visual C++ > Empty Project 로 이동합니다.

  3. Project > Properties > Configuration Properties > Debugging 으로 이동합니다.

  4. Command 필드에서 $(TargetPath)를 Unity 에디터 또는 Windows 스탠드얼론 경로(예: C:\MyApp\MyApp.exe 등)로 대체합니다.

  5. Windows 스탠드얼론 또는 Unity 에디터가 DirectX 11에서 실행되도록 만들려면 Command Arguments 를 선택하고 -force-d3d11 을 입력합니다. Project Properties

  6. Debug > Graphics > Start Graphics Debugging 으로 이동합니다.

  7. 모든 구성을 올바르게 마치면 Unity가 애플리케이션의 왼쪽 코너 상단에 다음의 텍스트를 표시합니다. Unity 에디터의 디버거 메시지

  8. 프레임을 캡처하려면 키보드의 Print Screen 키를 누르거나, Visual Studio 인터페이스의 왼쪽에 있는 Capture Frame 상자를 클릭합니다. Visual Studio 인터페이스에서 프레임 캡처

Visual Studio로 DirectX 셰이더 디버그

셰이더를 디버그하려면 디버그 심볼을 사용하여 컴파일해야 합니다. 그러려면 #pragma enable_d3d11_debug_symbols 를 삽입해야 합니다.

셰이더는 다음과 같은 형태입니다.

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"
}

워크플로 예시

전체 프로세스를 보여주는 기본 예제를 만들어 보겠습니다.

  1. 새 Unity 프로젝트를 만듭니다(시작하기 문서 참조).

  2. 상단 메뉴에서 Assets > Create > Shader > Standard Surface Shader 로 이동합니다. 그러면 Project 폴더에 새 셰이더 파일이 생성됩니다.

  3. 셰이더 파일을 선택하고, Inspector 창에서 Open 을 클릭합니다. 그러면 스크립팅 에디터에서 셰이더 파일이 열립니다. 셰이더 코드의 다른 #pragma 줄 아래에 #pragma enable_d3d11_debug_symbols를 삽입합니다.

  4. 새 머티리얼(메뉴: Assets > Create > Material)을 생성합니다.

  5. 머티리얼의 Inspector 창에서 Shader 드롭다운을 선택하고 Custom 으로 이동한 후 방금 생성한 셰이더를 선택합니다.

  6. 3D 큐브 게임 오브젝트(메뉴: GameObject > 3D Object > Cube)를 생성합니다.

  7. 새 게임 오브젝트에 새 머티리얼을 할당합니다. 이렇게 하려면 머티리얼을 Project 창에서 3D 큐브로 드래그합니다.

  8. Windows 스탠드얼론용 프로젝트를 빌드합니다. 실제 프로젝트는 너무 커서 셰이더를 디버그할 때마다 빌드하면 비효율적일 수 있습니다. 이 경우 에디터에서 디버그하십시오. 단, 캡처가 올바른 창을 프로파일링했는지 확인해야 합니다.

  9. Capture DirectX shaders with Visual Studio 섹션에 설명된 단계에 따라 프레임을 캡처합니다.

  10. 캡처된 프레임이 Visual Studio에 나타나면, 마우스 오른쪽 버튼으로 클릭한 후 Pixel 을 선택합니다.

    캡처된 프레임, History, 커스텀 셰이더가 할당된 오브젝트의 pixel 선택.
    캡처된 프레임, History, 커스텀 셰이더가 할당된 오브젝트의 pixel 선택.
  11. 버텍스 셰이더 옆에 있는 재생 버튼(위 스크린샷에서 강조 표시됨)을 클릭합니다. 그러면 다음과 같은 버텍스 셰이더 파일이 열립니다. 버텍스 셰이더 디버깅

There is a known issues while working with DirectX 12, in which the play buttons are not available, and the following error appears: This draw call uses system-value semantics that interfere with pixel history computation. If you experience this, use PIX to debug your shaders instead.

유니버설 Windows 플랫폼

유니버설 Windows 플랫폼에서 디버그하는 경우 더미 Visual Studio 프로젝트는 Unity에서 자동으로 생성되므로 따로 생성할 필요가 없습니다.

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

다른 셰이더 디버깅 기법

You can also use RenderDoc to debug shaders. In RenderDoc, you capture the Scene from within the Editor, then use the standalone tool for debugging.

PIX works in a similar way to Visual Studio’s Graphics Debugger. Use PIX instead of the Graphics Debugger to debug DirectX 12 projects.


텍스처 배열
PIX로 DirectX 12 셰이더 디버깅