2011-12-23 1 views
10

Я делаю приложение iPhone с OpenGL ES 2.0 с помощью GLKit. Я использую GLKTextureLoader для синхронного загрузки текстур.GLKTextureLoader сбой при загрузке определенной текстуры в первый раз, но второй раз завершается

Проблема в том, что для определенной текстуры она не может загрузить ее в первый раз. Он дает эту ошибку:

The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)

Для этого кода ошибки, документация яблоко говорит следующее:


GLKTextureLoaderErrorUncompressedTextureUpload 
An uncompressed texture could not be uploaded. 
Available in iOS 5.0 and later. 
Declared in GLKTextureLoader.h. 

(не очень много).

Могу ли я пытаться загрузить текстуру, в то время как контекст opengl находится в каком-то занятом состоянии или что-то в этом роде?

Примечания:

  • Перед тем, как загрузить эту текстуру я загрузить другие текстуры и те работы с первой попытки. Кроме того, тот же самый файл текстуры будет загружаться ок во второй попытке.
  • Должно быть достаточно свободной видеопамяти, так как перед этим я имею только пару текстур.
  • Текстура - несжатый PNG с альфой, но я также пробовал с TGA (24 бит & 32bit) без везения.

Любые идеи приветствуются, благодаря

EDIT:

Подробнее:

  • контекст OpenGL разделяется между всеми моими экранами. Я делаю это, чтобы мои шейдеры и текстуры загружались между экранами.

  • проблема выше бывает, когда я иду на свой второй экран. На первом экране я рисую текстурированные вещи без проблем (другие текстуры).

  • Проблема выше возникает, когда я загружаю свой контент (игровые сущности) в игровой мир. Каждый объект пытается загрузить текстуру. У меня есть простая система кэширования, которая загружает текстуру только один раз, а затем возвращает один и тот же идентификатор для всех других объектов. Я загружаю объекты синхронно одним способом. Первый объект не загружает текстуру, а затем второй и успешно, а затем третий получает кешированный идентификатор.

  • Я вызываю метод сущности загрузки в viewDidAppear, и я попытался добавить спать в течение 2 секунд, прежде чем загружать любые объекты, но ничего не изменилось.

EDIT:

код Texture загрузки:


- (GLKTextureInfo *)loadTextureAtPath:(NSString*)path ofType:(NSString*)type withKey:(NSString *)key 
{ 
    GLKTextureInfo* tex; 

    tex = [self textureWithKey:key]; 
    if (tex) 
     return tex; 

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithBool:NO], 
           GLKTextureLoaderOriginBottomLeft, 
           nil]; 

    NSError * error;  
    NSString *bundlepath = [[NSBundle mainBundle] pathForResource:path ofType:type]; 

    tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&error]; 
    if (tex == nil) 
     DLOG_LOCAL(@"Error loading texture: %@", [error localizedDescription]);     
    else 
     [textures setObject:tex forKey:key]; 

    return tex; 
} 


+0

Вы говорите, что загружаете другие текстуры до проблемного - все это (в том числе и то, что не удается) в том же методе? если нет, вполне возможно, что текущий контекст gl не был установлен. –

+0

благодарит за комментарий. Я добавил дополнительную информацию к вопросу –

+0

hmm вы загружаете текстуры (а не только сущности) синхронно с чем-то вроде: + (GLKTextureInfo *) textureWithContentsOfFile: (NSString *) Параметры файла: (NSDictionary *) textureOperations error: (NSError **) outError? –

ответ

31

Я также получал

The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.) 

при загрузке текстуры поздно во время выполнения в то время как несколько предыдущих текстур были успешно загружены ближе к запуску. Я был в состоянии решить эту проблему, вставив следующую строку кода перед тем на GLKTextureLoader вызов:

NSLog(@"GL Error = %u", glGetError()); 

Конечно, GL докладывал об ошибке, но не требует от меня обратиться к ошибке для того, чтобы GLKTextureLoader работать. Простого получения GL-ошибки было достаточно.

+0

