当前位置:永利皇宫官网 > 永利集团游戏网址 > CAEAGLLayer

CAEAGLLayer

文章作者:永利集团游戏网址 上传时间:2019-12-23

CAEAGLLayer

当iOS要管理高品质图形绘制,须要时正是OpenGL。应该说它应有是终极的绝技,最少对于非游戏的使用来讲是的。因为比较Core Animation和UIkit框架,它难以置信地复杂。

OpenGL提供了Core Animation的底蕴,它是底层的C接口,直接和黑莓,三星平板的硬件通讯,极少地抽象出来的办法。OpenGL未有对象恐怕图层的持续概念。它只是简短地管理三角形。OpenGL中存有东西都是3D空间中有颜色和纹理的三角。用起来非常复杂和强盛,不过用OpenGL绘制iOS客户分界面就供给广大浩大的办事了。

为了能够以高质量使用Core Animation,你须要判断你需求绘制哪一类内容(矢量图形,例子,文本,等等),但后接收合适的图层去表现那几个剧情,Core Animation中独有生龙活虎对类型的内容是被中度优化的;所以假如你想绘制的东西并无法找到专门的学问的图层类,想要获得高品质就比较费力情了。

CAEAGLLayer。CAEAGLLayer。因为OpenGL根本不会对你的内容实行假若,它亦可绘制得一定快。利用OpenGL,你能够绘制任何你知道供给的会集音讯和造型逻辑的内容。所以广大游戏都爱怜用OpenGL(这个情况下,Core Animation的界定就驾驭了:它优化过的源委类型并不一定能满意须要),但是那样依附,方便的冲天抽象接口就没了。

在iOS 第55中学,苹果引进了多个新的框架叫做GLKit,它去掉了一些设置OpenGL的复杂,提供了二个称作CLKViewUIView的子类,帮您管理超过四分之二的设置和制图专门的工作。前提是巨细无遗的OpenGL绘图缓冲的尾巴部分可配置项如故须求您用CAEAGLLayerCAEAGLLayer。完成,它是CALayer的三个子类,用来浮现大肆的OpenGL图形。

绝大许多气象下你都无需手动设置CAEAGLLayer(假使用GLKView),过去的光景就不要再提了。极其的,大家将设置叁个OpenGL ES 2.0的上下文,它是今世的iOS设备的正式做法。

固然无需GLKit也足以落成那全体,不过GLKit囊括了非常多额外的办事,譬喻设置极端微风姿洒脱部分着色器,这一个都是类C语言叫做GLSL自满含在前后相继中,同期在运作时载入到图片硬件中。编写GLSL代码和安装EAGLayer从不什么样关系,所以大家将用GLKBaseEffect类将着色逻辑抽象出来。别的的业务,大家依旧会有过去的不二秘技。

在早前以前,你须要将GLKit和OpenGLES框架参预到您的类型中,然后就足以兑现清单6.14中的代码,里面是安装一个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艺术陆14遍,同一时候会将几何图形生成和制图分开以便不会每趟都再一次生成三角形的极点(那样也得以让我们绘制别的的有些事物并不是三个三角形形而已),可是上边那个例子已经丰硕演示了绘图原则了。

本文由永利皇宫官网发布于永利集团游戏网址,转载请注明出处:CAEAGLLayer

关键词: