glError: 0x0501 при загрузке большой текстуры с OpenGL ES на iPhone? - PullRequest
2 голосов
/ 15 мая 2009

Вот код, который я использую для загрузки текстуры. изображение является CGImageRef. После загрузки изображения с этим кодом, я в конечном итоге рисую изображение с помощью glDrawArrays ().

    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);

Кажется, что это нормально работает, когда изображение имеет размер 320x480, но не работает, когда изображение больше (например, picSize = 2048).

Вот что я получаю в консоли отладчика:

Error uploading texture. glError: 0x0501

Что означает эта ошибка? Какой лучший обходной путь?

Ответы [ 3 ]

8 голосов
/ 15 мая 2009

Разве вы не просто превышаете максимальный размер текстуры? Код ошибки GL_INVALID_VALUE, см. Документы glTexImage2D :

GL_INVALID_VALUE генерируется, если width или height меньше 0 или больше чем 2 + GL_MAX_TEXTURE_SIZE, или если либо не может быть представлен как 2k+2(border) для некоторого целочисленного значения k.

iPhone не поддерживает текстуры размером более 1024 пикселей. Обходной путь - разделить изображение на несколько текстур.

2 голосов
/ 15 мая 2009

Может быть, вам просто не хватает памяти - вы убедились, что значение, возвращаемое функцией malloc (), не равно NULL?
(это может объяснить получение 0x0501, то есть GL_INVALID_VALUE).

1 голос
/ 17 июля 2013

У меня тоже была такая же проблема с GLKitBaseEffect, похоже, проблема с памятью (как предложил Hexagon). Чтобы это исправить, мне пришлось добавить вызовы ручного освобождения текстуры:

GLuint name = self.texture.name;
glDeleteTextures(1, &name);

См. Эту ветку для получения дополнительной информации: Выпуск текстур (объектов GLKTextureInfo), выделенных GLKTextureLoader .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...