zoukankan      html  css  js  c++  java
  • IOS 中openGL使用教程1(openGL ES 入门篇 | 搭建openGL环境)

    OpenGL版本

    iOS系统默认支持OpenGl ES1.0、ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适的版本。这方面的介绍不少,不再展开。在学习OpenGL代码的时候也需要知道它对应着哪个版本,在ES1中执行ES2代码是看不到任何效果的,你可以在初始化EAGLContext时指定ES版本号

     _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    OpenGL坐标系不同于UIKit坐标系,其实它是这样的,(-1,-1)是屏幕左下角,(1,1)是屏幕右上角

                                        blob.png

    现在我们从创建工程开始

    我们可以在创建工程的时候直接选择game模板,这样系统会自动配置好环境,但是会有很多的多余代码。

    为了方便学习,我们选择创建一个single view application工程。

    创建好工程之后要引入openGLES框架。

    苹果提供了一系列的API,简化了对openGL的使用,这些组件被包含在GLKit.framework中。

    为了更好地了解openGL的使用,在这里我们不适用GLKit相关的API,以后可能会有相关的介绍。

    接下来就可以开始使用openGL了,这里新实现一个类,继承自UIView。

    导入对应版本的头文件

      

    #import <OpenGLES/ES2/gl.h>
    #import <OpenGLES/ES2/glext.h>

    设置属性

    @interface MTGLESViewController (){
    
        EAGLContext *_context;
        CAEAGLLayer *_EALayer;
        GLuint _colorBufferRender;
        GLuint _frameBuffer;
        GLuint _glProgram;
        GLuint _positionSlot;
        GLuint _textureSlot;
        GLuint _textureCoordsSlot;
        GLuint _textureID;
        CGRect _frameCAEAGLLayer;
        
    }
    

    在IOS应用程序中,每个线程都会维护一个当前上下文。当你的应用程序使用Opengl ES的调用时,线程的上下文就会被那个调用改变。

    要设置当前上下文,你可以通过调用EAGLContext类的setCurrentContext:方法。

    [EAGLContext setCurrentContext:myContext];

    你的应用程序也可以通过EAGLContext类的currentContext方法来获取一个线程的当前上下文。

    当你的应用程序设置了一个新的上下文时,EAGL会释放先前的上下文,并且获取新的上下文。

     当你的应用程序创建和初始化EAGLContext对象时,可以来决定那种版本的Opengl ES会被支持。创建Opengl ES 2.0上下文时,你的应用程序可以如下初始化:

    _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    [EAGLContext setCurrentContext:_eaglContext];

    初始化完之后,我们需要对layer层进行一些处理,设置一些属性,使其能够使用openGL。

    _eaglLayer = (CAEAGLLayer*)self.layer;
    _eaglLayer.frame
    = self.frame;
    _eaglLayer.opaque
    = YES; _eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kEAGLDrawablePropertyRetainedBacking,
                        kEAGLColorFormatRGBA8,kEAGLDrawablePropertyColorFormat, nil];

    初始化完成Layer之后,我们需要初始化一下renderBuffer和FrameBuffer 

     glGenRenderbuffers(1, &_colorBufferRender);
        glBindRenderbuffer(GL_RENDERBUFFER, _colorBufferRender);
        [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_EALayer];
        
        glGenFramebuffers(1, &_frameBuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
        
        glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT0,
                                  GL_RENDERBUFFER,
                                  _colorBufferRender);

    现在试试我们是否能正常使用openGL

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT);

    [_eaglContext presentRenderbuffer:GL_RENDERBUFFER];

    屏幕的背景色被设为为灰色,证明我们已经成功完成了掌握openGL的第一关键点。

                          

  • 相关阅读:
    [TPYBoard
    Ubuntu 16.04 搭建KVM环境
    kali kvm Requested operation is not valid: network 'default' is not active
    SFTP文件上传与下载(window 上传文件到linux服务器)
    如何在linux下查看目录的剩余空间大小
    虚拟机三种网络模式详解(Bridge,Nat,Host-only)
    Vmware虚拟机三种网络模式详解
    vmware的硬件选项里有关于虚拟化引擎的选项(虚拟机支持硬件虚拟化)
    liunx Swap 分区的作用
    linux中chmod与chown两个命令详解
  • 原文地址:https://www.cnblogs.com/bigly/p/5804320.html
Copyright © 2011-2022 走看看