2009-05-15 2 views
2

Hier ist der Code, den ich verwende, um eine Textur zu laden. Bild ist ein CGImageRef. Nachdem ich das Bild mit diesem Code geladen habe, zeichne ich das Bild mit glDrawArrays().glError: 0x0501 beim Laden einer großen Textur mit OpenGL ES auf dem iPhone?

size_t imageW = CGImageGetWidth(image); 
    size_t imageH = CGImageGetHeight(image); 
    size_t picSize = pow2roundup((imageW > imageH) ? imageW : imageH); 

    GLubyte *textureData = (GLubyte *) malloc(picSize * picSize << 2); 
    CGContextRef imageContext = CGBitmapContextCreate(textureData, picSize, picSize, 8, picSize << 2, CGImageGetColorSpace(image), kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big); 

    if (imageContext != NULL) { 
     CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, (CGFloat)imageW, (CGFloat)imageH), image);  
     glGenTextures(1, &textureId); 
     glBindTexture(GL_TEXTURE_2D, textureId); 

     // when texture area is small, bilinear filter the closest mipmap 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     // when texture area is large, bilinear filter the original 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     // the texture wraps over at the edges (repeat) 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, picSize, picSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

     GLenum err = glGetError(); 
     if (err != GL_NO_ERROR) 
      NSLog(@"Error uploading texture. glError: 0x%04X", err); 

     CGContextRelease(imageContext); 
    } 

    free(textureData); 

Dies scheint gut zu funktionieren, wenn das Bild 320x480 ist, aber es funktioniert nicht, wenn das Bild größer ist (zum Beispiel picSize = 2048).

Hier ist, was ich in der Debugger-Konsole erhalten:

Error uploading texture. glError: 0x0501 

Was ist der Sinn dieser Fehler? Was ist die beste Problemumgehung?

Antwort

7

Haben Sie nicht einfach die maximale Texturgröße erreicht? Der Fehlercode ist GL_INVALID_VALUE finden Sie in der glTexImage2D docs:

GL_INVALID_VALUE is generated if width or height is less than 0 or greater than 2 + GL_MAX_TEXTURE_SIZE , or if either cannot be represented as 2k+2(border) for some integer value of k .

iPhone nicht Texturen größer als 1024 Pixel unterstützen. Die Problemumgehung besteht darin, das Bild in mehrere Texturen aufzuteilen.

+0

Klingt wie eine wahrscheinliche Antwort als meine ... – Hexagon

1

Vielleicht haben Sie einfach nicht mehr genügend Arbeitsspeicher - haben Sie überprüft, ob der von malloc() zurückgegebene Wert nicht NULL ist?
(dies könnte erklären, 0x0501 zu bekommen, was GL_INVALID_VALUE ist).

Verwandte Themen