Tutorial: Depurar errores de representación debidos al sombreado
Este tutorial muestra cómo utilizar las herramientas de diagnóstico de gráficos de Visual Studio para investigar un objeto coloreado incorrectamente debido a un error del sombreador.
Este tutorial explica cómo:
Examine el documento del registro de gráficos para identificar los píxeles que muestran el problema.
Utilice la ventana Historial de píxeles de gráfico para examinar el estado del píxel más de cerca.
Utilice el depurador de HLSL para examinar los sombreadores de píxeles y vértices.
Escenario
El color incorrecto en objetos normalmente ocurre cuando un sombreador de vértices pasa un sombreador de píxeles incorrecto o información incompleta.
En este escenario, agregó recientemente un objeto a su aplicación, junto con nuevos sombreadores de vértices y de píxeles para transformar el objeto y conferirle un aspecto único. Cuando se ejecuta la aplicación durante una prueba, el objeto se presenta en negro sólido. Al usar el diagnóstico de gráficos, puede capturar el problema en un registro de gráficos de modo que pueda depurar la aplicación. El problema tiene el siguiente aspecto en la aplicación:
Investigación
Mediante las herramientas de Diagnósticos de gráficos, puede cargar el documento del registro de gráficos para inspeccionar los marcos que se capturaron durante la prueba.
Para examinar un fotograma en un registro de gráficos
En Visual Studio, cargue un registro de gráficos que contenga un marco que tenga el modelo que falta. Una nueva ventana de documento del registro de gráficos aparece en Visual Studio. En la parte superior de esta ventana es la salida del destino de representación del fotograma seleccionado. En la parte inferior está Lista de fotogramas, que muestra cada cuadro capturado como imagen en miniatura.
En la Lista de fotogramas, seleccione un marco en el que el objeto no tenga el aspecto correcto. El destino de presentación se actualiza para reflejar el fotograma seleccionado. En este escenario, la ventana de documento del registro de gráficos tiene el siguiente aspecto:
Después de seleccionar un marco que muestre el problema, puede usar la ventana Historial de píxeles de gráfico para diagnosticarlo. La ventana Historial de píxel de gráficos muestra las primitivas que pudieron tener efecto en un píxel concreto, sus sombreadores y cuáles fueron sus efectos en el destino de presentación, en orden cronológico.
Para examinar un píxel
Abra la ventana Historial de píxeles de gráficos. En la barra de herramientas Diagnóstico de gráficos, elija Historial de píxeles.
Seleccione un píxel para examinar. En la ventana de documento del registro de gráficos, seleccione uno de los píxeles del objeto que se colorea incorrectamente:
La ventana Historial de píxel de gráficos se actualiza para reflejar el píxel seleccionado. En este escenario, la ventana Historial de píxeles de gráfico tiene el siguiente aspecto:
Observe que el resultado del sombreador de píxeles es el negro totalmente opaco (0, 0, 0, 1) y que Fusión de salida combinó esto con el color Anterior del píxel de manera que el Resultado también es negro totalmente opaco.
Después de examinar un píxel que se ha coloreado incorrectamente y detectar que el resultado del sombreador de píxeles no es del color esperado, puede usar el depurador de HLSL para examinar el sombreador de píxeles y averiguar qué sucedió con el color del objeto. Puede utilizar el depurador de HLSL para examinar el estado de las variables de HLSL durante la ejecución, ejecutar paso a paso el código HLSL, y establecer puntos de interrupción que le ayudarán a diagnosticar el problema.
Para examinar el sombreador de píxeles
Comience a depurar el sombreador de píxeles. En la ventana Historial de píxeles de gráfico, en el primitivo del objeto, junto a Sombreador de píxeles, elija el botón Iniciar depuración.
En este escenario, dado que el sombreador de píxeles ha atravesado el color desde el sombreador de vértices, es fácil observar que el sombreador de píxeles no es el origen del problema.
Ponga el puntero sobre input.color. Observe que el valor es el negro lleno- opaca (0, 0, 0, 1).
En este escenario, el examen revela que color incorrecto es probablemente el resultado de un sombreador de vértices que no proporciona información de color correcta para que el sombreador de píxeles operan con.
Después de determinar que el sombreador de vértices no proporcionen probablemente a información correcta al sombreador de píxeles, el paso siguiente es examinar el sombreador de vértices.
Para examinar el sombreador de vértices
Empiece a depurar el sombreador de vértices. En la ventana Historial de píxeles de gráfico, en el primitivo del objeto, junto a Sombreador de vértices, elija el botón Iniciar depuración.
Busque la estructura de salida del sombreador de vértices, que es la entrada para el sombreador de píxeles. En este escenario, el nombre de esta estructura es output. Examine el código del sombreador de vértices y observe que han establecido al miembro de color de la estructura de output explícitamente el negro lleno- opaco, quizás como resultado alguien esfuerzos de depuración.
Confirme que nunca se copian al miembro de color de la estructura de la entrada. Dado que el valor de output.color se establece en negro lleno- opaco justo antes de que se devuelve la estructura de output , es conveniente asegurarse de que el valor de output correctamente no se inicializó en una línea anterior. Recorra el código de sombreador de vértices hasta que llegue a la línea que establece output.color a negro mientras observa el valor de output.color. Observe que no se inicializa el valor de output.color hasta que se establezca en negro. Esto confirma que la línea de código que establezca output.color a negro debe ser modificada, en lugar de eliminado.
Después de determinar que la causa del problema de representación es que el sombreador de vértices no proporciona el valor de color correcto al sombreador de píxeles, puede utilizar esta información para corregir el problema. En este escenario, puede corregirlo cambiando el código siguiente en el sombreador de vértices
output.color = float3(0.0f, 0.0f, 0.0f);
por
output.color = input.color;
Este código solo pasa el color del vértice a través de los vértices del objeto sin modificar; los sombreadores de vértices más complejos podrían modificar el color antes de pasarlo. El código corregido del sombreador de vértices debería ser similar a este:
Después de corregir el código, recompílelo y ejecute de nuevo la aplicación para detectar que el problema de representación se ha resuelto.