簡體   English   中英

glError:在iPhone上加載OpenGL ES的大紋理時為0x0501?

[英]glError: 0x0501 when loading a large texture with OpenGL ES on the iPhone?

這是我用來加載紋理的代碼。 圖像是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

這個錯誤是什么意思? 什么是最好的解決方法?

你不是只是達到最大紋理大小限制? 錯誤代碼為GL_INVALID_VALUE ,請參閱glTexImage2D文檔

如果widthheight小於0或大於2 + GL_MAX_TEXTURE_SIZE ,或者如果某個整數值為k ,則無法將其表示為2k+2(border) ,則生成GL_INVALID_VALUE

iPhone不支持大於1024像素的紋理。 解決方法是將圖像拆分為多個紋理。

也許你只是內存不足 - 你驗證了malloc()返回的值是不是NULL?
(這可以解釋為獲得0x0501,即GL_INVALID_VALUE)。

我也遇到了與GLKitBaseEffect相同的問題,它似乎是一個內存問題(正如Hexagon所提出的)。 要解決這個問題,我不得不添加手動紋理釋放調用:

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

有關更多信息,請參閱此主題: 釋放由GLKTextureLoader分配的紋理(GLKTextureInfo對象)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM