CAEAGLLayer

CAEAGLLayer

当iOS要拍卖高质量图形绘制,需要时就是OpenGL。应该说它应当是最后的绝艺,起码对于非游戏的利用来讲是的。因为比较Core Animation和UIkit框架,它出乎意料地复杂。

OpenGL提供了Core Animation的基础,它是底层的C接口,直接和BlackBerry,苹果平板的硬件通讯,极少地抽象出来的不二诀要。OpenGL没有对象大概图层的承接概念。它只是简短地拍卖三角形。OpenGL中享有东西都以3D空间中有颜色和纹理的三角。用起来非常复杂和刚劲,不过用OpenGL绘制iOS客户分界面就要求多多居多的干活了。

为了能够以高质量使用Core Animation,你必要剖断你需求绘制哪类内容(矢量图形,例子,文本,等等),但后接纳符合的图层去呈现那些内容,Core Animation中独有部分项指标从头到尾的经过是被高度优化的;所以一旦你想绘制的东西并不能够找到职业的图层类,想要获得高质量就相比较费劲情了。

因为OpenGL根本不会对你的剧情开展假设,它亦可绘制得一定快。利用OpenGL,你能够绘制任何你精通要求的集合音信和样子逻辑的剧情。所以众多游戏都快乐用OpenGL(那么些处境下,Core Animation的限制就超出言语以外了:它优化过的内容类型并不一定能满意须求),可是这么依靠,方便的万丈抽象接口就没了。

在iOS 5中,苹果引进了三个新的框架叫做GLKit,它去掉了一些设置OpenGL的复杂,提供了一个叫做CLKViewUIView的子类,帮你处理大多数的装置和制图职业。前提是五颜六色的OpenGL绘图缓冲的平底可布署项仍然必要你用CAEAGLLayer完成,它是CALayer的三个子类,用来体现任性的OpenGL图形。

大好些个状态下你都没有供给手动设置CAEAGLLayer(借使用GLKView),过去的日子就无须再提了。特别的,我们将设置三个OpenGL ES 2.0的上下文,它是当代的iOS设备的正统做法。

固然不需求GLKit也能够产生那总体,不过GLKit囊括了不菲拾分的做事,比如设置终点和有个别着色器,这个都是类C语言叫做GLSL自包罗在前后相继中,同期在运营时载入到图片硬件中。编写GLSL代码和装置EAGLayer从未有过什么关联,所以我们将用GLKBaseEffect类将着色逻辑抽象出来。别的的业务,大家仍旧会有过去的情势。

在早先早先,你须求将GLKit和OpenGLES框架插手到您的项目中,然后就足以兑现清单6.第114中学的代码,里面是安装贰个GAEAGLLayer的起码职业,它应用了OpenGL ES 2.0 的绘图上下文,并渲染了三个有色三角(见图6.15).

清单6.14 用CAEAGLLayer绘制二个三角形

图片 1图片 2

  1 #import "ViewController.h"
  2 #import 
  3 #import 
  4 
  5 @interface ViewController ()
  6 
  7 @property (nonatomic, weak) IBOutlet UIView *glView;
  8 @property (nonatomic, strong) EAGLContext *glContext;
  9 @property (nonatomic, strong) CAEAGLLayer *glLayer;
 10 @property (nonatomic, assign) GLuint framebuffer;
 11 @property (nonatomic, assign) GLuint colorRenderbuffer;
 12 @property (nonatomic, assign) GLint framebufferWidth;
 13 @property (nonatomic, assign) GLint framebufferHeight;
 14 @property (nonatomic, strong) GLKBaseEffect *effect;
 15 
 16 @end
 17 
 18 @implementation ViewController
 19 
 20 - (void)setUpBuffers
 21 {
 22     //set up frame buffer
 23     glGenFramebuffers(1, &_framebuffer);
 24     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
 25 
 26     //set up color render buffer
 27     glGenRenderbuffers(1, &_colorRenderbuffer);
 28     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
 29     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
 30     [self.glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:self.glLayer];
 31     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_framebufferWidth);
 32     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_framebufferHeight);
 33 
 34     //check success
 35     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
 36         NSLog(@"Failed to make complete framebuffer object: %i", glCheckFramebufferStatus(GL_FRAMEBUFFER));
 37     }
 38 }
 39 
 40 - (void)tearDownBuffers
 41 {
 42     if (_framebuffer) {
 43         //delete framebuffer
 44         glDeleteFramebuffers(1, &_framebuffer);
 45         _framebuffer = 0;
 46     }
 47 
 48     if (_colorRenderbuffer) {
 49         //delete color render buffer
 50         glDeleteRenderbuffers(1, &_colorRenderbuffer);
 51         _colorRenderbuffer = 0;
 52     }
 53 }
 54 
 55 - (void)drawFrame {
 56     //bind framebuffer & set viewport
 57     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
 58     glViewport(0, 0, _framebufferWidth, _framebufferHeight);
 59 
 60     //bind shader program
 61     [self.effect prepareToDraw];
 62 
 63     //clear the screen
 64     glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0, 0.0, 0.0, 1.0);
 65 
 66     //set up vertices
 67     GLfloat vertices[] = {
 68         -0.5f, -0.5f, -1.0f, 0.0f, 0.5f, -1.0f, 0.5f, -0.5f, -1.0f,
 69     };
 70 
 71     //set up colors
 72     GLfloat colors[] = {
 73         0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
 74     };
 75 
 76     //draw triangle
 77     glEnableVertexAttribArray(GLKVertexAttribPosition);
 78     glEnableVertexAttribArray(GLKVertexAttribColor);
 79     glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, vertices);
 80     glVertexAttribPointer(GLKVertexAttribColor,4, GL_FLOAT, GL_FALSE, 0, colors);
 81     glDrawArrays(GL_TRIANGLES, 0, 3);
 82 
 83     //present render buffer
 84     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
 85     [self.glContext presentRenderbuffer:GL_RENDERBUFFER];
 86 }
 87 
 88 - (void)viewDidLoad
 89 {
 90     [super viewDidLoad];
 91     //set up context
 92     self.glContext = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
 93     [EAGLContext setCurrentContext:self.glContext];
 94 
 95     //set up layer
 96     self.glLayer = [CAEAGLLayer layer];
 97     self.glLayer.frame = self.glView.bounds;
 98     [self.glView.layer addSublayer:self.glLayer];
 99     self.glLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking:@NO, kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8};
100 
101     //set up base effect
102     self.effect = [[GLKBaseEffect alloc] init];
103 
104     //set up buffers
105     [self setUpBuffers];
106 
107     //draw frame
108     [self drawFrame];
109 }
110 
111 - (void)viewDidUnload
112 {
113     [self tearDownBuffers];
114     [super viewDidUnload];
115 }
116 
117 - (void)dealloc
118 {
119     [self tearDownBuffers];
120     [EAGLContext setCurrentContext:nil];
121 }
122 @end

View Code

 

 

图6.15 用OpenGL渲染的CAEAGLLayer图层

在几个真正的OpenGL应用中,大家大概会用NSTimerCADisplayLink周期性地每分钟调用-drawRrame情势五15次,相同的时间会将几何图形生成和制图分开以便不会每便都再一次生成三角形的极端(那样也得以让我们绘制别的的片段事物实际不是一个三角形而已),可是上边那些例子已经够用演示了绘图原则了。

本文由银河网址发布于游戏破解器,转载请注明出处:CAEAGLLayer

您可能还会对下面的文章感兴趣: