10

GLKitを使用してOpenGLES2.0でiPhoneアプリケーションを作成しています。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コンテキストがビジー状態などのときに、テクスチャを読み込もうとしていませんか?

ノート:

  • このテクスチャをロードする前に、他のテクスチャをロードします。これらは最初の試行で機能します。また、まったく同じテクスチャファイルが2回目の試行で正常にロードされます。
  • この前にロードされたテクスチャは2、3しかないので、十分な空きビデオメモリがあるはずです。
  • テクスチャはアルファ付きの非圧縮PNGですが、TGA(24ビットおよび32ビット)でも試してみましたが、うまくいきませんでした。

どんなアイデアでも大歓迎です、ありがとう

編集

より詳しい情報:

  • openglコンテキストは、すべての画面で共有されます。これは、シェーダーとテクスチャを画面間でロードしたままにするために行っています。

  • 上記の問題は、2番目の画面に移動したときに発生します。最初の画面では、問題なくテクスチャを描画します(他のテクスチャも問題ありません)。

  • 上記の問題は、ゲームの世界でコンテンツ(ゲームエンティティ)をロードするときに発生します。各エンティティはテクスチャを読み込もうとします。テクスチャを一度だけロードしてから、他のすべてのエンティティに対して同じIDを返す単純なキャッシュシステムがあります。1つの方法で、エンティティを同期的にロードしています。最初のエンティティはテクスチャのロードに失敗し、次に2番目のエンティティが来て成功し、3番目のエンティティがキャッシュされたIDを取得します。

  • でloadentitiesメソッドを呼び出していますがviewDidAppear、エンティティをロードする前に2秒間スリープを追加しようとしましたが、何も変更されていません。

編集:

テクスチャ読み込みコード:


- (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;
}


4

8 に答える 8

32

私も得ていました

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

以前のいくつかのテクスチャが起動の近くで正常にロードされていたときに、実行時間の後半にテクスチャをロードしたとき。呼び出しの前に次のコード行を挿入することで、問題を解決することができました。GLKTextureLoader

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

案の定、GLはエラーを報告していましたが、機能するためにエラーに対処する必要はありませんでしたGLKTextureLoader。GLエラーを取得するだけで十分でした。

于 2012-12-19T08:55:14.543 に答える
4

テクスチャをロードする前にテクスチャを有効にしたときにこれを取得しました。ロード後にglEnable(GL_TEXTURE)を移動するだけで、問題は解決しました。

于 2012-02-08T20:09:50.810 に答える
3

これは解決したかもしれませんが、複数のコンテキストを使用していますか?たぶん、sharegroupと非同期でテクスチャをロードする必要があります。

したがって、tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&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
}];
于 2012-09-12T02:13:41.337 に答える
3

私も同様の問題を抱えていました。これは、2の累乗ではなく、幅/高さのテクスチャが原因で発生しました。GLKTextureLoaderは、この画像と次の画像の読み込みに失敗しました。各テクスチャのロード後にglGetError()をチェックすると、問題の原因が明らかになりました:-)。

于 2013-03-27T16:26:46.540 に答える
2

もう一度エラーが発生したので、これをもう一度試してみます。処理されていない他のglErrorがある場合、最初にテクスチャをロードする際に問題が発生するようです。

失敗したテクスチャをロードする前に、glErrorを確認してから、そのエラーが発生した場所を追跡します。または、テクスチャがロードされる前にopenglフレームをキャプチャして、glErrorが前にスローされているかどうかを確認できます。これは、エラー8が発生したときの両方で発生しました。また、以前に発生したエラーを修正すると、このエラーは両方とも消えました。

于 2012-03-09T16:16:43.960 に答える
1

私は同じ問題に遭遇しました。複数のファイル操作が同時に行われているように見えた以外に、なぜそれが発生したのか正確にはわかりません。たとえば、テクスチャローダーを初めて使用した直後に(モデルデータの)ファイルロードを実行すると、エラー8がポップアップ表示されます。テクスチャローダーが最初に呼び出された後に他の操作を実行することで、プログラムで修正しました。

于 2011-12-29T21:19:33.957 に答える
1

また、最大テクスチャサイズよりも大きい画像で2Dテクスチャを作成しようとすると、このエラーが発生することがわかりました。最大サイズについては、AppleのOpen GL ESプラットフォームノートを参照してください。ただし、新しいデバイスでは正しく表示されないため、値を直接取得することをお勧めします。

于 2012-09-18T19:57:42.403 に答える
0

私は非常によく似た問題を抱えていましたが、setCurrentContextを呼び出すことで解決しました。

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:self.context];
于 2012-03-25T22:54:57.090 に答える