在OpenGL ES iPhone中加载两个图像的非幂函数

在OpenGL ES iPhone中加载两个图像的非幂函数,iphone,opengl-es,2d,textures,Iphone,Opengl Es,2d,Textures,有没有人知道一种有效的方法可以将纹理加载到大小不是二次方的OpenGL ES中?我是OpenGL新手,我正在为iPhone开发2D游戏,我已经制作了很多纹理。返回并将所有纹理的大小调整为二次方将是一项非常繁琐的工作。出于性能原因,最好将所有精灵放入一个atlas中。atlas是一个大纹理,包含所有精灵。有一些工具可以自动化这个过程。例如,TexturePacker: 根据您使用的技术,您可能必须解析纹理打包器的输出以获得UV偏移 unsigned int NextPOT(unsigned int

有没有人知道一种有效的方法可以将纹理加载到大小不是二次方的OpenGL ES中?我是OpenGL新手,我正在为iPhone开发2D游戏,我已经制作了很多纹理。返回并将所有纹理的大小调整为二次方将是一项非常繁琐的工作。

出于性能原因,最好将所有精灵放入一个atlas中。atlas是一个大纹理,包含所有精灵。有一些工具可以自动化这个过程。例如,TexturePacker:

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

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的图像

看,我很确定你指的是2的幂,很抱歉这么迂腐。没问题。感谢您指出这一点。较新的iOS设备(iPhone 3G S及更高版本)通过扩展支持OpenGL ES 1.1中两种纹理的非增强功能,或在2.0中本机支持。正如我在回答中所描述的,你不需要重做这些纹理就可以在这些设备上使用它们。顺便说一句:性能下降的原因是iphone上的纹理开关非常昂贵。您希望拥有尽可能少的纹理开关。这里可以找到一点背景:非常感谢。这很有帮助。如果您使用线性混合,这种方法将使精灵与atlas中的相邻纹理混合,而不是通过类似CLAMP的方式,这可能是您想要的精灵。当你开始缩小规模时,要记住一些东西。