美文网首页OpenGL ES
第三节—关于GLKit中的纹理

第三节—关于GLKit中的纹理

作者: L_Ares | 来源:发表于2020-09-15 00:12 被阅读0次

    本文为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: ;
    

    相关文章

      网友评论

        本文标题:第三节—关于GLKit中的纹理

        本文链接:https://www.haomeiwen.com/subject/pacxyktx.html