Frage

Ich habe ein PNG-Bild in Photoshop mit Folien erstellt, dass ich in und OpenGL Programm geladen habe. Ich habe es auf eine Textur binded und im Programm sieht das Bild verschwommen, und ich bin mir nicht sicher, warum.

alt text http://img685.imageshack.us/img685/9130/upload2 .png

alt text http://img695.imageshack.us/img695/2424/upload1e .png

Laden-Code

// Texture loading object
nv::Image title;

// Return true on success
if(title.loadImageFromFile("test.png"))
{
    glGenTextures(1, &titleTex);
    glBindTexture(GL_TEXTURE_2D, titleTex);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}

else
    MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);

Anzeige-Code

glEnable(GL_TEXTURE_2D);    
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);

glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
    glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
    glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);    
glDisable(GL_TEXTURE_2D);

EDIT: Ich glaube nicht, ich bin jedes Pixel Stretching zwei in dem Koordinatensystem sein sollte

int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
War es hilfreich?

Lösung

OpenGL wird (in der Regel) verlangt, dass die Textur selbst eine Größe hat, die eine Potenz von 2 ist, so etwas ist (wahrscheinlich) passiert ist, dass Ihre Textur auf eine Größe skaliert werden, wo die Dimensionen sind eine Potenz von 2, dann es wieder auf die ursprüngliche Größe skaliert ist wird -. in den Prozess der zweimal skaliert werden, werden Sie einige Qualität zu verlieren

Sie wollen anscheinend nur Bitmap angezeigt werden ohne Skalierung, ohne sie auf die Oberfläche eines anderen Objekts Einwickeln, oder so etwas (das heißt, sind eine der Dinge, Texturen, die für). Wenn das der Fall, würde ich es nur als Bitmap angezeigt werden, nicht eine Textur (siehe zB glRasterPos2i und glBitmap ).

Andere Tipps

Warum wollen Sie für ein statisches Bild auf dem Startbildschirm in erster Linie Mip-Mapping und anisotrope Filterung benutzen? Es ist eher unwahrscheinlich, wird das Bild gedreht werden (was anisotrope Filterung für ist) oder oft sehr schnell (was für Mipmapping ist).

Größe geändert werden muss

Wenn die Textur gestreckt wird. Versuchen GL_NEAREST für Ihre GL_MAG_FILTER verwenden, in diesem Fall könnte es zu besseren Ergebnissen führen (GL_LINEAR ist genauer, hat aber eine Art von Unschärfe)

Wenn die Textur minimiert wird. Gleiche, versuchen GL_NEAREST_MIPMAP_NEAREST, oder noch besser, versuchen keine Mipmaps mit und GL_NEAREST (oder GL_LINEAR, je nachdem, was gibt Ihnen das beste Ergebnis)

Ich würde vorschlagen, dass Sie die png machen eine Auflösung in einer Potenz von 2 ist haben. Dh 1024x512 und legen Sie den Teil, den Sie in der linken oberen Ecke davon noch in der Auflösung für den Bildschirm gezeichnet werden sollen. Dann rescale die texcoords sein 800.0 / 1024,0 und 600,0 / 512,0 den rechten Teil von der Textur zu erhalten. Ich glaube, dass was los ist, ist glTexImage2D irgendwann Breite verarbeiten kann und Höhe, die nicht eine Potenz von 2 ist, aber dann das Eingangsbild skalieren damit es filtert.

Ein Beispiel des Umgangs mit diesem kann hier eingesehen werden (a iPhone - OpenGLES - Projekt, das eine Bildschirmteil nicht-Leistung von 2 greift und zieht, dass in eine 512x512 Textur und skaliert die GL_TEXTURE Matrix, Linie 123, anstatt eine manuelle rescale der texcoords tun)

Hier ist ein weiterer Beitrag zu erwähnen, diese Verfahren.

Hier ist eine Hypothese:

Ihr Fenster ist 800x600 (und vielleicht auch Ihre Framebuffer auch), aber Ihr Client-Bereich ist nicht, weil die Fensterdekoration auf den Seiten.

So Rahmen-Puffer der Größe verändert wird, wenn auf den Clientbereich des Fensters Blitted werden. Können Sie Ihre Fenster Erstellungscode überprüfen?

  • Achten Sie auf genaue Größe des Client-Bereich des Fensters. Überprüfen Sie ist es, was Sie es
  • zu erwarten
  • Achten Sie auf Regeln Ausrichtung Pixel. Sie könnten 0,5 bis Ihre x / y-Koordinaten hinzufügen müssen die Pixelzentren zu treffen. Beschreibung für DirectX können hier werden - OpenGL Regeln können unterschiedlich sein, aber.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top