大家都知道,OpenGL ES对纹理的尺寸有限制,就是长和宽都必须是2的整数次幂。(实际上OpenGL都有此限制,但有一些扩展可以解决此问题)。因此处理方案有两种:
- 将纹理尺寸限制为2的整数次幂。比如,我有一个480×320的背景图案,我可以用Photoshop将画布设置为512×512,在纹理映射时只使用480×320部分。当然我也可以将多个图案合成在一个纹理中,在纹理映射时根据图案的位置进行映射。
- 仍然使用正常的图像尺寸,但在使用时进行转换。下面是源代码:
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 ; } |