2009-05-15 7 views
2

다음은 텍스처를로드하는 데 사용하는 코드입니다. image는 CGImageRef입니다. 이 코드를 사용하여 이미지를로드 한 후 glDrawArrays()를 사용하여 이미지를 그립니다.iPhone에서 OpenGL ES로 큰 텍스처를로드 할 때 glError : 0x0501?

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

이것은 화상이 320 × 480 인 경우에 잘 작동 할 것으로 보이지만 이미지 (예 picSize = 2,048)보다 큰 경우는 실패한다.

Error uploading texture. glError: 0x0501 

이 오류의 의미는 무엇입니까 : 여기

내가 디버거 콘솔에서 무엇을 얻을? 가장 좋은 해결 방법은 무엇입니까?

답변

7

최대 텍스처 크기 한도에 도달하지 않았습니까? 오류 코드는 GL_INVALID_VALUE되면, glTexImage2D docs를 참조하십시오

GL_INVALID_VALUE is generated if width or height is less than 0 or greater than 2 + GL_MAX_TEXTURE_SIZE , or if either cannot be represented as 2k+2(border) for some integer value of k .

아이폰이 1024 픽셀보다 큰 텍스처를 지원하지 않습니다. 해결 방법은 이미지를 여러 텍스처로 분할하는 것입니다.

+0

소리가 내 것보다 더 답이 좋아요. – Hexagon

1

아마도 메모리가 부족합니다. malloc()에서 반환 된 값이 NULL이 아닌지 확인 했습니까?
(이 경우 GL_INVALID_VALUE 인 0x0501을 가져올 수 있음).

1

또한 GLKitBaseEffect과 같은 종류의 문제가 발생했습니다. 메모리 문제 (Hexagon 제안)가있는 것으로 보입니다.

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

이 이상이 스레드를 참조하십시오 : Release textures (GLKTextureInfo objects) allocated by GLKTextureLoader을이 문제를 해결하려면, 나는 수동 텍스처 릴리스 호출을 추가했다.

관련 문제