Domanda

Ho creato un'immagine PNG in Photoshop con trasparenze che ho caricato nel programma e OpenGL. Ho rilegato ad una texture e nel programma sguardi foto sfocate e non so perché.

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

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

Caricamento Codice

// 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);

Visualizza codice

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: Non penso di essere discosto ogni pixel dovrebbe essere due nel sistema di coordinate

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);
È stato utile?

Soluzione

OpenGL (normalmente) richiedono che la trama in sé ha una dimensione che è una potenza di 2, quindi qual è (probabilmente) accadendo è che la vostra struttura è stato installato su una dimensione in cui le dimensioni sono una potenza di 2, poi è in fase ridimensionato alla dimensione originale -. nel corso di scala per due volte, si sta perdendo un po 'di qualità

È apparentemente desidera solo per visualizzare il bitmap senza essere modificato, senza avvolgendolo alla superficie di un altro oggetto, o qualcosa di simile (vale a dire, nessuna delle cose texture sono destinati). Stando così le cose, mi aveva appena visualizzarlo come bitmap, non una texture (ad esempio si veda glRasterPos2i e glBitmap ).

Altri suggerimenti

Perché si vuole utilizzare mipmapping e filtro anisotropico per un'immagine statica sullo schermo di avvio, in primo luogo? Sembra improbabile che l'immagine verrà ruotata (ciò filtro anisotropico è per) oppure deve essere ridimensionata molte volte veramente veloce (cosa mipmapping è per).

Se la texture viene allungato:. Provare a utilizzare GL_NEAREST per il vostro GL_MAG_FILTER, in questo caso si potrebbe dare risultati migliori (GL_LINEAR è più preciso, ma ha una natura di sfocatura)

Se la texture è ridotto al minimo:. Stessa cosa, provare a utilizzare GL_NEAREST_MIPMAP_NEAREST, o, ancora meglio, provare a utilizzare nessun mipmap e GL_NEAREST (o GL_LINEAR, a seconda di quale si dà il risultato migliore)

Suggerirei che ti fanno il png hanno una risoluzione in una potenza di 2 di. Cioè 1024x512 e posizionare la parte che si desidera disegnato nell'angolo in alto a sinistra di esso ancora nella risoluzione per lo schermo. Poi ridimensiona l'texcoords essere 800.0 / 1.024,0 e 600.0 / 512.0 per ottenere la parte destra dalla texture. I belive che ciò che accade è glTexImage2D può talvolta gestire larghezza e altezza che non sono una potenza di 2, ma può poi scalare l'immagine in ingresso quindi filtrare.

Un esempio di manipolazione di questo può essere visto qui (un iPhone - OpenGLES - progetto che afferra una parte dello schermo non potenza di 2 e disegna che in un 512x512 consistenza e ridimensiona la matrice GL_TEXTURE, la linea 123, invece di fare un ridimensionamento manuale dei texcoords)

Qui è un altro post che citano il presente metodo.

Ecco un'ipotesi:

La finestra è 800x600 (e forse la vostra framebuffer troppo), ma spazio clienti non è, a causa della decorazione della finestra sui lati.

Così il vostro frame-buffer viene ridimensionata quando viene blitted per l'area client della finestra. Si può controllare il codice di creazione finestra?

  • Attenzione alle esatte dimensioni dell'area client della finestra. Doppio controllo è quello che si aspetta che sia
  • Attenzione alle regole di allineamento dei pixel. Potrebbe essere necessario aggiungere 0,5 alle tue coordinate x / y per colpire i centri di pixel. Descrizione per DirectX può essere trovato qui - regole OpenGL possono essere diversi, però.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top