这是我用来加载纹理的代码。图像是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
这个错误是什么意思?什么是最好的解决方法?
答案 0 :(得分:8)
您是不是只是达到最大纹理大小限制?错误代码为GL_INVALID_VALUE
,请参阅glTexImage2D docs:
如果GL_INVALID_VALUE
生成
width
或height
小于0
或更高 比2 + GL_MAX_TEXTURE_SIZE
,或者如果 要么不能表示为2k+2(border)
表示某个整数值k
。
iPhone不支持大于1024像素的纹理。解决方法是将图像分割成几个纹理。
答案 1 :(得分:2)
也许你的内存不足 - 你验证了malloc()返回的值是不是NULL? (这可以解释得到0x0501,即GL_INVALID_VALUE)。
答案 2 :(得分:1)
我也遇到了与GLKitBaseEffect
相同的问题,它似乎是一个记忆问题(正如Hexagon所提出的那样)。为了解决这个问题,我不得不添加手动纹理释放调用:
GLuint name = self.texture.name;
glDeleteTextures(1, &name);
有关详情,请参阅此主题:Release textures (GLKTextureInfo objects) allocated by GLKTextureLoader。