在视图上显示纹理图像时出现问题,在iphone模拟器上工作正常但在设备上没有

时间:2010-03-15 13:01:00

标签: iphone opengl-es textures

我试图通过将图像转换为纹理然后在UIView上显示来在iphone上显示图像。

这是从UIImage对象加载图像的代码

- (void)loadImage:(UIImage *)image mipmap:(BOOL)mipmap texture:(uint32_t)texture
{

 int width, height;
 CGImageRef cgImage;
 GLubyte *data;
 CGContextRef cgContext;
 CGColorSpaceRef colorSpace;
 GLenum err;

 if (image == nil)
 {
  NSLog(@"Failed to load");
  return;
 }

 cgImage = [image CGImage];
 width = CGImageGetWidth(cgImage);
 height = CGImageGetHeight(cgImage);
 colorSpace = CGColorSpaceCreateDeviceRGB();

 // Malloc may be used instead of calloc if your cg image has dimensions equal to the dimensions of the cg bitmap context
 data = (GLubyte *)calloc(width * height * 4, sizeof(GLubyte));
 cgContext = CGBitmapContextCreate(data, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
 if (cgContext != NULL)
 {
  // Set the blend mode to copy. We don't care about the previous contents.
  CGContextSetBlendMode(cgContext, kCGBlendModeCopy);
  CGContextDrawImage(cgContext, CGRectMake(0.0f, 0.0f, width, height), cgImage);

  glGenTextures(1, &(_textures[texture]));
  glBindTexture(GL_TEXTURE_2D, _textures[texture]);

  if (mipmap)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  else
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

  if (mipmap)
   glGenerateMipmapOES(GL_TEXTURE_2D);

  err = glGetError();
  if (err != GL_NO_ERROR)
   NSLog(@"Error uploading texture. glError: 0x%04X", err);

  CGContextRelease(cgContext);
 }

 free(data);
 CGColorSpaceRelease(colorSpace);
}

我目前面临的问题是这个代码工作得非常好并且在模拟器上显示图像,就像在调试器上看到的设备一样,显示错误,即错误上传纹理。 glError:0x0501

任何想法如何解决这个错误.... thnx提前4个解决方案

1 个答案:

答案 0 :(得分:0)

如果纹理具有两个维度的非幂,则需要使用EXT_texture_rectangle。 (GL_TEXTURE_RECTANGLE_EXT而不是GL_TEXTURE_2D和不同的纹理坐标)。

如果这没有帮助,最好知道哪一行导致GL_INVALID_VALUE(0x0501)错误。