[OpenGL] Bündig zu Bildschirm zeichnen



  • Hallo,

    ich weiß nicht, ob mir irgentwo etwas entgagngen ist, aber ich habe das Problem, dass ich nicht weiß, wie ich es hinkriege, etwas in OpenGL bündig zu Bildschirm zu zeichnen. Heißt, dass ich eine Lebensanzeige immer in der unteren linken Ecke haben will etc. Also ich könnte ja ausprobieren, bei welchen Koordinaten eine Sprite in der Ecke liegt, aber wird das dann auf jedem Bildschirm gleich angezeigt, oder verschiebt sich das dann bei verschiedenen Auflösungen?

    Ich hab schon gegoogelt aber nichts gefunden. Weiß einer eine Lösung?



  • Setz alle Matritzen (ModelView und Projection) auf Identity, dann malst du direkt in den Clipspace. Der Punkt (-1, -1) ist dabei dann links unten und (1, 1) rechts oben.



  • dot schrieb:

    Setz alle Matritzen (ModelView und Projection) auf Identity, dann malst du direkt in den Clipspace. Der Punkt (-1, -1) ist dabei dann links unten und (1, 1) rechts oben.

    Das ist relativ dämlich für das Zeichnen von (Pixel-)Sprites.

    Man sollte auf jeden Fall eine der Achsen mit der (inversen) Aspectratio skalieren damit auf mehr oder weniger breiten Bildschirmen keine Verzerrungen entstehen und in den Koordinaten Quadrate auch wieder Quadrate auf dem Bildschirm ergeben.

    Vorzugsweise würde ich sogar den Bildschirm auf Pixelkoordinaten bringen so das 1LE = 1Px.

    Das müsste mit der Matrix inverse(Scale(width, height, 1)*Translate(1, 1, 0)) = Translate(-1, -1, 0)*Scale(1/width, 1/height, 1) funktionieren wenn ich mich grade nicht irre. Aber besser vorher mal testen ob (0,0, 0) -> (-1, -1, 0) und (width, height, 0) -> (1, 1, 0) korrekt abgebildet werden.

    Ich würde möglicherweise sogar nochmal überlegen, zu spiegeln, sodass man mit y von oben nach unten läuft.



  • Naja, also ich bin jetzt noch ein ziemlicher Anfänger was Grafikprogrammierung angeht, sonst bin ich aber schon einige Jahre im Geschäft. Und blard, deine Lösung hört sich ziemlich komplex an für so ein elementares Problem. Gibt es da wirklich keine einfachen Lösungen von OpenGL aus?

    Ich weiß nicht, inwiefern das jetzt ein Unterschied macht, aber ich benutzte OpenGL ES für Android. Android hat sich dafür zwar auch die Mühe gemacht, Dokumentationen zu schreiben, bloß sind die meiner Meinung nach ziemlich nutzlos, weil dort nur erklärt wird, dass es das und das gibt, aber nicht konkret, wo es im Quellcode wie eingefügt werden muss. Allgemein gibt es nicht viele Quellen zu dieser OpenGL-Variante. Google geizt beim Informationen hergeben ziemlich...



  • Also zumeist wird man solche UI-Sachen wohl in Pixeln angeben wollen, aber es soll wohl auch Leute geben, die freuen sich, wenn die Dinge einfach immer prozentual gleichgroß sind...

    Pixel mit Ursprung links oben (wie so ziemlich jedes UI-Koordinatensystem):
    Wir haben eine Auflösung von hoehe * breite.
    [0,0] soll auf [-1,1] abgebildet werden. [breite,hoehe] soll auf [1,-1] abgebildet werden.

    Also haben wir
    x' = -1 + x / breite * 2;
    y' = 1 - y / hoehe * 2;

    Daraus folgt die benötigte Matrix:
    | 2/breite; 0; 0; -1 |
    | 0; -2/hoehe; 0; 1 |
    | 0; 0; 1; 0 |
    | 0; 0; 0; 1 |

    Oder vertu' ich mich? Diese Matrix als Perspektive und dann kannst du noch eine Transformationsmatrix für's verschieben von Fenstern und setzen deren Ursprungs verwenden.

    Gibt's in OpenGL eigentlich noch einen Matrix-Stack? Ich habe vor 6 Jahren das letzte Mal damit rumgemacht 😃

    Früher gab's mal glOrtho, das ziemlich genau solch eine Matrix produziert hat (plus z-Bereich natürlich und ohne Negation von y), aber ich glaube diese ganzen Billig-Funktionen wurden aus OpenGL entfernt.


Anmelden zum Antworten