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:
ed è quello che sto ottenendo:
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
Nota a margine: Penso che si intende glTexCoord2f (la "d" sta per "doppia", non "dimensioni"). –
@MarceloCantos Giusto, ma probabilmente non dovrebbe fare la differenza, vero? – Vitalij
No, non mi aspetto che ciò influenzi il risultato. –