OpenGL Projektionsmatrix, Auflösung ändern

Hallo.

Also. Ich habe eine OpenGL Anwendung, (Bspw. Ein Spiel).
Dort wird zunächst ein Display erzeugt, also ein fenster mit breite und höhe.
Dann hab ich eine Projektionsmatrix, (es geht hier um orthografische projektion),
diese besitzt ja die werte für top right bottom left. Wenn ich nun für top 300
einsetze, dann wird daraus in einem 800x600 fenster top300, bottom300, right400 und left400.
Das heißt doch prinzipiell, die anwendung läuft mit einer auflösung von 800x600, oder?
Wenn ich nun die Größe des Fensters verändere, also zB in den fullscreen wechsel, aber die projektionsmatrix
gleich lasse - habe ich doch die gleiche auflösung wie vorher, richtig? (Die Objekte werden dann verpixelt angezeigt,
da sie ja nun mehr platz in anspruch nehmen).
Aber - heißt das nun, wenn ich dem user bspw erlauben will das Spiel im 1600x900 modus zu betrachten,
müsste ich einfach die projektionsmatrix verändern, also bei top 800 einsetzen? Oder nicht?
Aber größere Auflösung würde doch auch andere Koordinaten für zB gui elemente erfordern, das heißt die müssten mit
der auflösung skaliert werden oder wie? Wie würdet ihr das genau machen?

Ich lass das Programm im Moment nur mit den werten 300 300 400 400 und einem 800x600 fenster laufen,
und habe zB ein Gui Element auf position 10, 10, 100, 50. Dann müsste das doch in der auflösung 1900x600 einfach
zu 20, 20, 200, 100 skaliert werden, oder übersehe ich etwas? Und im 16:9 modus, also zB 1680x1050 (mein bildschirm)
müsste ich genauso verfahren, also einfach alles skalieren?

Ich hab irgendwie ein Denkblokade, wie man das nun richtig machen könnte

Moin,

nein, wir hatten das schon öfters:

Für die Auflösung ist die Viewport Transformation zuständig.

Für eine orthogonale Projektionsmatrix sind -1/1 für die Höhe und -aspect/+aspect für die Breite sinnvolle Werte. Die absolute Auflösung ist dann außerhalb der Viewport Transformation unerheblich.

Viele Grüße
Fancy

aber aber… hä?
ja das hatten wir schon öfters ^^

aber was mach ich dann, wenn ich zB ein
Objekt haben will, das als breite 0.1 * screenWidth und als höhe 0.01 * screenHeight hat -
soll ich dann sagen height = 1 * 0.01 und width = aspect * 0.01 oder wie?
und… wie veränder ich die auflösung denn jetzt? viewport transform ist doch opengl intern?..

Mit “0.01 * screenHeight” meinst Du vermutlich 1% der Bildschirmhöhe. Wenn Du die orthogonale Projektionsmatrix, wie oben vorgeschlagen verwendest, ist die gesamte Höhe des Viewing Volume (Frustum) 2 “Einheiten” hoch. 1% wären also 0.02 und zwar immer, egal bei welcher Auflösung.
Bei der Breite ist das gleich, ein Quadrat mit 0.02x0.02 ist quadratisch, egal bei welcher Auflösung.

Die absolute Auflösung brauchst Du also weder für die Größe, noch die Positionierung der Objekte. Die einzige Ausnahme sind Objekte die links- oder rechtsbündig sein sollen, z.B. eine Anzeige für die verbleibenden Leben. Soll das z.B. oben links, wäre die Position (-aspect,1).

Wenn Du die OpenGL Zeichenfläche erzeugst (bei LWJGL das Display) wird die Viewport Transformation initial passend gesetzt um von den Normalized Device Coordinates in die Window Coordinates umrechnen zu können.

Viele Grüße
Fancy