第三节—关于GLKit中的纹理
本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。
一、GLKTextureInfo
GLKTextureInfo
: 纹理信息。
它继承于NSObject
,并且实现了NSNSCopying
协议,其定义的常见的属性全部为readonly
(只读),下面介绍一下这些属性。
-
name
: OpenGL上下文中纹理的名称。GLuint
类型(无符号整型) -
width
: 加载纹理的宽度。GLuint
类型(无符号整型) -
height
: 加载纹理的高度。GLuint
类型(无符号整型) -
target
: 纹理绑定的目标。GLenum
类型(枚举类型) -
textureOrigin
: 加载纹理中的原点位置。GLKTextureInfoOrigin
类型(typedef的枚举类型,有三个枚举值,描述加载的图片纹理的坐标信息) -
alphaState
: 加载纹理中的alpha分量的状态。GLKTextureInfoAlphaState
类型(typedef的枚举类型,有三个枚举值,描述源图像中存储alpha信息的方式) -
containsMipmaps
: 加载的纹理是否包含mip贴图。BOOL
类型。
二、GLTextureLoader
GLTextureLoader
: 加载纹理。
它简化了从各种资源文件中加载纹理的处理。
1.初始化
(1). 初始化一个新的纹理加载到对象中
- (instancetype)initWithSharegroup:(EAGLSharegroup *)sharegroup;
(2). 初始化一个新的纹理加载对象
- (instancetype)initWithShareContext:(NSOpenGLContext *)context;
2.加载纹理
关于纹理的加载有两种可能。并且在GLKit
中,我们可以使用.png
和.jpg
这样格式的文件作为纹理图,因为在GLKit
的纹理加载过程中会做解压缩的操作,而使用纹理需要使用位图。这个解压缩的操作是利用CoreGraphic
完成的,如果不用GLKit
了,那么这个把压缩图片还原成位图的操作要自己实现。
<1>从文件中创建纹理
(1). 从文件同步加载2D纹理图像,并根据数据创建新的纹理。当操作正确完成时,会返回一个GLKTextureInfo(纹理信息对象),失败则会返回error信息或者nil:
+ (nullable GLKTextureInfo *)textureWithContentsOfFile: options: error: ;
(2). 从文件中异步加载2D纹理图像,并根据数据创建新的纹理。如果队列给NULL,会直接使用主队列。可以附带一个block块,完成其中操作。
- (void)textureWithContentsOfFile: options: queue: completionHandler: ;
<2>从URL创建纹理
(1). 从URL同步加载2D纹理图像,并根据数据创建新的纹理。
+ (nullable GLKTextureInfo *)textureWithContentsOfURL: options: error: ;
(2). 从URL异步加载2D纹理图像,并根据数据创建新的纹理。
- (void)textureWithContentsOfURL: options: queue: completionHandler: ;
<3>从内存中创建纹理
如果你的内存中本身已经有了这个图片,就可以直接从内存中加载。
(1). 从内存空间中同步加载2D纹理图像,并根据数据创建新的纹理。
+ (nullable GLKTextureInfo *)textureWithContentsOfData: options: error: ;
(2). 从内存空间中异步加载2D纹理图像,并根据数据创建新的纹理。
- (void)textureWithContentsOfData: options: queue: completionHandler: ;
<4>从CGImageRef创建纹理
(1). 从CGImageRef同步加载2D纹理图像,并根据数据创建新的纹理。
+ (nullable GLKTextureInfo *)textureWithCGImage: options: error: ;
(2). 从CGImageRef异步加载2D纹理图像,并根据数据创建新的纹理。
- (void)textureWithCGImage: options: queue: completionHandler: ;
<5>文件创建立方体纹理
(1). 从文件同步加载单个或者6张立体纹理图像,并根据数据创建新的纹理。
如果Files后面时NSArray
,则代表加载多张,如果是NSString
则代表加载单张。
面的顺序:右(+x),左(-x),上(+y),下(-y),前(+z),后(-z)。
如果你把自己放在立方体里面考虑的话,坐标系要用左手坐标系。
相反的,如果你把自己放在立方体外面观察立方体,坐标系要用右手坐标系。
如果使用的是单张立体纹理图像加载,立体图像纹理要分裂成六个部分的图像。高度= 6 *宽度,或宽度= 6 *高度 的单个图像文件。
但是为了减少提取图像数据的性能开销,建议直接使用NSArray
的。
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFiles: options: error: ;
(2). 从文件异步加载单个或者6张立体纹理图像,并根据数据创建新的纹理。
建议也是用NSArray
的方式,原因同上。
- (void)cubeMapWithContentsOfFiles: options: queue: completionHandler: ;
<6>URL创建立方体纹理
(1). 从URL同步加载立体纹理图像,并根据数据创建新的纹理。
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfURL: options: error: ;
(2). 从URL异步加载立体纹理图像,并根据数据创建新的纹理。
- (void)cubeMapWithContentsOfURL: options: queue: completionHandler: ;