2011-11-23 4 views
10

Sto provando a impostare un'immagine di sfondo della mia finestra openGL creando un quad su una matrice di proiezione ortogonale e aggiungendo texture ad essa. Sto anche facendo uso di GLUT toolkit nella mia applicazione.Imposta l'immagine di sfondo di una finestra openGL

Tuttavia, sto riscontrando diversi problemi. Di seguito sono riportati gli screenshot che illustrano il problema: l'immagine è in scala di grigi e si ripete su x e y, anche se le dimensioni della trama sono uguali a quelle del quad.

che è quello che sto cercando di realizzare: Desired result

ed è quello che sto ottenendo: Actual result

codice per il rendering e di carico consistenza assomiglia a questo:

void orthogonalStart (void) { 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    gluOrtho2D(0, w1, 0, h1); 
    glScalef(1, -1, 1); 
    glTranslatef(0, -h1, 0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void orthogonalEnd (void) { 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
} 

GLuint LoadTexture(const char * filename, int width, int height) 
{ 
    GLuint texture; 
    unsigned char * data; 
    FILE * file; 

    //The following code will read in our RAW file 
    file = fopen(filename, "rb"); 
    if (file == NULL) return 0; 
    data = (unsigned char *)malloc(width * height * 3); 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 


    //even better quality, but this will do for now. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 


    //to the edge of our shape. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    //Generate the texture 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,GL_RGB, GL_UNSIGNED_BYTE, data); 
    free(data); //free the texture 
    return texture; //return whether it was successful 
} 

void FreeTexture(GLuint texture) 
{ 
    glDeleteTextures(1, &texture); 
} 

void background (void) { 
    glBindTexture(GL_TEXTURE_2D, texture); 

    orthogonalStart(); 

    glBegin(GL_QUADS); 
     glTexCoord2d(0.0,0.0); glVertex2f(0, 0); 
     glTexCoord2d(1.0,0.0); glVertex2f(1024, 0); 
     glTexCoord2d(1.0,1.0); glVertex2f(1024, 1024); 
     glTexCoord2d(0.0,1.0); glVertex2f(0, 1024); 
     glEnd(); 

    orthogonalEnd(); 
} 

void display (void) { 
    glClearColor (1.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 

    background(); 
    gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    glutSwapBuffers(); 
} 

Per convertire la texture da png in formato Raw, utilizzo Photoshop, quindi ho pensato che l'immagine in scala di grigi potesse essere dovuta alla conversione.

Nota: Ho appena iniziato l'apprendimento aperto, quindi questo potrebbe non essere l'approccio migliore. Per favore fatemi sapere se c'è un modo migliore

Edit: L'immagine deve rimanere in un posto e non rescalse

+0

Nota a margine: Penso che si intende glTexCoord2f (la "d" sta per "doppia", non "dimensioni"). –

+0

@MarceloCantos Giusto, ma probabilmente non dovrebbe fare la differenza, vero? – Vitalij

+0

No, non mi aspetto che ciò influenzi il risultato. –

risposta

12

avevo avoid doing anything other than a glFrustum() or glOrtho() call per la matrice di proiezione.

Inoltre, impostare GL_UNPACK_ALIGNMENT-1 per la texture di carico se si sta facendo pixel 3 componenti:

#include <GL/glut.h> 

int w1 = 0; 
int h1 = 0; 
void reshape(int w, int h) 
{ 
    w1 = w; 
    h1 = h; 
    glViewport(0, 0, w, h); 
} 


void orthogonalStart() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    gluOrtho2D(-w1/2, w1/2, -h1/2, h1/2); 
    glMatrixMode(GL_MODELVIEW); 
} 

void orthogonalEnd() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
} 


GLuint texture = 0; 
void background() 
{ 
    glBindTexture(GL_TEXTURE_2D, texture); 

    orthogonalStart(); 

    // texture width/height 
    const int iw = 500; 
    const int ih = 500; 

    glPushMatrix(); 
    glTranslatef(-iw/2, -ih/2, 0); 
    glBegin(GL_QUADS); 
     glTexCoord2i(0,0); glVertex2i(0, 0); 
     glTexCoord2i(1,0); glVertex2i(iw, 0); 
     glTexCoord2i(1,1); glVertex2i(iw, ih); 
     glTexCoord2i(0,1); glVertex2i(0, ih); 
    glEnd(); 
    glPopMatrix(); 

    orthogonalEnd(); 
} 


void display() 
{ 
    glClearColor (1.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 

    background(); 
    gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    glutSwapBuffers(); 
} 


GLuint LoadTexture() 
{ 
    unsigned char data[] = { 255,0,0, 0,255,0, 0,0,255, 255,255,255 }; 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    //even better quality, but this will do for now. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 

    //to the edge of our shape. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    //Generate the texture 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,GL_RGB, GL_UNSIGNED_BYTE, data); 
    return texture; //return whether it was successful 
} 


int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Aspect Ratio"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    texture = LoadTexture(); 
    glutMainLoop(); 
    return 0; 
} 
Problemi correlati