2013-10-19 6 views
7

Stavo cercando di eseguire un codice OpenGL, non aveva GL_DEPTH_BUFFER_BIT cancellato in glClear(), a causa del quale non riuscivo a rendere la mia scena. Ho aggiunto questo bit e la scena è stata renderizzata. Perché è necessario usare questo pezzo chiaro?Perché dobbiamo cancellare il depth buffer in OpenGL durante il rendering?

Posso conoscerne il motivo, per cancellare i valori dei buffer di profondità utilizzati in precedenza dalla GPU, ma voglio solo confermarli.

risposta

15

Il Depth Buffer contiene la "profondità" del pixel nella scena. Quando OpenGL esegue il rendering della geometria, ciascun frammento (pixel) viene confrontato con il valore del buffer di profondità in quel punto. Se quel frammento ha un valore z inferiore a quello nel buffer, diventa il nuovo valore più basso e quindi il pixel da renderizzare. In caso contrario, non renderlo - c'è qualcosa di più vicino che lo sta bloccando. Questo è l'aspetto - puoi leggere tu stesso le specifiche.

Ora, cosa succede quando la scena cambia? Desiderate deselezionare lo schermo in modo da ridisegnare tutto, ma volete anche cancellare il buffer di profondità . Perché? Perché altrimenti tutti i nuovi pixel saranno confrontati con i valori di profondità del fotogramma precedente. Non ha senso - dovrebbero essere confrontati con quelli nel frame in cui si trovano! Hai ragione nel tuo ragionamento.

+4

È anche possibile alternare la gamma di profondità e la direzione del test di profondità di ciascun fotogramma. Ma è chiaro che l'eliminazione del buffer di profondità è anche un'ottimizzazione delle prestazioni dell'hardware moderno: implementano la compressione Z-Buffer senza perdita (e buffer dei colori) suddividendo il framebuffer in tile, quando la GPU ha bisogno di leggere/scrivere solo alcuni bit per -tile durante il recupero dei valori per le aree dello schermo che non contengono nulla. Quindi il vecchio trucco che le persone usavano per evitare di cancellare il buffer dei colori e il buffer di profondità danneggia le prestazioni delle moderne GPU;) –

+0

Questo è esattamente quello che pensavo fosse il motivo :) Perfetto ans. – 2am