Worauf sollte ich achten, wenn ich den OpenGL-Ursprung oben links auf dem Bildschirm ändere?

11

Zur Selbstbildung schreibe ich eine 2D-Platformer-Engine in C ++ mit SDL / OpenGL. Ich habe anfangs mit reinem SDL begonnen, indem ich die Tutorials auf sdltutorials.com und lazyfoo.net verwendet habe. Jetzt verwende ich SDL, um einen OpenGL-Rendering-Kontext zu erstellen und dann mit OpenGL-Funktionen zu rendern (speziell im Sofortmodus, aber ich lerne etwas über VAOs / VBOs ). Ich verwende SDL nur für Schnittstellen, Audio usw.

SDL verwendet ein Koordinatensystem mit dem Ursprung oben links auf dem Bildschirm und der positiven y-Achse nach unten. Es ist einfach, meine orthografische Projektion in OpenGL einzurichten, um dies widerzuspiegeln.

Ich weiß, dass Texturkoordinaten ein rechtes System mit Werten von 0 bis 1 sind. Wenn Sie die Textur vor dem Rendern vertikal spiegeln (also die Datei vor dem Laden spiegeln), erhalten Sie Texturen, die korrekt gerendert werden. Das ist in Ordnung, wenn ich zeichne die gesamte Textur, aber letztendlich werde ich Kachelsätze verwenden und kann mir Probleme vorstellen.

Worüber sollte ich beim Rendern besorgt sein, wenn ich dies tue?

Wenn jemand einen Rat hat oder dies selbst getan hat und auf zukünftige Fallstricke hinweisen kann, wäre das großartig, aber wirklich alle Gedanken wären willkommen.

Derivat
quelle
1
Verwenden Sie SDL zum Rendern (wie in den Blitting-Funktionen von SDL) oder verwenden Sie SDL zum Erstellen eines OpenGL-Renderkontexts und verwenden Sie dann OpenGL-Funktionen zum Rendern?
Nicol Bolas
1
Ich verwende SDL, um einen OpenGL-Rendering-Kontext zu erstellen, und verwende OpenGL-Funktionen zum Rendern. Ich werde dies in der Frage klären.
Ableitung
1
Wenn Sie ein Physiksystem verwenden möchten, sollten Sie besser sehen, welches Koordinatensystem verwendet wird (Rechts- oder Linkshänder, Y-UP oder Y-DOWN), und weiterhin dasselbe verwenden. Natürlich können Sie Dinge wie das Umkehren der Schwerkraft tun, aber ich würde versuchen, dasselbe zu verwenden, um die Dinge einfacher zu machen.
Gustavo Maciel

Antworten:

8

"Worüber sollte ich beim Rendern besorgt sein, wenn ich das mache?" - nicht viel. Ein Koordinatensystem ist nur eine Konvention, keine feste Regel, und dies ist eine vollkommen legale und gültige Sache. Stellen Sie einfach sicher, dass Sie in Ihrer eigenen Verwendung konsistent sind und alles gut funktioniert.

Maximus Minimus
quelle
Groß! Ich hatte eine Ahnung, dass Selbstbeständigkeit das einzige war, worüber ich mir Sorgen machen musste, aber dies ist Neuland für mich.
Ableitung
1
Ich sollte hinzufügen, dass der liebe alte Quake dies 1996 getan hat und es gut funktioniert hat.
Maximus Minimus
5

Wenn ich mit OpenGL in 2D arbeite, verwende ich häufig die obere linke Ecke als Ursprung. Dies kann erfolgen mit:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

Es gibt jedoch einige Fallstricke, wenn Sie den Ursprung nach links oben ändern.

Eine Falle, auf die ich mehr als einmal gestoßen bin: Beim glScissor()Beschneiden werden immer die Koordinaten unten links verwendet.

Seine Unterschrift lautet:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

wo x, ydie angeben linke untere Ecke des Schere Box.

Im Allgemeinen verwenden alle Funktionen, die in Fensterkoordinaten ausgeführt werden , die linke untere Ecke als Ursprung. Dazu gehören Funktionen wie gluProject, gluUnProject, glCopyPixelsusw.

Einige Funktionen glDrawPixelsverwenden jedoch beispielsweise die glRasterPosPositionierung und glRasterPosverwenden Objektkoordinaten (dh transformierte Koordinaten) .

Wenn Sie unter Linux arbeiten und wissen, wie man es verwendet man, können Sie eine Kopie der OpenGL-Manpages hier herunterladen : ftp://ftp.sgi.com/sgi/opengl/doc/ Ich finde sie in Echtzeit. Sparer.

Außerdem stelle ich fest, dass Sie sagen, dass Sie die Datei vor dem Laden umdrehen müssen. Dies ist nicht erforderlich. Anstatt das Bild beim Laden umzudrehen, drehen Sie beim Rendern einfach die Texturkoordinaten von 1,0 auf 0,0.

QuasarDonkey
quelle