¿Por qué no puedo cargar una textura en mi aplicación?

Creo que el mapeo de texturas es una tarea realmente fácil. En realidad, lo implementé muchas veces pero fallé en este momento y no sé por qué. Y puedo garantizar que la ruta para cargar la textura es correcta. ¿Alguna otra razón para mi confusión?

Aquí está mi código:

GLuint mytexture;
// two functions below come from NeHe's tut. I think it works well.
AUX_RGBImageRec *LoadBMP(CHAR *Filename)                
{
    FILE *File=NULL;                                    
if (!Filename)                                      
{
    return NULL;                                    
}
File=fopen(Filename,"r");                           
if (File)                                           
{
    fclose(File);                                   
    return auxDIBImageLoadA(Filename);              
}
return NULL;                                        
}

int LoadGLTextures()                                    
{
int Status=FALSE;                                   
AUX_RGBImageRec *TextureImage[1];                   
memset(TextureImage,0,sizeof(void *)*1);            

if (TextureImage[0]=LoadBMP("NeHe.bmp"))
{
    Status=TRUE;                                    
    glGenTextures(1, &mytexture);                   
    glBindTexture(GL_TEXTURE_2D, mytexture);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, 
        GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
}

if (TextureImage[0])                                
{
    if (TextureImage[0]->data)                      
    {
        free(TextureImage[0]->data);                
    }

    free(TextureImage[0]);                          
}
return Status;                                      
}

//next is my Init() code:
bool DemoInit( void )
{
if (!LoadGLTextures())                          
{
    return FALSE;                                   
}
glEnable(GL_TEXTURE_2D);
........//other init is ok
}

bool DemoRender()
{
...///render other things
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mytexture);
glColor3f(0,0,1);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(200, 0);
glTexCoord2f(1, 1); glVertex2f(200, 200);
glTexCoord2f(0, 1); glVertex2f(0, 200);
glEnd();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
}

Bastante claro, ¿eh? Sin embargo, el resultado final solo tiene un rectángulo azul sin la textura. ¿Alguien podría darme una pista?

preguntado el 22 de mayo de 12 a las 09:05

Nada me salta a la vista como incorrecto. ¿Ha probado glGetError después de la inicialización y una vez después de cada ciclo de procesamiento? -

Deje de usar GLAUX. Usa un verdadero Biblioteca de carga de imágenes. -

Para Tim: Sí, uso glGetError y el resultado es 0. Por cierto, en lugar de textura, renderizo directamente TextureImage[0] con glDrawPixels. Puedo ver la imagen en un ángulo particular. Tal vez demuestre que el proceso de carga está bien. Pero creo que necesito textura. -

A Nicol Bolas: OK, intentaré otra forma de cargar la imagen. Pero en realidad, puedo usar glDrawPixels para obtener la imagen. Así que creo que el problema puede no ser el GLAUX. -

@TonyLic: Bueno, GLAUX puede funcionar para usted, pero está tan desactualizado que su olor a podrido incluso se escapa del medio de almacenamiento en el que está;) ¿Qué tal usar DevIL? -

2 Respuestas

Asumiendo TextureImage[0]->data se rellena correctamente:

Sin embargo, el resultado final solo tiene un azul rectángulo sin la textura.

Estás usando el predeterminado GL_MODULATE entorno de textura. Cualquiera de los dos cambia glColor3f(0,0,1) a glColor3f(1,1,1) vea la sección GL_DECAL.

También puede intentar un glPixelStorei(GL_UNPACK_ALIGNMENT, 1) antes de su glTexImage2D() ya que estas usando GL_RGB para formato.

contestado el 22 de mayo de 12 a las 16:05

Gracias a todos aquí. Encuentro que el problema es que configuré el modo GL_LINE antes de cargar la textura y no me di cuenta de eso. Realmente estúpido, ¿eh? ¡Pero gracias de todos modos por sus excelentes sugerencias! ¡Creo que he aprendido algo! - TonyLic

El problema es que configuré el modo GL_LINE antes de cargar la textura y no lo noté. Entonces, después de configurar el modo GL_FILL, ¡todo está bien!

contestado el 29 de mayo de 12 a las 03:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.