In OpenGL, come posso scoprire l'intervallo di profondità di un buffer di profondità?


11

Sto realizzando un'app di rendering multi-pass GL per iOS. Il primo passaggio esegue il rendering su una trama buffer di profondità. Il secondo passaggio utilizza i valori nel buffer di profondità per controllare l'applicazione di uno shader di frammenti. Voglio ridimensionare i valori nel buffer di profondità in qualcosa di utile, ma prima di poterlo fare devo conoscere l'intervallo di valori di profondità dei valori del buffer di profondità. Come faccio a fare questo?

Risposte:


10

L'intervallo dei valori scritti nel buffer di profondità è qualunque cosa tu voglia che siano. In genere rientrano nell'intervallo 0 a 1. Il valore effettivo che viene scritto nel buffer di profondità viene calcolato durante la trasformazione della finestra, basato sul valore Z del vertice nello spazio NDC (dopo la divisione della prospettiva per w nello spazio della clip).

Il valore della profondità NDC (Z, dopo la divisione della prospettiva per W) viene ridimensionato in base alla porzione di profondità della trasformazione della finestra (che porta le coordinate X e Y in uno spazio di coordinate associato ai pixel nella finestra), quindi ridimensionata da (2^n-1)- che deve essere letto come "due alla potenza di n" - nè la precisione dei bit del buffer di profondità. Il valore risultante viene scritto nel buffer di profondità.

OpenGL suddivide la definizione della matrice di trasformazione del viewport in chiamate glViewport e glDepthRange . glDepthRange è ciò che controlla il fattore di scala responsabile della determinazione dell'intervallo di profondità richiesto. È possibile chiamare glGetFloatv con il GL_DEPTH_RANGEselettore per ripristinare l'intervallo corrente. Ciò ti consentirà di utilizzare l'intervallo senza supporre che sia compreso tra 0 e 1 (sebbene il 99,9% delle volte, in pratica, nessuno lo cambi mai).

Ulteriori letture, se si desidera avere un'idea di come ricostruire la matematica per seguire il valore Z dallo spazio oculare al buffer di profondità.


Darò questo a Josh per tutto il materiale di riferimento aggiuntivo e il suggerimento sulla planarità del triangolo. Sono propenso a fare un hack in cui sono posizionati piani di clip vicini / lontani in modo che corrispondano esattamente all'estensione z della geometria che sto visualizzando in modo che la mappa di profondità abbia valori piacevoli. Cosa sto facendo? Voglio creare interessanti effetti di sfocatura specifici per la posizione durante il passaggio n. 2 in base a ciò che mai è nella mappa di profondità del passaggio n. 1.
dugla,

7

I valori nel buffer di profondità sono sempre compresi nell'intervallo 0-1. Zero è che il frammento reso è in profondità nel piano vicino e 1 è che il frammento è in profondità nel piano lontano. E tutto tra di esso.

Se vuoi conoscere la profondità reale nello spazio del mondo, è facile calcolarla dal buffer di profondità.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Ecco perché specifichi i piani vicino e lontano nel tuo matri di proiezione, per ottenere una maggiore precisione del buffer di profondità.

Prestare attenzione anche alla differenza tra profondità e distanza quando si utilizzano i valori del buffer di profondità.


@notebene. Quasi lì. Voglio ridimensionare l'intervallo di valori nel buffer di profondità essere esattamente 0 -> 1. Quindi, se i valori di profondità min / max renderizzati sono .25 / .75 Voglio (valore di profondità - .25) / (. 75 - .25). Quindi, c'è un modo per scoprire il min / max del deepbuffer dopo il passaggio 1 e usarlo per riscalare durante il passaggio 2.
dugla

1
@dugla: poiché stai eseguendo il rendering di triangoli, che sono planari, allora i valori di profondità minima e massima verranno associati ai vertici minimo e massimo della scena. Se conosci questi due, puoi trasformarli manualmente attraverso la pipeline e saprai i valori minimo e massimo che dovresti scrivere nel buffer di profondità. Questo è probabilmente più semplice del rendering, quindi rileggere l'intero buffer di profondità e iterarlo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.