2

テクスチャをロードするために使用するコードは次のとおりです。画像は 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) には失敗します。

Debugger Console に表示される内容は次のとおりです。

Error uploading texture. glError: 0x0501

このエラーの意味は何ですか? 最善の回避策は何ですか?

4

3 に答える 3

8

単純にテクスチャ サイズの上限に達していませんか? エラー コードはGL_INVALID_VALUEglTexImage2D ドキュメントを参照してください。

GL_INVALID_VALUEwidth またはheightが より小さい0か大きい場合、またはいずれかがの整数値 2 + GL_MAX_TEXTURE_SIZEとして表現できない場合に 生成されます。2k+2(border)k

iPhone は、1024 ピクセルを超えるテクスチャをサポートしていません。回避策は、画像をいくつかのテクスチャに分割することです。

于 2009-05-15T07:51:42.987 に答える
2

単純にメモリが不足している可能性があります。malloc() から返された値が NULL でないことを確認しましたか?
(これは GL_INVALID_VALUE である 0x0501 を取得することを説明できます)。

于 2009-05-15T07:41:35.710 に答える
1

で同じ種類の問題も経験しGLKitBaseEffectましたが、メモリの問題のようです (Hexagon が提案したように)。これを修正するには、手動のテクスチャ リリース コールを追加する必要がありました。

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

詳細については、このスレッドを参照してください: GLKTextureLoader によって割り当てられたテクスチャ (GLKTextureInfo オブジェクト) を解放します。

于 2013-07-17T13:44:42.303 に答える