2012-04-15 26 views
0

Ich habe bereits stb_image in einigen Desktop (PC) -Projekten verwendet und es hat gut funktioniert, aber jetzt versuche ich es zu verwenden, um einige Tags zu laden, um sie mit OpenGL ES zu verwenden und ich kann t. Dieser ist der Code, den ich verwenden:stb_image funktioniert nicht auf iPhone

void TextureManager::LoadFontTexture(const char *filename,int rows,int columns) 
{ 
    glGenTextures(1,&textures[texNum]); 
    texNum++; 
    glBindTexture(GL_TEXTURE_2D,textures[texNum-1]); 
    int x,y,n; 
    GLenum format; 
    unsigned char *data=stbi_load(filename,&x,&y,&n,0); 
    if (data==NULL) 
    { 
     NSLog(@"Data loaded incorrectly"); 
     NSLog(@"Failure reason:%s",stbi_failure_reason()); 
    } 
    else { 
     NSLog(@"Width:%d height:%d",x,y); 
    } 
    if (n==3) 
    { 
     format=GL_RGB; 
    } 
    else if (n==4) 
    { 
     format=GL_RGBA; 
    } 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

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

    glTexImage2D(GL_TEXTURE_2D,0,n,x,y,0,format,GL_UNSIGNED_BYTE,data); 
} 

Dieser Code hat gut funktioniert auf dem Desktop, aber wenn ich versuche, etwas mit diesem Bild texturize ich ein schwarzes Quadrat. Die Werte für Breite und Höhe sind korrekt und immer die (n == 4) wenn sie aufgerufen wird (das Bild hat einen Alpha-Kanal, also ist das korrekt). Ich weiß nicht, was falsch ist. Ich habe auch versucht, das Format zu ändern = GL_RGBA mit format = GL_BGRA, aber es funktioniert nicht

+0

FWIW, beachten Sie, dass Ihr Code möglicherweise Ressourcen verliert: Wenn das Laden des Images fehlschlägt, wird die GL-Textur trotzdem generiert und nicht freigegeben. Außerdem sollte auf "stbi_load" ein Aufruf "stbi_image_free" folgen. – rotoglup

Antwort

2

glTexImage2D Aufruf sollte wie folgt aussehen:

glTexImage2D(GL_TEXTURE_2D,0,format,x,y,0,format,GL_UNSIGNED_BYTE,data); 

3 oder 4 sind keine gültigen Werte für internalformat in OpenGL ES . Lesen Sie die Dokumentation hier: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml

EDIT: hier weitere Informationen wie OpenGL Fehler Dectect:

Um diese Art von Fehler zu erkennen verwenden, um die glGetError Funktion. Es wird angezeigt, welche Funktion fehlgeschlagen ist. Zum Beispiel - erstellen Makro folgende:

#define GL_CHECK(x) do { 
    x; 
    GLenum glerr = glGetError(); 
    if (glerr != GL_NO_ERROR) { 
     NSLog(@"OpenGL error: %d, file: %s, line: %d", glerr, __FILE__, __LINE__); 
    } 
} while (0) 

es dann jede OpenGL-Funktion wie folgt verwenden um:

GL_CHECK(glTexImage2D(GL_TEXTURE_2D,0,n,x,y,0,format,GL_UNSIGNED_BYTE,data)); 

Diese sofort lassen Sie wissen, wo der Fehler ist, einschließlich der Dateiname und die Zeilennummer. Natürlich deaktivieren Sie die Überprüfung im Freigabemodus, wenn Sie die Anwendung versenden. Verwenden Sie einfach ein anderes Makro:

+0

Vielen Dank! – XaitormanX

+0

Nochmals vielen Dank für die Fehlerüberprüfungsmethode – XaitormanX

+0

Ich habe keine Fehler und habe immer noch schwarze Textur –

Verwandte Themen