Passo a passo: Depuração de erros devido a sombreamento de processamento
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 elementos 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:
Investigação
Usando as ferramentas de diagnóstico gráficos, você pode carregar os elementos gráficos efetua logon do documento para inspecionar os quadros que foram detectados durante o teste.
Para examinar um quadro no registro de elementos gráficos
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 gráficos aparece em Visual Studio.Na parte superior da 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.
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.Nesse cenário, gráficos registram aspectos da janela do documento assim:
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
Abra a janela Histórico de Pixel de Gráficos.Na barra de ferramentas Diagnóstico de Gráficos, escolha Histórico de Pixel.
Selecione um pixel para examinar.Em elementos gráficos registrar a janela do documento, selecione um dos pixels no objeto que é colorido incorretamente:
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:
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
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.
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.
Posicione o ponteiro em input.color.Observe que o valor é o preto totalmente opaco (0, 0, 0, 1).
Nesse cenário, o exame revela que a cor incorreta é provavelmente o resultado de um vertex shader que não fornece informações direita de cor para o pixel shader se opere sobre.
Após determinar que o vertex shader provavelmente não está fornecendo informações direita para o pixel shader, a próxima etapa é examinar o vertex shader.
Para examinar o sombreador do vértice
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.
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 vertex shader e observe que o membro de color estrutura de output foi definida explicitamente para preto totalmente opaca, talvez resultado de alguém esforços de depuração.
Confirme que o membro de cor é copiado nunca a estrutura de entrada.Porque o valor de output.color é definido para preto totalmente opaca imediatamente antes da estrutura de output é retornada, é uma boa ideia certificar-se de que o valor de output não foi inicializada corretamente em uma linha anterior.Avançar no código e vertex shader até chegar a linha que define output.color para enegrecer quando você examinar o valor de output.color.Observe que o valor de output.color não inicializado até que está definido para enegrecer.Isso confirmar que a linha de código que define output.color para enegrecer deve ser alterada, em vez de excluído.
Após determinar que a causa do problema de renderização é que o vertex shader não fornece o valor correto de cor ao pixel shader, você pode usar essas informações para corrigir o problema.Nesse cenário, você pode corrigi-lo alterando o seguinte código no vertex shader
output.color = float3(0.0f, 0.0f, 0.0f);
to
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:
Depois de corrigir o código, reconstrua e execute o aplicativo novamente para descobrir que o problema de renderização está resolvido.