音视频从入门到放弃OpenGL ES

第四节—关于GLKView

2020-09-16  本文已影响0人  L_Ares

本文为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;
上一篇下一篇

猜你喜欢

热点阅读