Qual è lo scopo di glScissor?


33

So che è più efficiente del test dello stencil, ma sto giustamente supponendo che la stessa funzionalità possa essere raggiunta usando le trasformazioni di proiezione con viewport?

Risposte:


47

Sono più complementari delle alternative tra loro. Si desidera quasi sempre impostare il rettangolo a forbice sugli stessi valori della finestra.

glViewport () specifica una trasformazione dallo spazio di proiezione normalizzato allo spazio dello schermo. I poligoni sono tagliati al limite dello spazio di proiezione, ma altre operazioni di disegno come glClear () non lo sono. Pertanto, si utilizza glViewport () per determinare la posizione e le dimensioni della regione del viewport dello spazio dello schermo, ma il rasterizzatore può ancora occasionalmente eseguire il rendering di pixel al di fuori di quella regione.

Ecco dove entra in gioco la forbice. GlScissor () definisce un rettangolo dello spazio dello schermo oltre il quale non viene disegnato nulla (se il test a forbice è abilitato).

Ad esempio, il codice seguente cancella l'intero schermo, anche se il riquadro di visualizzazione è impostato su una piccola porzione della finestra più grande:

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

L'aggiunta di glScissor () e l'abilitazione del test a forbice (che è disabilitato per impostazione predefinita) limita la cancellazione.

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

Di tanto in tanto ti imbatti in un'implementazione che taglia automaticamente la regione del viewport, ma che viola le specifiche GL.

Oltre a ciò, il rettangolo a forbice può essere utilizzato per limitare temporaneamente il disegno a un sub-rettangolo della finestra, per effetti speciali, elementi dell'interfaccia utente, ecc.


11
per essere più chiari, Viewporttaglia i calcoli del vertice. Se si disegna una linea con spessore della linea> 1 o un punto con un gl_PointSize> 1, verrà disegnata anche all'esterno della finestra.
Gman,

13

Operano in due parti completamente diverse della pipeline grafica.

glViewport in realtà specifica una trasformazione, ed è una trasformazione che avviene dopo lo shader di vertice ma prima dello shader di frammenti. Se aiuta a vedere dove si inserisce concettualmente, pensa in base al fatto che fa parte delle trasformazioni utilizzate per ottenere i dati dei vertici dallo spazio mondiale allo spazio dello schermo (cioè è relativamente strettamente correlato a modelview e proiezione).

Il test a forbice si verifica dopo lo shader di frammento, insieme a tutte le altre operazioni per frammento che si verificano in quel momento, come la fusione, la profondità / lo stencil, ecc. Quando un test di frammento viene testato dal test a forbice, è stato quindi già superato la trasformazione del viewport.

Sì, il test a forbice può essere più veloce può eseguire lo stencil perché è un semplice accettazione / rifiuto basato sui coordini dello spazio dello schermo di un frammento, mentre lo stencil deve essere confrontato con il valore corrente nel buffer dello stencil, eventualmente incrementare o decrementare quel valore corrente, anche prendere in considerazione i risultati del test di profondità e così via.

Quindi, mettendo tutto insieme, puoi vedere perché esiste il test a forbice. Ti dà la possibilità di vincolare le operazioni per frammento a una porzione rettangolare dello schermo, ma senza modificare effettivamente la trasformazione della finestra corrente.


6

Mi piace questo tipo di cose spiegate visivamente.

In OnpenGL abbiamo coordinate 2D che vanno da -1 a +1 per entrambi gli assi X e Y.

inserisci qui la descrizione dell'immagine

Quindi questa immagine deve essere mappata alle coordinate della finestra.

Immaginiamo di avere una finestra che ha un colore scuro come sfondo e che abbiamo il bianco come colore chiaro.

Il caso più comune è avere viewport e scissor che coprono l'intero schermo.

inserisci qui la descrizione dell'immagine

Ma possiamo impostarli come un'area più piccola dello schermo.

inserisci qui la descrizione dell'immagine

Queste regioni possono essere diverse. Nel seguente esempio il riquadro di visualizzazione copre l'intero schermo, mentre la forbice è la casella più piccola.

inserisci qui la descrizione dell'immagine

E in quest'ultimo caso le forbici coprono l'intero schermo, mentre viewport è la scatola più piccola. Si noti che glClearinfluisce su tutto lo schermo, poiché è determinato dalla regione delle forbici.

inserisci qui la descrizione dell'immagine


1
Questa è la spiegazione più chiara per me, aveva davvero bisogno di disegni.
Laurent Caillette,

5

glScissors esegue il clipping della geometria contro una porzione dello schermo.

Lo vorresti, ad esempio, se stavi eseguendo il rendering di una finestra della GUI che conteneva un testo scorrevole all'interno. Si desidera ritagliare tutta la geometria al di fuori della parte dello schermo coperta dalla GUI, ma mantenere testo parziale o poligoni che sono ancora all'interno.

glViewport mappa le coordinate di proiezione sulle coordinate del dispositivo, ma non si aggancia.

glStencil viene utilizzato per mascherare singoli pixel in motivi più complessi, come forme irregolari. Pertanto, glScissors è più veloce.


1

glScissor è più semplice delle trasformazioni di proiezione con viewport.

Il test glScissor specifica quali pixel devono essere modificati durante il rendering, mentre glViewport modifica il modo in cui gl deve essere mappato dalle coordinate del dispositivo alle coordinate della finestra.

Quindi qual è la differenza con l'impostazione del riquadro di visualizzazione sul rettangolo in cui si desidera eseguire il rendering e la regolazione della matrice di proiezione per annullare il ridimensionamento eseguito dal riquadro di visualizzazione.

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.