大家都知道,OpenGL ES对纹理的尺寸有限制,就是长和宽都必须是2的整数次幂。(实际上OpenGL都有此限制,但有一些扩展可以解决此问题)。因此处理方案有两种:


  1. 将纹理尺寸限制为2的整数次幂。比如,我有一个480×320的背景图案,我可以用Photoshop将画布设置为512×512,在纹理映射时只使用480×320部分。当然我也可以将多个图案合成在一个纹理中,在纹理映射时根据图案的位置进行映射。
  2. 仍然使用正常的图像尺寸,但在使用时进行转换。下面是源代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        // 首先调整纹理的长和宽为2的整数次幂        
        if( (_width != 1) && (_width & (_width - 1)) )
        {
                i = 1;
                while((sizeToFit ? 2 * i : i) < _width)
                        i *= 2;
                _width = i;
        }

        if( (_height != 1) && (_height & (_height - 1)) )
        {
                i = 1;
                while((sizeToFit ? 2 * i : i) < _height)
                        i *= 2;
                _height = i;
        }

        // 如果调整后的图像尺寸大于最大纹理尺寸(1024),那么需要缩小
        while((_width &gt; kMaxTextureSize) || (_height &gt; kMaxTextureSize))
        {
            _width /= 2;
            _height /= 2;
            transform = CGAffineTransformScale(transform, 0.5, 0.5);
            imageSize.x *= 0.5;
            imageSize.y *= 0.5;
        }