Texture arrays (arreglos de Textura)
Debugging DirectX 12 shaders with PIX

Depurando shaders DirectX 11 con 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.

Se recomienda utilizar Visual Studio 2013, ya que contiene varios arreglos para el Depurador de Gráficos.

Nota: El Editor de Unity contiene varias ventanas hijas dentro, esto podría causar que el Depurador de Gráficos capture un frame de la ventana incorrecta, para asegurar que la ventana correcta será capturada, marque la pestaña ‘Maximize on Play’, y presione el botón de Play antes de capturar, pero incluso ahí no hay garantía que la ventana correcta será captura, esta es la razón por la cual no se recomienda usar el Editor de Unity para capturar un frame.

Nota: Los Frames solo se pueden capturar si Unity está ejecutándose bajo DirectX 11, usted puede seleccionar DirectX 11 de los Player Settings (PC, Mac & LinuxStandalone) -> Other Settings.

Pasos para capturar el frame desde el Editor de Unity o Windows Standalone:

  • Ejecute Visual Studio 2013
  • Vaya a File->New->Project->Visual C++->Empty Project
  • Vaya a Project->Properties->Configuration Properties->Debugging
  • In Command field, replace $(TargetPath) with path to Unity Editor or Windows Standalone, for ex., C:\MyApp\MyApp.exe
  • (Opcional) En Command Arguments, especifique -force-d3d11, esto obligará al Windows Standalone o el Editor de Unity a ejecutarse bajo DirectX 11
  • Propiedades de Proyecto
  • Usted está listo para ejecutar el Depurador de Gráficos, vaya a Debug->Graphics->Start Diagnostics
  • Si todo está configurado correctamente debería ver un mensaje “Use ‘Print Screen’ key to capture a frame” en la esquina superior izquierda de la aplicación. Vea la captura de pantalla abajo.
  • Captura de pantalla de la aplicación de Windows Standalone ejecutándose con el Depurador de Gráficos

Pasos para depurar el DirectX 11 shader:

  • Para depurar un shader usted tendría que compilar con los símbolos de depuración, para hacer esto, usted necesita insertar #pragma enable_d3d11_debug_symbols
  • Intentemos crear un ejemplo básico:
    • Cree un nuevo projecto de Unity
    • Cree un nuevo shader (sombreador) en la ventana de Assets
    • Inserte #pragma enable_d3d11_debug_symbols
    • Cree un nuevo material y seleccione su shader personalizado
    • Asigne un materia a algún objeto, por ejemplo., un cubo
    • Construya una aplicación Standalone Windows
    • Capture un frame con los pasos mencionados arriba

Su shader (Sombreador) debería verse así:

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

Si todo se hace correctamente, debe ver el siguiente frame capturado, haga clic derecho y seleccione Pixel History y seleccione el píxel de un objeto que tenga asignado su shader personalizado.

Frame capturado
Frame capturado

Haga clic en el botón play junto al Vertex Shader (rodeado en rojo en la captura de pantalla anterior), debe poder depurar el vertex shader.

Depurando el vertex shader
Depurando el 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.

Los pasos para capturar el frame y la depuración de shader son iguales para el Editor de Unity o para Windows Standalone.

Técnicas alternativas de depuración shader

En el Editor de Unity, usted puede también usar RenderDoc para depurar los shaders, al capturar la escena dentro del editor y depurar la herramienta standalone.

Texture arrays (arreglos de Textura)
Debugging DirectX 12 shaders with PIX