Share via


Instruções passo a passo: objetos ausentes devido ao estado do dispositivo

Essa explicação passo a passo demonstra como usar o Graphics Diagnostics de Visual Studio para investigar um objeto que está faltando devido ao estado do dispositivo configurado incorretamente.

Essa explicação passo a passo demonstra como:

  • Use Lista de Eventos de Elementos Gráficos para localizar fontes potenciais do problema.

  • Usar a janela Fases do Pipeline de Elementos Gráficos para verificar o efeito de chamadas do DrawIndexed Direct3D API.

  • Use a janela Histórico de Pixels de Elementos Gráficos para localizar mais especificamente o problema.

  • Inspecionar o estado do dispositivo para problemas potenciais ou configurações erradas.

Cenário

Às vezes, os objetos não aparecem onde devem aparecer em aplicativos 3D. Geralmente isso ocorre devido à configuração incorreta do dispositivo gráfico, que faz com que os objetos sejam excluídos da renderização. Por exemplo, quando a ordem de rolagem faz com que os triângulos sejam divididos incorretamente, ou quando a função de teste de profundidade faz com que todos os pixels do objeto sejam rejeitados.

No cenário que é descrito neste passo a passo, você acabou de alcançar a primeira etapa no desenvolvimento de seu aplicativo 3-D e está pronto para testá-lo pela primeira vez. No entanto, quando você executar o aplicativo, somente a interface do usuário é renderizada na tela. Usando Diagnósticos Gráficos, você captura o problema em um arquivo de log gráfico de modo a depurar o aplicativo. O problema tem esta aparência no aplicativo:

O aplicativo antes que o problema seja resolvido

Para obter informações sobre como capturar problemas de gráficos no log de gráficos, consulte Capturando informações de gráficos.

Investigação

Usando as ferramentas de Diagnósticos Gráficos, você pode carregar o arquivo de log gráficos para inspecionar os quadros 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 guia de Diagnóstico Gráficos aparece no Visual Studio. Na parte superior desta guia está a saída de destino da renderização 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 que demonstra que o modelo não é exibido. O destino de processamento é atualizado para refletir o quadro selecionado. Neste cenário, a guia do log dos gráficos parecem como esta:

    A lista de visualização e quadro de framebuffer do guia. vsglog

Depois de selecionar um quadro que demonstra este problema, é possível usar a Lista de eventos de gráficos para diagnosticá-lo. A Lista de eventos gráficos contém todas as chamadas à API de Direct3D feitas para renderizar o quadro ativo, por exemplo, chamadas à API para configurar o estado do dispositivo, para criar e atualizar buffers e para desenhar objetos que aparecem no quadro. Muitos tipos de chamadas são interessantes porque há geralmente (mas não sempre) uma mudança correspondente no destino processar quando o aplicativo está funcionando como esperado, por exemplo, chamadas por Desenho, Despacho, Cópia ou Limpeza. As chamadas de desenho são particularmente interessantes porque cada uma representa uma geometria que o aplicativo renderiza (chamadas de distribuição também podem renderizar a geometria.)

Para garantir que as chamadas de desenho estão sendo feitas

  1. Abra a janela Lista de Eventos de Gráficos. Na barra de ferramentas Diagnóstico de Gráficos, escolha Lista de Eventos.

  2. Inspecionar a Lista de Eventos de Gráficos para chamadas de desenho. Para tornar isso mais fácil, digite um “Desenho” na caixa Pesquisar no canto superior direito da janela Lista de eventos de elementos gráficos . Isso filtra a lista de modo que ela contenha somente os eventos que possuam “Desenho” em seus títulos. Neste cenário, você descobre que várias chamadas de desenho foram feitas:

    Lista de eventos de gráficos mostrando eventos capturados

Depois de confirmar que chamadas de desenho estão sendo feitas, é possível determinar qual corresponde à geometria ausente. Como você sabe que a geometria ausente não ser desenhada no destino de renderização (neste caso), é possível usar a janela Fases da canalização de gráficos para determinar qual chamada de desenho corresponde à geometria ausente. A janela Etapas do pipeline gráfico mostra a geometria enviada para cada chamada de desenho, independentemente do efeito no destino renderização. Conforme você move pelas chamadas de desenho, as fases de canalização são atualizados para mostrar a geometria associada com aquele chamada e a saída de destino de renderização é atualizada para mostrar o estado de destino de renderização após a chamada ser concluída.

Para localizar a chamada de desenho para a geometria ausente

  1. Abra a janela Estágios de Pipeline Gráficos. Na barra de ferramentas Diagnóstico de Gráficos, escolha Estágios de Pipeline.

  2. Percorra cada chamada de desenho enquanto procura o modelo ausente na janela Estágios de Pipeline Gráficos. A etapa Assembler de entrada mostra os dados brutos do modelo. A fase Sombreador de Vértice mostra os dados do modelo transformados. A fase sombreador de pixel mostra a saída do sombreador de pixel. A fase de saída-fusão mostra o destino de processamento mesclado dessa chamada de desenho e de quaisquer chamadas anteriores de desenho.

  3. Interromper quando você atingir a chamada de desenho que corresponde ao modelo ausente. Neste cenário, a janela Estágios do Pipeline dos Gráficos indica que a geometria foi renderizada mas não aparece no destino de renderização:

    Visualizador de pipeline mostrando o objeto ausente

