Compartilhar via


Instruções passo a passo: depurando erros de renderização devido ao sombreamento

Essa explicação passo a passo demonstra como usar o Graphics Diagnostics Visual Studio para investigar um objeto colorido incorretamente devido a um erro do sombreador.

Essa explicação passo a passo demonstra como:

  • Examine os gráficos registra o documento para identificar os pixels que mostram o problema.

  • Usar a janela Histórico de Pixel de Elementos Gráficos para examinar mais rigorosamente o estado do pixel.

  • Use o Depurador de HLSL para examinar o pixel e os sombreadores de vértice.

Cenário

Coloração incorreta em objetos normalmente ocorre quando um sombreador de vértice passa informações incorretas ou incompletas do sombreador de pixel.

Neste cenário, você adicionou recentemente um objeto ao seu aplicativo, juntamente com novos sombreadores e vértice e pixel para transformar o objeto e para dar uma aparência única. Quando você executa o app durante um teste, o objeto é processado em preto contínuo. Usando o Diagnósticos Gráficos, você captura o problema para o registro de gráficos de modo a depurar o aplicativo. O problema tem esta aparência no aplicativo:

O objeto é processado com cores incorretas.

Investigação

Usando as ferramentas de diagnóstico de gráficos, você pode carregar os gráficos registra em log o documento para inspecionar as peças que foram capturados durante o teste.

Para examinar um quadro no registro de elementos gráficos

  1. Em Visual Studio, carregar um log dos gráficos que contém um quadro que exibe o modelo ausente. Uma nova janela do documento de log dos gráficos aparece em Visual Studio. Na parte superior desta janela é a saída de destino de processamento do quadro selecionado. Na parte inferior está a Lista do Quadro, que exibe cada quadro capturado como a imagem miniatura.

  2. Na Lista do Quadro, selecionar um quadro em que o objeto não tem a aparência correta. O destino de processamento é atualizado para refletir o quadro selecionado. Neste cenário, os gráficos registram aspectos da janela do documento como esta:

    Documento de log de elementos gráficos no Visual Studio.

Depois de selecionar um quadro que demonstra este problema, é possível usar a janela Histórico de pixel de gráficos para diagnosticá-lo. A janela Histórico de pixel gráficos mostra os primitivos que poderiam ter tido um efeito em um pixel específico, seus sombreadores, e quais foram seus efeitos no destino de renderização, em ordem cronológica.

Para examinar um pixel

  1. Abra a janela Histórico de Pixel de Gráficos. Na barra de ferramentas Diagnóstico de Gráficos, escolha Histórico de Pixel.

  2. Selecione um pixel para examinar. Em gráficos registrar a janela de documentos, selecione um dos pixels no objeto que é colorido incorretamente:

    A seleção de um pixel exibe informações sobre seu histórico.

    A janela Histórico de pixel gráfico é atualizado para refletir o pixel selecionado. Neste cenário, a janela Histórico de Pixel dos Gráficos tem a seguinte aparência:

    O histórico de pixel mostra um evento DrawIndexed.

    Observe que o resultado do sombreador de pixel é preto totalmente opaco (0, 0, 0, 1) e que a Fusão de Saída combinou isso à cor Anterior do pixel de tal forma que o Resultado também é preto totalmente opaco.

Depois de revisar um pixel colorido incorretamente e descobrir que a saída do sombreador de pixel não é a cor esperada, é possível usar o Depurador HLSL para examinar o sombreador de pixel e descobrir o que ocorreu com a cor do objeto. Você pode usar o depurador de HLSL para examinar o estado das variáveis de HLSL durante a execução, e avançar no código de HLSL e nos pontos de interrupção em conjunto para ajudá-lo a diagnosticar o problema.

Para examinar o sombreador do pixel

  1. Inicie a depuração do sombreador de pixel. Na janela do Histórico de Pixel dos Gráficos, sob a primitiva do objeto, ao lado do Sombreador do Pixel, escolher o botão de Iniciar Depuração.

  2. Neste cenário, porque o sombreador do pixel passa apenas a cor através do sombreador de vértice, é fácil observar que o sombreador do pixel não é a origem do problema.

  3. Posicione o ponteiro em input.color. Observe que o valor é preto completa opaco (0, 0, 0, 1).

    O membro "color" de "entrada" é preto.

    Neste cenário, a auditoria revela que a cor incorretas são provavelmente o resultado de um shader de vértices que não fornece informações direita de cor para que o shader de pixel operar em.

Depois de determinar que o shader de vértices provavelmente não está fornecendo informações direita para shader em pixels, a próxima etapa é verificar o shader de vértices.

Para examinar o sombreador do vértice

  1. Inicie a depuração do sombreador de vértice. Na janela do Histórico de Pixel dos Gráficos, sob a primitiva do objeto, ao lado do Sombreador do Vértice, escolher o botão de Iniciar Depuração.

  2. Localizar a estrutura da saída do sombreador do vértice - esta é entrada para o sombreador do pixel. Neste cenário, o nome desta estrutura é output. Examine o código de shader de vértices e observe que o membro de color da estrutura de output esteve definido explicitamente para preto completa opaco, talvez no resultado de alguém buscas de depuração.

  3. Confirme se o membro de cor nunca é copiado da estrutura de entrada. Como o valor de output.color está definido para preto completa opaco imediatamente antes da estrutura de output é retornada, é uma boa ideia verificar se o valor de output não esteve inicializado corretamente em uma linha anterior. Percorrer código de shader de vértices até que você alcançar a linha que define output.color para preto quando você inspecionar o valor de output.color. Observe que o valor de output.color não é iniciado até que seja definido para preto. Isso confirma que a linha de código que define output.color para preto deve ser alterada, em vez de excluído.

    O valor de "output.color" é preto.

Após determinar a causa do problema de renderização é que o shader de vértices não fornece o valor correto de cor para shader em pixels, você pode usar essas informações para corrigir o problema. Neste cenário, você pode corrigir o problema alterando o código a seguir em shader de vértices

output.color = float3(0.0f, 0.0f, 0.0f);

para

output.color = input.color;

Esse código passa apenas a cor de vértice para os vértices de objeto não modificados — sombreadores de vértice mais complexos podem modificar a cor antes de passar. O código do sombreador de vértice corrigido deve ser semelhante a este:

O código do sombreador de vértices corrigido.

Depois de corrigir o código, reconstrua e execute o aplicativo novamente para descobrir que o problema de renderização está resolvido.

O objeto é processado com as cores corretas.