Wie zeichne ich eine Textur mit voller Auflösung in ein Fenster mit derselben Auflösung?

8

Mein Bild ist 1280x800 und meine Bildschirmgröße ist 1280x800. Es sollte perfekt zeichnen. Ich erstelle ein Quad von der Größe des Bildschirms und stelle die Textur so ein, dass sie zum Quad passt. Aber im Moment zeichnet es eine quadratische Textur in meiner oberen linken Ecke meines Bildschirms, die nicht maßstabsgetreu und nicht groß genug ist.

Ich weiß nicht, warum es nicht funktioniert. Ich habe versucht, die Textur beim Zeichnen größer zu schreiben, und es scheint irgendwie zu funktionieren, aber ich weiß nicht, warum es beim Zeichnen auf einer nicht funktioniert hat 1280x800 Quad.

Wie erstelle ich ein Vollbild-Quad?

So mache ich es derzeit:

Dies ist mein OPENGL- und Display-Setup-Code:

    DisplayMode displayMode = null;
    DisplayMode[] modes = Display.getAvailableDisplayModes();

    for (int i = 0; i < modes.length; i++) {
        if (modes[i].getWidth() == World.SCREEN_WIDTH && modes[i].getHeight() == World.SCREEN_HEIGHT && modes[i].isFullscreenCapable()) {
            displayMode = modes[i];
        }
    }

    Display.setDisplayMode(displayMode);
    Display.setFullscreen(false);
    Display.create();

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, World.SCREEN_WIDTH, World.SCREEN_HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

Dies ist mein Code zum Zeichnen des strukturierten Quad:

    background = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/menu/background.png")));

    glBindTexture(GL_TEXTURE_2D, background.getTextureID());
    glPushMatrix();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0); // Upper left

    glTexCoord2f(1, 0);
    glVertex2f(World.SCREEN_WIDTH, 0); // Upper right

    glTexCoord2f(1, 1);
    glVertex2f(World.SCREEN_WIDTH, World.SCREEN_HEIGHT); // Lower right

    glTexCoord2f(0, 1);
    glVertex2f(0, World.SCREEN_HEIGHT); // Lower left
    glEnd();
    glPopMatrix();
Louis Hong
quelle
Klingt so, als würde Slick2D eine Textur mit einer Zweierpotenzgröße erstellen. Siehe slick.ninjacave.com/forum/viewtopic.php?p=26076
msell
@msell Wie kann ich dann meinen 1280x800-Bildschirm abdecken?
Louis Hong
2
Während dies für Sie ein echtes Problem sein könnte, scheint dies eher eine Frage vom Typ "Debug my Code" zu sein, die nicht zum Stack Exchange Q / A-Stil passt.
Katu
Eigentlich ist es nicht, das ist ein echtes LWJGL-Problem. Ich habe die Antwort auf die Frage. Aber ich mag es nicht, wie Leute mit hohem Rang herumgehen und Stimmen abgeben, ohne sich wirklich den Inhalt anzusehen @Katu
Louis Hong
1
Die Größe der Zweierpotenz sollte keine Rolle spielen, da die verwendeten Texcoords die Textur entweder dehnen oder zusammendrücken, um den Bildschirm auszufüllen. Wahrscheinlicher ist, dass die Modelview-Matrix keine Identität ist - siehe meine Antwort unten.
Maximus Minimus

Antworten:

5

Eine wahrscheinliche Ursache ist, dass Sie möglicherweise keine Identität in Ihrer Modellansichtsmatrix haben, wenn Sie das Vollbild-Quad zeichnen. Dies kann passieren, wenn Sie vor dem Quad noch etwas zeichnen.

Ich stelle aus Ihrem Setup-Code fest, dass Sie den Matrixmodus korrekt auf GL_MODELVIEW umschalten, aber danach keinen glLoadIdentity-Aufruf mehr ausführen (dies ist in Ordnung, da es zunächst eine Identität sein sollte, aber es ist eine gute Angewohnheit, sich darauf einzulassen ).

Wenn Sie Ihr Quad zeichnen, wird es von einem glPushMatrix / glPopMatrix-Aufruf umgeben. Dies allein reicht nicht aus, um eine Matrixidentität zu erstellen. aus der Spezifikation :

glPushMatrix drückt den aktuellen Matrixstapel um eins nach unten und dupliziert die aktuelle Matrix . Das heißt, nach einem glPushMatrix-Aufruf ist die Matrix oben auf dem Stapel mit der darunter liegenden identisch .

(Meine Betonung.)

Mit anderen Worten, wenn Ihre vorherige Modellansichtsmatrix keine Identität war, ist die neue Modellansichtsmatrix nach dem Aufruf von glPushMatrix ebenfalls keine Identität.

Die einfachste Lösung besteht darin, nach Ihrem glPushMatrix-Aufruf eine glLoadIdentity hinzuzufügen.

Maximus Minimus
quelle
Wow, das ist sehr kompliziert. Wie funktionieren Matrizen?
Louis Hong
1
Sie sollten dafür nach Tutorial-Material suchen - es ist für diese Site sehr unangebracht.
Maximus Minimus