Depois de confirmar que o aplicativo processado está sem geometria e localizar a chamada de desenho correspondente, é possível selecionar uma parte da saída de destino de renderização que deve exibir a geometria ausente e usar a janela Histórico de Pixel de Gráficos para descobrir porque os pixels foram excluídos. O histórico de pixel contém uma lista de cada chamada de desenho que pode ter tido um efeito em um pixel específico. Cada chamada de desenho na janela Histórico de pixel de gráficos é identificada por um número que é também exibido na janela Lista de eventos de gráficos. Isso o ajuda a confirmar que o pixel deve exibir a geometria ausente, e a localizar porque o pixel foi excluído

Para determinar como o pixel foi excluído

  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. Baseado na miniatura Sombreador de pixel, selecione um pixel na saída de framebuffer que deve conter uma parte da geometria ausente. Neste cenário, a saída do sombreador de pixel deve cobrir a maior parte do destino de renderização, depois que um pixel é selecionado, a janela Histórico de Pixel dos Gráficos tem a seguinte aparência:

    Janela de histórico de pixel mostrando relacionados chamadas de desenho

  3. Confirme que os pixels de destino renderizados selecionados contêm uma parte da geometria correspondendo o número da chamada de desenho que você está verificando (da janela Lista de eventos de gráficos) para um das chamadas de desenho na janela Histórico de pixel de gráficos. Se nenhuma das chamadas na janela de Histórico de Pixel dos Elementos Gráficos corresponde com a chamada do desenho que você está inspecionando, repetir estas etapas (exceto a etapa 1) até encontrar uma correspondência. Neste cenário, a chamada de desenho correspondente tem esta aparência:

    Janela de histórico de pixel mostrando informações de fragmento

  4. Quando você encontrar uma correspondência, expanda a chamada correspondente de desenho na janela Histórico de Pixels de Elementos Gráficos e confirme se o pixel foi excluído. Cada chamada de desenho na janela Histórico de pixel de gráficos corresponde a um ou mais primitivos geométricos (pontos, linhas ou triângulos) que cruzaram aquele pixel como resultado da geometria do objeto correspondente. Cada interseção pode contribuir para a cor final do pixel. Uma primitiva excluída porque falhou no teste de profundidade é representada por um ícone mostrando a letra Z sobre uma seta que inclina em direção à esquerda para direita.

  5. Expanda uma primitiva excluída para examinar mais o estado que causou sua exclusão. No grupo Fusão de Saída, mover o ponteiro sobre o Resultado. Uma dica de ferramenta indica como a primitiva foi excluída. Neste cenário, o exame revela a primitiva foi excluída porque ela falhou no teste de profundidade, e, portanto, não contribuiu para a cor final do pixel.

Após determinar que a geometria não aparece porque seus primitivos falharam no teste de profundidade, você pode suspeitar que esse problema está relacionado ao estado de dispositivo mal configurado. O estado do dispositivo e outro objeto de dados do Direct3D podem ser examinados usando a Tabela de objeto de gráfico.

Para examinar o estado de dispositivo

  1. Abra a janela Tabela de Objetos Gráficos. Na barra de ferramentas Diagnóstico de Gráficos, escolha Tabela de Objeto.

  2. Localizar o objeto Dispositivo D3D10 em Tabela de Objeto Gráfico, e, em seguida, abrir o objeto do Dispositivo D3D10. Uma nova guia dispositivo d3d10 abre no Visual Studio. Para facilitar isso, você pode classificar a Tabela de objeto gráfico por Tipo:

    Tabela de objetos gráficos e estado do dispositivo relacionados

  3. Examine o estado do dispositivo exibido na guia Dispositivo d3d10 para possíveis problemas. Como a geometria não aparece porque seus primitivos falharam no teste de profundidade, você pode focar no estado do dispositivo, como o estêncil de profundidade, que afeta o teste de profundidade. Neste cenário, a descrição de estêncil de profundidade (em estado da fusão de saída) contém um valor incomum para o membro da função de profundidade, D3D10_COMPARISON_GREATER:

    Janela de dispositivo D3D10 mostrando informações de estêncil de profundidade

Após determinar que a causa do problema de renderização pode ser uma função de profundidade configurada incorretamente, é possível usar essas informações com seu conhecimento do código para localizar onde a função de profundidade foi definida incorretamente e corrigir o problema. Se você não estiver familiarizado com o código, você poderia procurar o problema usando dicas que você obteve enquanto estava depurando - por exemplo, com base na descrição do estêncil de profundidade neste cenário, você pode procurar o código por palavra como "profundidade" ou "MAIOR". Depois de corrigir o código, reconstrua e execute o aplicativo novamente para descobrir que o problema de renderização está resolvido:

Aplicativo depois que o problema seja resolvido