本文为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个帧缓存区对象全都是typedef
的GLint
类型枚举值的枚举类型。分别设置如下对象:
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;
网友评论