C'era una volta, cancellare i buffer di colore e profondità in realtà richiedeva tempo. Fare un clear significava che la scheda grafica avrebbe dovuto percorrere ogni pixel del framebuffer e scriverne un valore.
Per questo motivo, gli sviluppatori di giochi hanno scoperto che sarebbe stato più efficiente supporre semplicemente che ogni pixel venisse nuovamente sottoposto a rendering. Hanno sviluppato molte tecniche per farlo.
Il buffer di colore è il più semplice da ignorare. Meno semplice è il buffer di profondità, perché verrebbe inquinato con vecchi dati. Quindi quello che hanno fatto è stato semplice.
Sul fotogramma 0, verrebbero visualizzati con un glDepthRange
(o l'equivalente D3D) di (0, 0,5) e utilizzerebbero un glDepthFunc
di GL_LESS
(o GL_LEQUAL
). Ciò significa che il valore di profondità più lontano che avresti mai ottenuto nel buffer di profondità è 0,5. Quindi il valore più grande nel buffer di profondità alla fine del fotogramma 0 è 0,5 (supponendo che tu abbia scritto su ogni pixel).
Nel fotogramma 1, modificano l'intervallo di profondità in (1, 0,5). Si noti che in questo caso, il valore della profondità vicina è maggiore della profondità lontana. Ma cambieranno anche la funzione di profondità in GL_GREATER
(o GL_GEQUAL
), che inverte il significato del test di profondità. Poiché il valore più grande nel buffer di profondità è 0,5, tutto ciò che scrivi avrà un valore maggiore di questo. Poiché il test di profondità è stato invertito, ciò significa effettivamente che qualsiasi cosa sia stata scritta sul fotogramma 0 è ora più lontana di qualsiasi cosa possa essere scritta sul fotogramma 1. Alla fine del fotogramma 1, il valore più piccolo nel buffer di profondità è ora 0,5.
E poi ripetono.
Su qualsiasi hardware realizzato intorno al 2003, questa non è più un'ottimizzazione. In effetti, si tratta di un'ottimizzazione negativa . La cancellazione del buffer di profondità rende l'hardware più veloce . No davvero.
Fondamentalmente, ciò che accade è che i buffer di cancellazione in realtà non scrivono nulla. Memorizzano alcuni bit nelle cache della GPU che consentono al sistema di sapere a che colore / profondità sono stati cancellati. Quando il sistema tenta di scrivere su una riga della cache del framebuffer, non si preoccupa di leggere cosa c'è lì, perché sa già che si tratta di un campo vuoto con il chiaro valore di colore / profondità. Se provi a fonderti con quello che c'è o fai un test di profondità, di nuovo, non c'è bisogno di leggere: sa con quale valore fondere / testare / contro.
Quindi ogni prima lettura / modifica / scrittura che fai su ogni riga della cache dopo una cancellazione è sostanzialmente una scrittura. E ' gratuito .
Inoltre, avere un buffer di profondità frastagliato può funzionare su Hyper-Z / Hierarchial-Z / qualsiasi ottimizzazione dell'abbattimento Z nell'hardware. Sì, la tua scena funzionerà contro quelle alla fine man mano che aggiungi dettagli. Ma se il buffer di profondità è frastagliato da rendering precedenti, anche se quegli oggetti di sfondo sono in background, può influire sull'efficienza delle tecniche di abbattimento Z. E questo non aiuterà le prestazioni.
Quindi non dovresti mai fare questa tecnica di inversione di profondità nei giochi moderni.
Nota: Jari fa un buon punto sulle architetture di rendering basate su tile (come si trova nella maggior parte delle piattaforme mobili). Non cancellare la profondità può rendere le cose spiacevoli anche lì.