Was ist der Zweck von glScissor?

32

Ich weiß, dass es effizienter ist als der Schablonentest, aber gehe ich zu Recht davon aus, dass mit Projektionstransformationen mit Ansichtsfenster dieselbe Funktionalität erzielt werden kann?

Kimi
quelle

Antworten:

46

Sie ergänzen einander mehr als Alternativen. Sie möchten das Scherenrechteck fast immer auf die gleichen Werte wie das Ansichtsfenster einstellen.

glViewport () gibt eine Transformation vom normalisierten Projektionsraum zum Bildschirmraum an. Polygone werden am Rand des Projektionsraums abgeschnitten, andere Zeichenoperationen wie glClear () jedoch nicht. Sie bestimmen also mit glViewport () die Position und Größe des Anzeigebereichs des Bildschirmbereichs. Der Rasterizer kann jedoch gelegentlich auch Pixel außerhalb dieses Bereichs rendern.

Hier kommt Scissor-In ins Spiel. GlScissor () definiert ein Rechteck für den Bildschirmbereich, hinter dem nichts gezeichnet wird (wenn der Scissor-Test aktiviert ist).

Der folgende Code löscht beispielsweise den gesamten Bildschirm, obwohl das Ansichtsfenster auf einen kleinen Teil des größeren Fensters eingestellt ist:

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

Das Hinzufügen von glScissor () und das Aktivieren des Scherentests (der standardmäßig deaktiviert ist) schränkt das Löschen ein.

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

Gelegentlich stößt man auf eine Implementierung, die automatisch in den Ansichtsfensterbereich wechselt, jedoch gegen die GL-Spezifikation verstößt.

Darüber hinaus kann das Scherenrechteck verwendet werden, um das Zeichnen für Spezialeffekte, Benutzeroberflächenelemente usw. vorübergehend auf ein Teilrechteck des Ansichtsfensters zu beschränken.

Postgoodism
quelle
11
Zur ViewportVerdeutlichung werden die Eckpunktberechnungen abgeschnitten. Wenn Sie eine Linie mit einer Linienstärke> 1 oder einen Punkt mit einer gl_PointSize> 1 zeichnen, werden Sie auch außerhalb des Ansichtsfensters gezeichnet.
gman
13

Sie arbeiten an zwei völlig unterschiedlichen Stellen der Grafik-Pipeline.

glViewport gibt tatsächlich eine Transformation an. Diese Transformation erfolgt nach dem Vertex-Shader, aber vor dem Fragment-Shader. Wenn es hilfreich ist zu sehen, wo es konzeptionell hineinpasst, denken Sie daran, dass es Teil der Transformationen ist, die verwendet werden, um Ihre Scheitelpunktdaten vom Weltraum in den Bildschirmraum zu übertragen (dh es ist relativ eng mit der Modellansicht und der Projektion verbunden).

Der Scherentest erfolgt nach dem Fragment-Shader, zusammen mit allen anderen zu diesem Zeitpunkt durchgeführten Vorgängen pro Fragment, z. B. Mischen, Tiefe / Schablone usw. Wenn ein Fragment durch den Scherentest getestet wird, wurde es daher bereits durchlaufen die Ansichtsfenster-Transformation.

Ja, ein Scherentest kann schneller durchgeführt werden, da es sich um ein einfaches Annehmen / Ablehnen handelt, das auf den Bildschirmraumkoordinaten eines Fragments basiert, wohingegen die Schablone mit dem aktuellen Wert im Schablonenpuffer verglichen werden muss, wobei möglicherweise dieser aktuelle Wert erhöht oder erniedrigt wird die Ergebnisse des Tiefentests und so weiter.

Wenn Sie all das zusammenfassen, können Sie sehen, warum es einen Scherentest gibt. Sie haben die Möglichkeit, die Operationen pro Fragment auf einen rechteckigen Teil des Bildschirms zu beschränken, ohne jedoch die aktuelle Ansichtsfenster-Transformation zu ändern.

Maximus Minimus
quelle
6

Ich mag solche Dinge, die visuell erklärt werden.

In OnpenGL haben wir 2D-Koordinaten, die sowohl für die X- als auch für die Y-Achse von -1 bis +1 reichen.

Bildbeschreibung hier eingeben

Dann muss dieses Bild auf Fensterkoordinaten abgebildet werden.

Stellen wir uns vor, wir haben ein Fenster mit einer dunklen Farbe als Hintergrund und wir haben Weiß als klare Farbe.

Der häufigste Fall ist, dass Ansichtsfenster und Schere den gesamten Bildschirm abdecken.

Bildbeschreibung hier eingeben

Wir können sie jedoch auf einen kleineren Bereich des Bildschirms einstellen.

Bildbeschreibung hier eingeben

Diese Regionen können unterschiedlich sein. Im folgenden Beispiel deckt das Ansichtsfenster den gesamten Bildschirm ab, während die Schere das kleinere Feld ist.

Bildbeschreibung hier eingeben

Und in diesem letzten Fall deckt die Schere den gesamten Bildschirm ab, während das Ansichtsfenster die kleinere Box ist. Beachten Sie, dass dies glClearden gesamten Bildschirm betrifft, da dies durch die Scherenregion bestimmt wird.

Bildbeschreibung hier eingeben

user1754322
quelle
1
Dies ist die klarste Erklärung für mich, es brauchte wirklich Zeichnungen.
Laurent Caillette
5

glScissors schneidet die Geometrie gegen einen Teil des Bildschirms ab.

Sie möchten dies beispielsweise, wenn Sie ein GUI-Feld rendern, in dem sich Text reibungslos befindet. Sie möchten die gesamte Geometrie außerhalb des Bereichs des Bildschirms beschneiden, der von der grafischen Benutzeroberfläche abgedeckt wird, aber nur einen Teil des Textes oder der Polygone beibehalten, die sich noch im Inneren befinden.

glViewport ordnet die Projektionskoordinaten den Gerätekoordinaten zu, schneidet sie jedoch nicht ab.

Mit glStencil werden einzelne Pixel in komplexeren Mustern maskiert, z. B. in unregelmäßigen Formen. Somit ist glScissors schneller.

Rama Hoetzlein
quelle
1

glScissor ist einfacher als Projektionstransformationen mit Ansichtsfenster.

Der glScissor-Test gibt an, welche Pixel beim Rendern geändert werden sollen, während glViewport die Zuordnung von gl von Gerätekoordinaten zu Fensterkoordinaten ändert.

Was ist dann der Unterschied, wenn Sie das Ansichtsfenster auf das Rechteck einstellen, auf das Sie rendern möchten, und die Projektionsmatrix anpassen, um die vom Ansichtsfenster vorgenommene Skalierung rückgängig zu machen.

Md Mahbubur Rahman
quelle