Version: 2017.1
Texture arrays
Implementing Fixed Function TexGen in Shaders

Отладка DirectX 11 шейдеров с помощью Visual Studio

In Visual Studio 2012, Microsoft has indroduced Graphics Debugger, you can use it to capture a frame from platforms like Unity Editor, Windows Standalone or Universal Windows Platform.

Рекомендуется использовать Visual Studio 2013, так как в этой версии есть некоторые исправления отладчика графики.

На заметку: Unity Editor содержит несколько других окон внутри, из-за этого отладчик графики может захватить кадр не из нужного окна. Чтобы убедиться, что захват произойдёт из нужного окна, включите режим ‘Maximize on Play’ и нажмите кнопку Play перед началом захвата, но даже тогда нет гарантии, что захват произойдёт из нужного окна. Именно поэтому не рекомендуется использовать Unity Editor для захвата кадра.

На заметку: Кадры могут быть захвачены, только если Unity работает в режиме DirectX 11. Вы можете включить режим DirectX 11 в пункте меню Player Settings (PC, Mac & LinuxStandalone) -> Other Settings.

Шаги для захвата кадра из Unity Editor или standalone приложения Windows:

  • Launch Visual Studio 2013
  • Go to File->New->Project->Visual C++->Empty Project
  • Go to Project->Properties->Configuration Properties->Debugging
  • In Command field, replace $(TargetPath) with path to Unity Editor or Windows Standalone, for ex., C:\MyApp\MyApp.exe
  • (Optional) In Command Arguments specify -force-d3d11, this will force Windows Standalone or Unity Editor to run under DirectX 11
  • Project Properties
  • You’re ready to run Graphics Debugger, go to Debug->Graphics->Start Diagnostics
  • If everything is configured correctly you should see “Use ‘Print Screen’ key to capture a frame” message in top left corner of the application. See screenshot below.
  • Screenshot from Windows Standalone application running with Graphics Debugger

Шаги для отладки DirectX 11 шейдера:

  • To debug a shader you have to compile with debug symbols, to do that, you have insert #pragma enable_d3d11_debug_symbols
  • Let’s try to create a basic example:
    • Create a new Unity project
    • Create a new shader in Assets window
    • Insert #pragma enable_d3d11_debug_symbols
    • Create a new material and select your custom shader
    • Assign a material to some object, for ex., a cube
    • Build Windows Standalone application
    • Capture a frame with steps mentioned above

Ваш шейдер должен будет выглядеть примерно так:

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 и выберите пиксель объекта, который использует ваш шейдер.

Captured frame
Captured frame

Нажмите на кнопку play рядом с пунктом Vertex Shader (обведена красным на скриншоте ниже). Теперь вы сможете заняться отладкой вершинного шейдера.

Debugging vertex shader
Debugging vertex shader

Universal Windows Platform

For Universal Windows Platform, it’s a bit easier because you don’t need to create a dummy Visual Studio project as the project is already created by Unity.

Шаги для захвата кадра и отладки шейдера точно такие же, как и для Unity Editor или приложения Windows.

Alternative shader debugging techniques

In the Unity Editor, you can also use RenderDoc to debug shaders, by capturing the scene from within the editor and debugging in the standalone tool.

Texture arrays
Implementing Fixed Function TexGen in Shaders