Version: 5.3 (switch to 5.4b)
Уровень детализации шейдера (Level Of Detail)
Implementing Fixed Function TexGen in Shaders

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

В Visual Studio 2012, Microsoft представили отладчик графики (Graphics Debugger), который вы можете использовать, чтобы захватывать кадры из таких платформ как редактор Unity (Unity Editor), приложения Windows или приложения Windows Store.

Рекомендуется использовать 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:

  • Запустите Visual Studio 2013
  • Проследуйте по пути File->New->Project->Visual C++->Empty Project
  • Проследуйте по пути Project->Properties->Configuration Properties->Debugging
  • В поле Command замените $(TargetPath) путём к Unity Editor или приложению Windows. Например: C:\MyApp\MyApp.exe
  • (Опционально) В пункте Command Arguments укажите -force-d3d11. Это заставит приложение или Unity Editor работать в режиме DirectX 11.
  • Настройки проекта
  • Вы готовы запускать отладчик графики. Проследуйте по пути Debug->Graphics->Start Diagnostics
  • Если всё настроено корректно, то в верхнем левом углу вы увидите сообщение “Use ‘Print Screen’ key to capture a frame” (Используйте кнопку ‘Print Screen’ для захвата кадра). Как на скриншоте ниже.
  • Скриншот из приложения Windows запущенного с отладчиком графики

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

  • Для отладки шейдера вам надо провести компиляцию со знаками отладки. Чтобы сделать это, вам нужно вставить #pragma enable_d3d11_debug_symbols
  • Давайте попробуем сделать простой пример:
  • Создайте новый проект Unity
  • Создайте новый шейдер в окне Project.
  • Вставьте #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 и выберите пиксель объекта, который использует ваш шейдер.

Захваченный кадр
Захваченный кадр

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

Отлаживание вершинного шейдера
Отлаживание вершинного шейдера

Приложения Windows Store

Для приложений Windows Store это немного проще, потому что вам не надо будет создавать пустой проект в Visual Studio - 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.

Уровень детализации шейдера (Level Of Detail)
Implementing Fixed Function TexGen in Shaders