3.6、纹理压缩
苹果建议使用GPU所支持的纹理压缩方式。纹理压缩最小化了当要保存相对高细节级别的纹理时保存纹理缓存所需要的内存的数量。截止到iOs5,所有的iOs设备都支持PowerVR纹理压缩(PVRTC) 格式。但是,这无法保证将来的苹果硬件还会支持PVRTC格式。因此,在使用它之前,程序有必要检查非标准OpenGL ES的GL_IMG_texture_compression_pvrtc 扩展的存在性。苹果建议使用下面的C函数来检查这个扩展:
BOOL CheckForExtension (NSString * searchName ) {
// For best results, extensionsNames should be stored so that it
// does not need to be recreated on each invocation.
NSString *extensionsString = [NSString stringWithcstring:glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding];
NSArray *extensionsNames = [ xtensionsString componentsSeparatedByString:@" "];
return [extensionsNames containsObject: searchName ];
一个程序可以使用下面形式的代码来检查是否支持纹理压缩。
if( CheckForExtension(@"GL_IMG_texture_compression_pvrtc") ) {
// The extension is available.
}
}
作为iOS SDK的一部分,苹果提供了命令行实用工具texturetool。texturetool 工具会将“.png”图像转换为能够直接加载到压缩的纹理缓存的格式,这个网址:http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TextureTool/ TextureTool.html做了介绍。GLKit 的GLKTextureLoader类也支持压缩的纹理。
用来初始化压缩纹理的图像的尺寸需要是2的幂,同时它们还需要是正方形。一个256X256像素的图像可以用在一个压缩纹理缓存中,但是一个64X128像素的图像却不能。
苹果为使用压缩纹理提供了示例代码,地址为: http://developer.apple.com/iphone/
3.7小结
本章几乎提供了实现一个2D硬件加速的基于sprite的游戏所需的全部信息。一个sprite仅仅是一个可以移动的包含透明像素的图像,例子OpenGLES_Ch3_3甚至演示了在显示器上来回移动纹理的一个方法,同时间接演示了由纹理取样产生的失真效果。苹果在http://developer.apple.com/iphone/ibrary/samplecode/GLImageProcessing网址提供的示例代码中显示了如何用多重纹理来实现强大的图像处理效果,例如对图像进行亮度、对比度、饱和度、色度和锐度调整。这些例子提示了商业图像处理应用之下的苹果硬件加速Core Image技术的实现。
截止到现在,所有的例子程序都是使用3D技术绘制简单的2D三角形。第2章介绍了在一个iOs设备上显示任何基于OpenGLES的图像所需的所有步骤。第3章扩展了第2章的例子实现在三角形上显示多重纹理。第4章会在整个三维上深入探讨渲染。灯光是在一个二维屏幕上显示出三维假象的关键。