第四节—关于GLKView

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

    本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。

    最开始已经说过了,OpenGL ES并没有提供窗口的创建,这也是它可以跨平台不受影响的原因,想要显示内容,就要根据不同的平台使用不同的方法来自己创建显示界面,在GLKit框架中,我们使用GLKView来创建这个绘制界面,来显示绘制的图案。

    GLKView继承于UIView,并实现NSCoding协议来完成归档。

    一、初始化

    context参数就是我们的上下文,它依然是用来保存我们的OpenGL ES的状态机,通过初始化方法,我们可以得到一个新的GLKView视图。

    - (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;
    

    二、代理

    如果GLKView对象已经子类化并且还实现了这个协议,那么这个方法是不会调用的,没有子类化的时候是要调用的。

    注意,这个是@required,所以是你必须实现的代理。

    - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
    

    三、帧缓存区对象设置

    4个帧缓存区对象全都是typedefGLint类型枚举值的枚举类型。分别设置如下对象:

    1. GLKViewDrawableColorFormat : 颜色渲染缓存格式
    枚举值可选:

    GLKViewDrawableColorFormatRGBA8888
    GLKViewDrawableColorFormatRGB565
    GLKViewDrawableColorFormatSRGBA8888

    一般情况下,选择rgba都占8位通道的就可以,也就是第一个。

    2. GLKViewDrawableDepthFormat : 深度渲染缓存格式
    枚举值可选:

    GLKViewDrawableDepthFormatNone
    GLKViewDrawableDepthFormat16
    GLKViewDrawableDepthFormat24

    没用到深度缓存区就选第一个,用到了,不知道多大合适,建议选择第三个。

    3. GLKViewDrawableStencilFormat : 模版渲染缓存格式
    枚举值可选:

    GLKViewDrawableStencilFormatNone
    GLKViewDrawableStencilFormat8

    没用到模版缓存区就选第一个,用到了就选第二个,这个就很显而易见。

    4. GLKViewDrawableMultisample : 多重采样缓存格式

    多采样提高了输出图像的质量,但可能需要更多的内存和图像处理来实现这一点。所以你可以自己选择能够提供所需的图像质量和性能的设置。

    枚举值可选:

    GLKViewDrawableMultisampleNone
    GLKViewDrawableMultisample4X

    用不到多重采样就选第一个,用到了就选第二个。

    四、GLKView绘制视图内容需用到

    1. 绘制视图内容时需要用到的OpenGL ES上下文

    @property (nonatomic, retain) EAGLContext *context;
    

    2. 将底层的framebuffer(帧缓冲区)对象绑定到OpenGL ES

    就是说你的这个GLKView视图是和这个帧缓冲区要绑定在一起,因为程序最后要显示的内容都是通过帧缓冲区来设置的。

    - (void)bindDrawable;
    

    3. GLKView视图是否要响应SetNeedsDisplay方法

    默认是true。就是说你的这个GLKView视图要不要响应setNeedsDisplay,如果响应的话,绘制方法就会在下一个绘制周期中调用。如果不响应的话,那么这个视图在下一个绘制周期的时候永远都不会响应这个setNeedsDisplay方法。

    有一个特殊情况就是enableSetNeedsDisplay在与GLKViewController一起使用的时候,他自动会设置成false

    @property (nonatomic) BOOL enableSetNeedsDisplay;
    

    4. 立即重绘视图内容

    如果你把enableSetNeedsDisplay设置为了false,那么在你想重绘的时候就要调用这个方法了。

    GLKViewController上面也说了,自动就会变成false,所以controller就是通过这个方法来调用绘制。

    这个方法在你不使用GLKViewController时也可以使用,或者你在显示循环的自定义控件中使用。

    - (void)display;
    

    5. 绘制视图结果中得到的新图像对象

    首先它是readonly的,也就是说你不能设置GLKView的这个属性,你只能拿它的图片用,而且它不可以在draw方法中调用。

    @property (readonly, strong) UIImage *snapshot;
    

    五、帧缓存区属性

    就是渲染空间的宽高。都以像素位单位的。

    drawableWidth : 底层缓存区对象的高度。

    drawableHeight : 底层缓存区对象的宽度。

    六、删除FrameBuffer(帧缓冲区)对象

    删除与GLKView关联的FrameBuffer。

    - (void)deleteDrawable;
    

    相关文章

      网友评论

        本文标题:第四节—关于GLKView

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