2011-08-27 57 views
2

有没有人知道一种有效的方式来加载纹理到OpenGL ES中,其尺寸不是2的幂数?我是OpenGL的新手,我正在为iPhone开发2D游戏,并且我已经制作了很多纹理。将我的所有纹理重新调整到2的幂是非常繁琐的工作。在OpenGL ES中加载非幂次的图像iPhone

+0

参见http://stackoverflow.com/questions/3014352/fullscreen-texture-iphone -opengl-es –

+0

我很确定你的意思是两个人的权力,对于那个迂腐的人很抱歉。 –

+0

这没有问题。谢谢你指出。 – Marc

回答

3

由于性能的原因,最好将所有的精灵都放到地图集中。地图集是一个很大的纹理,包含你所有的精灵。有一些工具可以使这个过程自动化。例如TexturePacker:http://www.texturepacker.com/

根据您使用的是哪种技术,您可能必须解析纹理打包器的输出以获取UV偏移。

+1

btw .:性能损失的原因是因为iPhone上的纹理开关非常昂贵。您希望尽可能少地使用纹理切换。 有一点背景可以在这里找到:http://www.imgtec.com/powervr/insider/docs/PowerVR%20Series5%20Graphics.SGX%20architecture%20guide%20for%20developers.1.0.8.External.pdf –

+0

非常感谢你。这帮了很多。 – Marc

+0

如果您使用的是线性混合,这种方法会导致精灵与它们的相邻像素_在atlas_中混合,而不是像CLAMP那样,这可能是您想要的精灵。当你开始缩小时需要记住一些事情。 –

0
unsigned int NextPOT(unsigned int x) 
{ 
    x = x - 1; 
    x = x | (x >> 1); 
    x = x | (x >> 2); 
    x = x | (x >> 4); 
    x = x | (x >> 8); 
    x = x | (x >>16); 
    return x + 1; 
} 

unsigned int width = CGImageGetWidth(image.CGImage); 
unsigned int height = CGImageGetHeight(image.CGImage); 
unsigned int Width_POT = NextPOT(width); 
unsigned int Height_POT = NextPOT(height); 
CGRect Rect = CGRectMake(0,0,width, height); 
CGSize size   = CGSizeMake(Width_POT, Height_POT); 
UIGraphicsBeginImageContext(size); 
[image drawInRect:Rect]; 
UIImage* result  = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

图像是源图像大小,其是2非POW,结果是可以传递到OpenGL的图像