Objective-c:将纹理加载到OpenGL的最有效方法

时间:2012-07-05 15:38:43

标签: objective-c ios opengl-es core-graphics

目前我使用Image I / O在iOS中加载纹理,并使用Core Graphics提取其图像数据。然后我可以将图像数据发送到OpenGL,如下所示:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->width, texture->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->imageData);

问题是Core Graphics部分非常慢,我需要设置和绘制Core Graphics只是为了提取图像数据......我不想在屏幕上显示它。在iOS中提取图像数据必须有更有效的方法吗?...

这是我的代码:

...
myTexRef = CGImageSourceCreateWithURL((__bridge CFURLRef)url, myOptions);
...
MyTexture2D* texture;

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

void *imageData = malloc( tileSize.width * tileSize.height * 4 );

CGContextRef imgContext = CGBitmapContextCreate( imageData, tileSize.width, tileSize.height, 8, 4 * tileSize.width, colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease( colorSpace );
CGContextClearRect( imgContext, CGRectMake( 0, 0, tileSize.width, tileSize.height ) );
CGContextTranslateCTM( imgContext, 0, 0 );
...
CGImageRef tiledImage = CGImageCreateWithImageInRect (imageRef, tileArea);
CGRect drawRect = CGRectMake(0, 0, tileSize.width, tileSize.height);

// *** THIS CALL IS REALLY EXPENSIVE!
CGContextDrawImage(imgContext, drawRect, tiledImage);

CGImageRelease(tiledImage);

// TamTexture2D takes the ownership of imageData and will be responsible to free it
texture = new MyTexture2D(tileSize.width, tileSize.height, imageData);

CGContextRelease(imgContext);

2 个答案:

答案 0 :(得分:1)

如果您正在为iOS 5及更高版本开发,GLKTextureLoader是您正在寻找的内容:

答案 1 :(得分:1)

GLKTextureLoader比使用CG慢几个数量级。

我已将此记录为Apple DTS的一个错误,然后将其重新调整为#34;是的,我们知道,不在乎,不会修复它。如果你想快速加载纹理,你应该使用CoreGraphics" (几乎是那个措辞)

glTexImage2D非常快,如果你给它CGContext *方法为你创建的原始缓冲区/允许你传入。当然假设你得到RGBA / ARGB / etc颜色空间正确。

cgcontextDrawImage也非常快。我的猜测是,它花时间在网上加载你的数据......