Ich kann die Verwendung von nicht verstehen glOrtho
. Kann jemand erklären, wofür es verwendet wird?
Wird es verwendet, um den Bereich der Grenzwerte für xy- und z-Koordinaten festzulegen?
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
Dies bedeutet, dass der x-, y- und z-Bereich von -1 bis 1?
Antworten:
Schauen Sie sich dieses Bild an: Grafische Projektionen
Der
glOrtho
Befehl erzeugt eine "schräge" Projektion, die Sie in der unteren Reihe sehen. Unabhängig davon, wie weit Scheitelpunkte in z-Richtung entfernt sind, treten sie nicht in die Ferne zurück.Ich verwende glOrtho jedes Mal, wenn ich 2D-Grafiken in OpenGL erstellen muss (z. B. Integritätsleisten, Menüs usw.), und verwende bei jeder Größenänderung des Fensters den folgenden Code:
Dadurch werden die OpenGL-Koordinaten den entsprechenden Pixelwerten zugeordnet (X geht von 0 nach windowWidth und Y geht von 0 nach windowHeight). Beachten Sie, dass ich die Y-Werte umgedreht habe, da OpenGL-Koordinaten in der unteren linken Ecke des Fensters beginnen. Durch Umdrehen erhalte ich also eine konventionellere (0,0), die eher in der oberen linken Ecke des Fensters beginnt.
Beachten Sie, dass die Z-Werte von 0 bis 1 abgeschnitten werden. Wenn Sie also einen Z-Wert für die Position Ihres Scheitelpunkts angeben, wird dieser abgeschnitten, wenn er außerhalb dieses Bereichs liegt. Andernfalls scheint es, wenn es innerhalb dieses Bereichs liegt, keine Auswirkung auf die Position zu haben, außer bei Z-Tests.
quelle
z= -2
. Das Dreieck war unsichtbar , wenn ich verwendeglOrtho(.., 0.0f, -4.0f);
,..-1.0f, -3.0f)
oder..-3.0f, -1.0f)
. Um sichtbar zu sein, musste der Parameter far POSITIVE 2 oder höher sein. Es schien nicht wichtig zu sein, was der Near-Parameter war. Jedes dieser Programme gearbeitet:..0.0f, 2.0f)
,..-1.0f, 2.0f)
,..-3.0f, 2.0f)
, oder..0.0f, 1000.0f
.Minimal lauffähiges Beispiel
glOrtho
: 2D-Spiele, Objekte in der Nähe und in der Ferne haben dieselbe Größe:glFrustrum
: realistischer wie 3D erscheinen identische Objekte weiter entfernt kleiner:Haupt c
GitHub stromaufwärts .
Kompilieren:
Laufen Sie mit
glOrtho
:Laufen Sie mit
glFrustrum
:Getestet unter Ubuntu 18.10.
Schema
Ortho: Kamera ist eine Ebene, sichtbares Volumen ein Rechteck:
Frustrum: Kamera ist ein Punkt, sichtbares Volumen ein Stück einer Pyramide:
Bildquelle .
Parameter
Wir schauen immer von + z nach -z mit + y nach oben:
left
: Minimum sehenx
wirright
: Maximum sehenx
wirbottom
: Minimum seheny
wirtop
: Maximum seheny
wir-near
: Minimum sehenz
wir. Ja , das ist-1
malnear
. Ein negativer Eingang bedeutet also positivz
.-far
: Maximum sehenz
wir. Auch negativ.Schema:
Bildquelle .
Wie es unter der Haube funktioniert
Am Ende "verwendet" OpenGL immer:
Wenn wir weder
glOrtho
noch verwendenglFrustrum
, bekommen wir das.glOrtho
undglFrustrum
sind nur lineare Transformationen (AKA-Matrixmultiplikation), so dass:glOrtho
: Nimmt ein bestimmtes 3D-Rechteck in den Standardwürfel aufglFrustrum
: nimmt einen bestimmten Pyramidenabschnitt in den Standardwürfel aufDiese Transformation wird dann auf alle Scheitelpunkte angewendet. Das meine ich in 2D:
Bildquelle .
Der letzte Schritt nach der Transformation ist einfach:
x
,y
undz
sind in[-1, +1]
z
Komponente und nimm nurx
undy
, das jetzt in einen 2D-Bildschirm eingefügt werden kannMit
glOrtho
,z
ignoriert wird, so könnten Sie auch immer verwenden0
.Ein Grund, den Sie möglicherweise verwenden möchten,
z != 0
besteht darin, dass Sprites den Hintergrund mit dem Tiefenpuffer ausblenden.Missbilligung
glOrtho
ist ab OpenGL 4.5 veraltet : das Kompatibilitätsprofil 12.1. "VERTEX-TRANSFORMATIONEN MIT FESTFUNKTION" ist rot.Verwenden Sie es also nicht für die Produktion. In jedem Fall ist das Verstehen ein guter Weg, um OpenGL-Einblicke zu erhalten.
Moderne OpenGL 4-Programme berechnen die Transformationsmatrix (die klein ist) auf der CPU und geben dann die Matrix und alle zu transformierenden Punkte in OpenGL an, wodurch die Tausenden von Matrixmultiplikationen für verschiedene Punkte sehr schnell parallel ausgeführt werden können.
Manuell geschriebene Vertex-Shader führen dann die Multiplikation explizit durch, normalerweise mit den praktischen Vektordatentypen der OpenGL Shading Language.
Da Sie den Shader explizit schreiben, können Sie den Algorithmus an Ihre Bedürfnisse anpassen. Diese Flexibilität ist ein Hauptmerkmal moderner GPUs, die im Gegensatz zu den alten, die einen festen Algorithmus mit einigen Eingabeparametern verwendet haben, jetzt beliebige Berechnungen durchführen können. Siehe auch: https://stackoverflow.com/a/36211337/895245
Mit einem expliziten
GLfloat transform[]
würde es ungefähr so aussehen:GitHub stromaufwärts .
Ausgabe:
Die Matrix für
glOrtho
ist wirklich einfach und besteht nur aus Skalierung und Übersetzung:wie in den OpenGL 2-Dokumenten erwähnt .
Die
glFrustum
Matrix ist auch nicht allzu schwer von Hand zu berechnen, wird aber nervig. Beachten Sie, dass Kegelstumpf nicht nur mit Skalierung und Übersetzungen wie möglich hergestellt werdenglOrtho
kann. Weitere Informationen finden Sie unter: https://gamedev.stackexchange.com/a/118848/25171Die GLM OpenGL C ++ - Mathematikbibliothek ist eine beliebte Wahl für die Berechnung solcher Matrizen. http://glm.g-truc.net/0.9.2/api/a00245.html dokumentiert sowohl eine
ortho
als auchfrustum
Operationen.quelle
OpenGL-Dokumentation (fett gedruckt)
Die Zahlen definieren die Positionen der Schnittebenen (links, rechts, unten, oben, nah und fern).
Die "normale" Projektion ist eine perspektivische Projektion, die die Illusion von Tiefe vermittelt. Wikipedia definiert eine Parallelprojektion als:
quelle