美文网首页
4.iOS如何搭建OpenGL ES上下文环境

4.iOS如何搭建OpenGL ES上下文环境

作者: LucXion | 来源:发表于2023-07-15 23:21 被阅读0次

OpenGL ES 不承担窗口管理,虽然是跨平台,但需要搭建各自平台的上下文环境来提供渲染的基础实现。
iOS 平台搭建OpenGL ES的上下文环境,使用的是EAGL,双缓冲机制,由FrameBuffer(帧缓冲区)与RenderBuffer(绘制缓冲区)一起完成。

1. 创建一个自定义的View,重写 +layerClass 方法,用 CAEAGLLayer 替换掉CALayer。

2. 开辟一个线程,在线程中创建 EAGLContext上下文并绑定。

- (id) initWithFrame:(CGRect)frame{
    
    if ((self = [super initWithFrame:frame])){
        
        _renderBufferWorkingQueue = dispatch_queue_create("renderBufferWorkingQueue", DISPATCH_QUEUE_CONCURRENT);
        
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)[self layer];
        
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                [NSNumber numberWithBool:NO],
                kEAGLDrawablePropertyRetainedBacking,
                kEAGLColorFormatRGB565,
                kEAGLDrawablePropertyColorFormat,
                nil];
        
         [eaglLayer setOpaque:YES];
         [eaglLayer setDrawableProperties:dict];
        
        [self initializationEAGLContext];
    }
    return self;
}

///建立 EAGL 与 OpenGL ES 的关系
- (void)initializationEAGLContext {
    
    dispatch_async(_renderBufferWorkingQueue, ^{
        // 要在子线程中,创建 EAGLContext 上下文
        EAGLContext* _context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
        
        [EAGLContext setCurrentContext:_context];
    });
}

3. 窗口管理部分:

3.1 创建两个帧缓冲区

glGenFramebuffers(1, &_framebuffer);

glGenRenderbuffers(1, &renderbuffer);

3.2 将帧缓冲区与绘制缓冲区绑定到渲染管线

glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);

3.3 为 RenderBuffer 分配存储区,一般将 CAEAGLLayer 存储区作为RenderBuffer 的存储区

glGetRenderBufferParameteriv(GL_RENDER_BUFFER, GL_RENDER_BUFFER_WIDTH,
        &_backingWidth);

3.4 获取 RenderBuffer 的像素宽高

glGetRenderBufferParameteriv(GL_RENDER_BUFFER, GL_RENDER_BUFFER_WIDTH,
        &_backingWidth);

glGetRenderBufferParameteriv(GL_RENDER_BUFFER, GL_RENDER_BUFFER_HEIGHT,
      &_backingHeight);

3.5 绑定绘制缓冲区到帧缓冲区

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderbuffer);

3.6 检查 Framebuffer 的 status。

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE){
    //failed to make complete frame buffer object 
}

3.7 完成以上操作,我们就把 EAGL 和我们的 Layer(设备的屏幕)连接起来了,当我们绘制了一帧之后(当然绘制过程也必须在这个线程中),调用以下代码就可以将绘制的结果显示到屏幕上了。

[_context presentRenderbuffer:GL_RENDERBUFFER];

相关文章

  • OpenGL ES入门及GLSL

    使用OpenGL ES最关心的问题 1、如何在iOS上搭建OpenGL ES环境2、如何链接GLSL3、如何通过G...

  • IOS播放YUV文件OpenGLES(九)

    前言 前面介绍了opengl es上下文环境搭建,如何渲染RGB图片。基本上有了这些基础,那么做出一个能播放YUV...

  • OpenGL ES for iOS - 2

    配置OpenGL ES上下文 OpenGL ES的每个实现都提供了一种创建渲染上下文以管理OpenGL ES规范所...

  • OpenGL ES GLKit初探

    配置OpenGL ES上下文 OpenGL ES的每种实现都提供一种创建渲染上下文的方法,以管理OpenGL ES...

  • OpenGL ES-渲染图片

    opengl只负责图片渲染过程,不负责窗口管理及上下文环境管理,因此要自己为OpenGL搭建上下文环境来管理窗口 ...

  • OpenGL ES GLSL加载图片

    OpenGL ES需要渲染上下文和绘制表面才能完成图像的绘制。但是OpenGL的API并没有提供如何创建渲染上下文...

  • OpenGL开发环境搭建

    刚开始入门学习OpenGL,环境搭建便是个问题。一开始学着百度传课-OpenGL ES概述(教程以ES 2.0为主...

  • 安卓截屏和图片画角线OpenGLES(十一)

    前言 上一篇文章我们学习了如何在安卓平台搭建opengl es环境,如何通过TextureView加载一张图片。其...

  • OpenGL Mac环境搭建

    在学习OpenGL ES之前,先了解一下OpenGL的基本使用,首先从搭建OpenGL环境开始,下面是Mac中Op...

  • Opengl ES 3.0 on iOS -- EAGLCont

    概述 EAGLContext对象是管理OpenGL ES渲染上下文,若想使用OpenGL ES 进行绘制工作,则必...

网友评论

      本文标题:4.iOS如何搭建OpenGL ES上下文环境

      本文链接:https://www.haomeiwen.com/subject/bbyiudtx.html