Да, это серьезная ошибка в коде Apple. Кто-то не думал должным образом, и они решили вернуть «сбой», если в глобальном состоянии GL возникли ошибки, вместо того, чтобы писать 1-строчную проверку, была ли она уже установлена ​​при входе в их метод :( – Adam

+0

Спасибо Я провел несколько дней с этой проблемой случайных отсутствующих текстур. – shelll

+0

+1! Работал и на меня. Я разрабатываю Xcode5 для развертывания на устройстве 6.1. Похоже, если у OpenGL есть какая-либо существующая ошибка, это просто приведет к тому, что GLKTextureLoader не будет попытайтесь загрузить текстуру (что ... хорошо ... я в порядке). –

1

Я столкнулся с той же проблемой.Я не совсем уверен, почему это произошло точно так же, как оказалось, что одновременно происходит несколько файловых операций. Например, выполнение загрузки файла (для данных модели) прямо ПОСЛЕ использования загрузчика текстур в первый раз вызовет ошибку 8. Я исправил его в своей программе, выполнив некоторые другие операции после вызова загрузчика текстуры в первый раз.

+0

Спасибо. Я исследую это. Прямо сейчас я в отпуске ... но я попробую это после 1 января :) –

+0

Я изучил это решение. Я убедился, что у меня нет одновременного чтения файлов, но проблема все еще была. Спасибо, в любом случае. –

4

Я получил это, когда добавляю текстуры перед загрузкой текстуры. Просто перемещался glEnable (GL_TEXTURE) после загрузки и проблема исчезла.

+0

Спасибо. Обязательно попробую :) –

+0

Я просто понял, что являюсь проектом OpenGL ES 2.0. Я не могу использовать GL_TEXTURE, поэтому я не знаю, соответствует ли ваш ответ. В этом случае все зависит от шейдера, чтобы определить, рисую ли текстурные треугольники или нет. –

+0

Это исправило мою ошибку 8 - спасибо Brett !!! Хороший улов. – Cthutu

2

Хорошо, я попробую это снова, когда снова столкнулся с ошибкой. Похоже, что если есть еще один glError, который не был обработан, тогда у вас возникнут проблемы с загрузкой текстуры в первый раз.

Прежде чем загружать эту текстуру, которая не работает, проверьте наличие glError и затем отследите, где эта ошибка. Или вы можете захватить рамку opengl до того, где будет загружена текстура, и посмотреть, будет ли предшествовать glError. Это произошло со мной одновременно, когда я столкнулся с ошибкой 8, и оба раза эта ошибка исчезла, как только я исправил ошибку, которая произошла ранее.

+0

интересно .. Постараюсь в понедельник, когда я получу на работу :) –

0

У меня была очень похожая проблема, и она была решена путем вызова setCurrentContext.

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
[EAGLContext setCurrentContext:self.context]; 
3

Возможно, вы решили это, но используете ли вы несколько контекстов? возможно, вы должны асинхронно загружать текстуру вместе с sharegroup.

поэтому вместо использования tex = [GLKTextureLoader textureWithContentsOfFile: опции пучка: параметры error: & ошибка];

использовать что-то вроде:

GLKTextureLoader *textureloader = [[GLKTextureLoader alloc] initWithSharegroup:self.eaglContext.sharegroup]; 
GLKTextureInfo *myTexture; 
[textureloader textureWithCGImage:_currentForegroundImage.CGImage options:nil queue:nil completionHandler:^(GLKTextureInfo *textureInfo, NSError *error) { 
     myTexture = textureInfo; 
     if(error) { 
      // log stuff 
     } 
     // do something 
}]; 
1

Я также обнаружил, что вы получите эту ошибку при попытке создать 2D текстуры с изображением большего, чем максимальный размер текстуры. Для максимального размера вы можете увидеть Apple's Open GL ES Platform Notes, хотя они не отображаются корректно для более новых устройств, поэтому лучший вариант - get the value directly.

3

У меня была аналогичная проблема. Это было вызвано текстурой с шириной/высотой, не имеющей силы 2. Не удалось выполнить GLKTextureLoader при загрузке этого и следующих изображений. Проверка glGetError() после каждой загрузки текстуры выявила нарушителей спокойствия :-).

Смежные вопросы