2010-06-06 12 views
5

Ich versuche, Texturen zu erzeugen, etwa so:glGenTextures hält returing 0'en

#define checkImageWidth 64 
#define checkImageHeight 64 
static GLubyte checkImage[checkImageHeight][checkImageWidth][4]; 
static GLubyte otherImage[checkImageHeight][checkImageWidth][4]; 

static GLuint texName[2]; 

void makeCheckImages(void) 
{ 
    int i, j, c; 

    for (i = 0; i < checkImageHeight; i++) { 
     for (j = 0; j < checkImageWidth; j++) { 
      c = ((((i&0x8)==0)^((j&0x8))==0))*255; 
      checkImage[i][j][0] = (GLubyte) c; 
      checkImage[i][j][1] = (GLubyte) c; 
      checkImage[i][j][2] = (GLubyte) c; 
      checkImage[i][j][3] = (GLubyte) 255; 
      c = ((((i&0x10)==0)^((j&0x10))==0))*255; 
      otherImage[i][j][0] = (GLubyte) c; 
      otherImage[i][j][1] = (GLubyte) 0; 
      otherImage[i][j][2] = (GLubyte) 0; 
      otherImage[i][j][3] = (GLubyte) 255; 
     } 
    } 
} 
void init(void) 
{  
    glClearColor (1.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
    glEnable(GL_DEPTH_TEST); 

    makeCheckImages(); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    glGenTextures(2, texName); 
    glBindTexture(GL_TEXTURE_2D, texName[0]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
     GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
     GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, 
     checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
     checkImage); 

    glBindTexture(GL_TEXTURE_2D, texName[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
     GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
     GL_NEAREST); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, 
     checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
     otherImage); 
    glEnable(GL_TEXTURE_2D); 

    engineGL.current.tex = texName[1]; 
} 

Aber wenn ich die Werte von texName überprüfen [0] und [1] sie sind beide 0, ich verstehe nicht, warum, Was mache ich falsch. Vielen Dank.

+0

Ist das die einzige Funktion, die fehlschlägt? – jalf

+0

Nein, andere Dinge scheitern auch, ich rufe init() auf, nachdem ich meinen Kontext eingerichtet habe ... – jmasterx

+1

hast du verifiziert, dass es dir gelingt, deinen Kontext einzurichten? –

Antwort

8

Try glGetError aufrufen. Es sollte Ihnen genauer erklären, was schief gelaufen ist. Wenn eine OpenGL-Funktion fehlschlägt, sollten Sie als erstes OpenGL fragen, warum es fehlgeschlagen ist. Es weiß, weil es gerade versucht hat, die Funktion auszuführen.

Es ist viel schwieriger für uns zu erraten, was möglicherweise schief gelaufen.

+0

Ich bekomme Fehler 1282, was ist das? – jmasterx

+3

Verwenden Sie 'gluErrorString()', um herauszufinden. :) http://www.opengl.org/wiki/FAQ#glGetError_.28or_.22How_do_I_check_for_GL_errors.3F.29 – jalf

+0

"ungültige Operation" – jmasterx

18

Sie wahrscheinlich fordern glGenTextures vor dem OpenGL-Kontext zu schaffen, und das wird einen GL Fehler. Versuchen Sie nicht, Texturen zu erstellen, bevor Sie OpenGL initialisiert haben.

+0

Ja, das war 1 meine Fragen, ich war auch wglMakeCurrent Aufruf in meiner Schleife machen, die Probleme verursacht wurde – jmasterx

+0

Sie sparen mir nur 1 Nacht schlaflos – 5argon

+0

Dank! Du hast mein Leben gerettet! –

11

ich dieses Problem hatte, und glGetError() zurückkehren 0.

In meinem Fall ist es durch den Aufruf glGenTextures(...) auf einem anderen Thread zu dem einen des GL Kontext auf erstellt wurde, verursacht wurde (weil ich die Texturen asynchron geladen wurde) . Rufen Sie es aus dem Hauptthread nach die asynchrone Last glGenTextures(...) beginnen wieder zu arbeiten.

0

In meinem Fall war ich "lazy loading" meine Textur, so war die glGenTexture innerhalb eines glBegin/glEnd Befehl!

-1

vor glGenTexture, Ihr opengl Kontext Aufruf erstellt werden muß und XXXMakeCurrent'ed