2011-08-27 59 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的圖像