Frage

Ich habe dieses Problem ein paar Mal hatte. Lassen Sie uns sagen, dass ich einen Splash-Screen oder etwas in einem OpenGL-Kontext angezeigt werden soll (oder DirectX für diese Angelegenheit, es ist eher eine begriffliche Sache), jetzt konnte ich entweder laden Sie einfach eine 2048x2048 Textur und hoffen, dass die Grafikkarte fertig zu werden mit es (die meisten heute werde ich nehme an), sondern wächst mit Old-School-Grafikkarte ich habe das schlechte Gewissen über mich lehnte und mir zu sagen, ich sollte nicht Texturen verwenden, die große.

Was ist der bevorzugte Weg, heute? Ist es zu stopfen, genau das, was in den Videospeicher, Fliesen es, oder lassen Sie die CPU die Arbeit und glDrawPixels? Oder etwas aufwendigere?

War es hilfreich?

Lösung

Wenn dies ein einzelne Frame Splash-Bild ohne Animationen ist, dann gibt es keinen Schaden mit glDrawPixels. Wenn die Leistung ist entscheidend, und Sie sind verpflichtet, eine Textur zu verwenden, dann ist die richtige Art und Weise zu tun, es zur Laufzeit zu bestimmen ist, die maximal unterstützte Texturgröße, eine Proxy-Textur verwendet wird.

GLint width = 0;
while ( 0 == width ) {  /* use a better condition to prevent possible endless loop */
    glTexImage2D(GL_PROXY_TEXTURE_2D, 
                      0,                /* mip map level */
                      GL_RGBA,          /* internal format */
                      desiredWidth,     /* width of image */
                      desiredHeight,    /* height of image */
                      0,                /* texture border */
                      GL_RGBA           /* pixel data format, */ 
                      GL_UNSIGNED_BYTE, /* pixel data type */
                      NULL              /* null pointer because this a proxy texture */
    );

    /* the queried width will NOT be 0, if the texture format is supported */
    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);

    desiredWidth /= 2; desiredHeight /= 2;
}

Wenn Sie die maximale Texturgröße durch das System des OpenGL-Treiber unterstützt werden wissen, haben Sie mindestens zwei Möglichkeiten, wenn Ihr Bild passt nicht:

  • Bild Fliesen : Verwenden Sie mehrere Quads nach dem Bild in kleinere Stücke aufzuteilen unterstützt. Bild Fliesen für so etwas wie ein Splash-Screen sollte nicht zu schwierig sein. Sie können glPixelStorei 's GL_PACK_ROW_LENGTH Parameter laden Abschnitte eines größeren Bildes in eine Textur.
  • Ändern der Bildgröße : die Größe Ihres Bildes die maximal unterstützte Texturgröße zu passen. Es gibt sogar eine GLU Helferfunktion dies für Sie tun, gluScaleImage .

Andere Tipps

Ich glaube nicht, gibt es eine eingebaute in opengl Funktion, aber Sie könnten eine Bibliothek (oder schreiben Sie die Funktion selbst) zu brechen das Bild nach unten in kleinere Stücke und dann drucken zu screenen, die kleinere Stücke (128x128 Fliesen finden oder ähnlich).

Ich hatte Problem mit dieser Verwendung Slick2D für ein Java-Spiel. Sie können ihre "BigImage" Klasse für Ideen hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top