阅读 1761

在iOS中如何使用OpenGL

在iOS中如何使用OpenGL呢,有3种方式,它们都来自系统的库GLKit中。下面我们来看看如何使用他们(我们这里主要讲一些简单的初始化工作,循序渐进)。

GLKViewController

创建一个控制器继承于GLKViewController,在viewDidLoad中设置一个EAGLContext,然后重写glkView:drawInRect:的方法,就可以在里面做OpenGL相关的绘制啦。

- (void)viewDidLoad {
    [super viewDidLoad];
    GLKView *glView = (GLKView *)self.view;
    glView.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    GLKView *glView = (GLKView *)self.view;
    [EAGLContext setCurrentContext:glView.context];
    glClearColor(1, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
}
复制代码

GLKView

创建一个视图继承于GLKView,在init中设置一个EAGLContext,然后重写drawRect:的方法,也可以在里面做OpenGL相关的绘制啦。

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self setupOpenGL];
    }
    return self;
}
- (void)setupOpenGL {
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
}
- (void)drawRect:(CGRect)rect {
    [EAGLContext setCurrentContext:self.context];
    glClearColor(0, 1, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
}
复制代码

CAEAGLLayer

通过CAEAGLLayer 的方式来初始化OpenGL相对来说,要稍微复杂一点,需要做这么几件事情,初始化Layer,初始化OpenGL,绘制相关代码。

初始化Layer

- (void)setupLayer {
    _eaglLayer = (CAEAGLLayer *)self.layer;
}
复制代码

初始化OpenGL

创建OpenGL需要的上下文,创建帧缓冲,创建渲染缓冲。 渲染缓冲存储的是颜色、深度、模版等描述信息,不可直接用于渲染。 帧缓冲存储的是颜色、深度、模版描述信息处理后的直接可以显示的像素。

- (void)setupOpenGL {
    _glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    [EAGLContext setCurrentContext:_glContext];
    glGenFramebuffers(1, &_frameBuffer);
    glGenRenderbuffers(1, &_renderBuffer);
}
复制代码

绘制相关代码

OpenGL是一个状态机,设置哪个上下文就是在操作哪个上下文的数据,我们这里需要确保是操作当前上下文。

- (void)drawSome {
    [EAGLContext setCurrentContext:_glContext];
    
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
    //为renderBuffer分配存储空间,iOS需要这么用
    BOOL result = [_glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
    if (!result) {
        printf("failed to renderbufferStorage \n");
    }
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);
    
    glClearColor(0, 0, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);
    
    [self.glContext presentRenderbuffer:GL_RENDERBUFFER];
}
复制代码

运行项目,可以看到3个OpenGL渲染出来的视图,它们分别是红绿蓝三个颜色。 Github地址

文章分类
iOS
文章标签