Condividi tramite


Procedura dettagliata: oggetti mancanti a causa dello stato del dispositivo

In questa procedura dettagliata viene illustrato come utilizzare la diagnostica della grafica di Visual Studio per esaminare un oggetto mancante a causa dello stato di errata configurazione del dispositivo.

In questa procedura guidata viene illustrato come eseguire le seguenti operazioni:

  • Utilizzare Elenco eventi grafici per individuare le origini potenziali del problema.

  • Utilizzare la finestra Fasi pipeline grafica per controllare l'effetto delle chiamate all'API di Direct3D DrawIndexed.

  • Utilizzare la finestra Cronologia pixel grafica per individuare con più precisione il problema.

  • Controllare lo stato del dispositivo per evitare problemi potenziali o configurazioni errate.

Scenario

Uno dei motivi per cui gli oggetti potrebbero non essere visualizzati dove sono previsti in un'applicazione tridimensionale sono una errata configurazione del dispositivo di grafica che determina gli oggetti da escludere dal rendering, ad esempio, quando l'ordine di riempimento causa per errore la rimozione dei triangoli oppure quando la funzione di test di profondità causa il rifiuto di tutti i pixel dell'oggetto.

Nello scenario descritto in questa procedura dettagliata è stata semplicemente raggiunta la prima attività cardine nello sviluppo dell'app 3D e si è pronti per testarla per la prima volta.Tuttavia, quando si esegue l'applicazione, solo l'interfaccia utente esegue il rendering dello schermo.Tramite la diagnostica del grafica, viene acquisito il problema in un file di log della grafica in modo da poter eseguire il debug dell'applicazione.Il problema si presenta nel seguente modo nell'app:

Applicazione prima della risoluzione del problema

Per informazioni su come acquisire i problemi di grafica in un log di grafica, vedere Cattura informazioni grafica.

Analisi

Utilizzando gli strumenti di diagnostica della grafica, è possibile caricare il file di log della grafica per controllare i frame acquisiti durante il test.

Per esaminare un frame nel log di grafica

  1. In Visual Studio caricare un log di grafica contenente un frame che mostra il modello mancante.Verrà visualizzata una nuova scheda della diagnostica della grafica in Visual Studio.Nella parte superiore di questa scheda è presente l'output della destinazione di rendering del frame selezionato.Nella parte inferiore è presente Elenco frame che visualizza ogni frame acquisito come immagine di anteprima.

  2. In Elenco frame selezionare un frame che indica che il modello non viene visualizzato.La destinazione rendering viene aggiornata per riflettere il frame selezionato.In questo scenario il log della grafica ha l'aspetto seguente:

    Elenco frame e anteprima buffer nella scheda .vsglog

Dopo avere selezionato un frame in cui viene illustrato il problema, è possibile utilizzare l'Elenco eventi grafici per diagnosticarlo.Elenco eventi grafici contiene tutte le chiamate all'API Direct3D effettuate per eseguire il rendering del frame attivo, ad esempio, le chiamate all'API per impostare lo stato del dispositivo, per creare e aggiornare i buffer e per visualizzare oggetti che appaiono nel frame.Molti tipi di chiamate siano interessanti poiché spesso (ma non sempre) si verifica una modifica corrispondente nella destinazione di rendering quando l'applicazione funziona come previsto, ad esempio chiamate di disegno, dispatch, copia o deselezionare.Le chiamate di disegno sono particolarmente interessanti perché ciascuna rappresenta la geometria di cui l'applicazione ha eseguito il rendering (le chiamate di invio possono inoltre eseguire il rendering della geometria).

Per assicurarsi l'esecuzione delle chiamate di disegno

  1. Aprire la finestra Elenco eventi grafici.Sulla barra degli strumenti Diagnostica grafica scegliere Elenco eventi.

  2. Controllare Elenco eventi grafici per verificare la presenza di chiamate di disegno.Per semplificare questa procedura, immettere "Disegno" nella casella Cerca posta nell'angolo superiore destro della finestra Elenco eventi grafici.In questo modo l'elenco viene filtrato in modo da contenere solo gli eventi nei cui titoli compare "Disegno".In questo scenario, si scoprirà che sono state effettuate diverse chiamate di disegno:

    Elenco eventi grafici con eventi catturati

Dopo aver confermato l'esecuzione delle chiamate di disegno, è possibile determinare quale corrisponde alla geometria mancante.Poiché è noto che la geometria mancante non viene disegnata nella destinazione di rendering (in questo caso), è possibile utilizzare la finestra Fasi pipeline grafica per determinare la chiamata di disegno che corrisponde alla geometria mancante.Nella finestra Fasi pipeline grafica viene mostrata la geometria che è stata inviata a ogni chiamata di disegno, indipendentemente dall'effetto che ha avuto sulla destinazione rendering.Quando ci si sposta nelle chiamate di disegno, le fasi pipeline vengono aggiornate in modo da mostrare la geometria associata alla chiamata e l'output della destinazione di rendering viene aggiornato in modo da visualizzare lo stato della destinazione di rendering dopo aver completato la chiamata.

Per individuare la richiesta di disegno per la geometria mancante

  1. Aprire la finestra Fasi pipeline grafica.Sulla barra degli strumenti Diagnostica grafica scegliere Fasi pipeline.

  2. Spostarsi in ogni chiamata di disegno osservando la finestra Fasi pipeline grafica per il modello mancante.La fase Assemblaggio input mostra i dati di modello non elaborati.La fase Vertex shader mostra i dati del modello trasformato.La fase Pixel shader illustra l'output di pixel shader.La fase Unione output illustra la destinazione rendering unita di questa chiamata di disegno e di tutte le chiamate di disegno precedenti.

  3. Arrestare l'esecuzione quando si raggiunge la chiamata di disegno che corrisponde al modello mancante.In questo scenario la finestra Fasi pipeline grafica indica che è stato eseguito il rendering della geometria che tuttavia non è presente nella destinazione di rendering:

    Il visualizzatore della pipeline mostra l'oggetto mancante

Dopo aver per confermato che l'applicazione ha eseguito il rendering della geometria mancante e aver individuato la chiamata di disegno corrispondente, è possibile selezionare una parte dell'output della destinazione di rendering in cui dovrebbe essere visualizzata la geometria mancante e quindi utilizzare la finestra Cronologia pixel grafica per determinare il motivo dell'esclusione dei pixel.La cronologia del pixel contiene un elenco di ogni chiamata di disegno che potrebbe aver prodotto un effetto su un pixel specifico.Ogni chiamata di disegno nella finestra Cronologia pixel grafica viene identificata da un numero che viene inoltre visualizzato nella finestra Elenco eventi grafici.Questo consente di verificare che il pixel deve visualizzare la geometria mancante e di scoprire il motivo per cui il pixel era escluso

Per determinare il motivo dell'esclusione del pixel

  1. Aprire è la finestra Cronologia pixel grafica.Sulla barra degli strumenti Diagnostica grafica scegliere Cronologia pixel.

  2. In base all'anteprima Pixel shader, selezionare un pixel nell'output del framebuffer che deve contenere una parte della geometria mancante.In questo scenario, l'output di pixel shader deve coprire la maggior parte della destinazione di rendering; dopo che un pixel viene selezionato, l'aspetto della finestra Cronologia pixel grafica sarà il seguente:

    La finestra cronologia pixel mostra chiamate draw correlate

  3. Confermare che il pixel di destinazione rendering selezionato contiene una parte della geometria facendo corrispondere il numero della chiamata di disegno che si sta controllando (dalla finestra Elenco eventi grafici ) a una delle chiamate di disegno nella finestra Cronologia pixel grafica.Se nessuna delle chiamate nella finestra Cronologia pixel grafica corrisponde alla chiamata di disegno che si sta esaminando, ripetere questi passaggi (eccetto il passaggio 1) fino a trovare una corrispondenza.In questo scenario la chiamata di disegno corrispondente ha l'aspetto seguente:

    La finestra cronologia pixel mostra informazioni sul frammento

  4. Una volta trovata una corrispondenza, espandere la chiamata di disegno corrispondente nella finestra Cronologia pixel grafica e verificare che il pixel sia stato escluso.Ogni chiamata di disegno nella finestra Cronologia pixel grafica corrisponde a una o più primitive geometriche (punti, linee o triangoli) che si intersecano con il pixel come risultato della geometria dell'oggetto corrispondente.Ciascuna intersezione può contribuire al colore finale del pixel.Una primitiva esclusa perché non ha superato il test di profondità viene rappresentata da un'icona che mostra la lettera Z su una freccia inclinata verso il basso da sinistra a destra.

  5. Espandere una primitiva esclusa per esaminare ulteriormente lo stato che ne ha causato l'esclusione.Nel gruppo Unione output spostare il puntatore su Risultato.Una descrizione comando indica il motivo per il quale è stata esclusa la primitiva.In questo scenario, un'analisi rivela che la primitiva è stata esclusa in quanto non ha superato il test di profondità e pertanto non ha contribuito al colore finale del pixel.

Dopo aver determinato che la geometria non viene visualizzata a causa delle primitive che non hanno superato il test di annidamento, è possibile sospettare del fatto che il problema allo stato del dispositivo non configurato correttamente.Lo stato del dispositivo e altri dati oggetto Direct3D possono essere esaminati utilizzando la Tabella oggetti grafici.

Per esaminare lo stato del dispositivo

  1. Aprire la finestra Tabella oggetti grafici.Sulla barra degli strumenti Diagnostica grafica scegliere Tabella oggetti.

  2. Individuare l'oggetto Dispositivo D3D10 in Tabella oggetti grafici, quindi aprire l'oggetto Dispositivo D3D10.Verrà visualizzata una nuova scheda del dispositivo d3d10 in Visual Studio.Per semplificare questa procedura, è possibile ordinare la Tabella oggetti grafici in base al Tipo:

    Tabella oggetti grafici e stato del dispositivo correlato

  3. Esaminare lo stato del dispositivo visualizzato nella scheda Dispositivo D3d10 in caso di problemi.Poiché la geometria non viene visualizzata perché le primitive non hanno superato il test di profondità, è possibile concentrarsi sullo stato del dispositivo, come lo stencil di profondità, che influenza il test di profondità.In questo scenario, la descrizione stencil profondità (in Stato unione output) contiene un valore non comune per il membro della funzione di annidamento, D3D10_COMPARISON_GREATER:

    Finestra del dispositivo D3D10 con informazioni sullo stencil di profondità

Dopo aver determinato che la causa del problema di rendering potrebbe essere una funzione di annidamento non configurato correttamente, è possibile utilizzare queste informazioni insieme alla conoscenza del codice per individuare la posizione in cui la funzione di annidamento è stata specificata in modo non corretto e quindi correggere il problema.Se non si ha familiarità con il codice, è possibile cercare il problema tramite indizi raccolti durante il debug, ad esempio in base alla descrizione stencil profondità in questo scenario, è possibile cercare nel codice parole come "depth" o "GREATER".Dopo avere corretto il codice, ricompilarlo ed eseguire nuovamente l'applicazione per rilevare la risoluzione del problema di rendering:

Applicazione dopo la risoluzione del problema