iOS-openGLES程序制作基本步骤以及某些API

原创 2015年11月18日 11:28:14
最近研究了一下ios下的openGLES,给大家分享一下学习经验
openGLES就是openGL的阉割版,就是作者删除了一些自认为没多大作用的API。
openGL是啥,这里就不废话去讲了,我们直奔主题。

我们做OpenGLES的ios开发必须导入两个框架
QuartzCore.framework以及OpenGLES.framework(该框架的所有api都是c语言形式的)
本文分两部分介绍,一部分是基本的编写步骤,第二部分是一些API的展示

OpenGLES程序编写步骤是(以绘制正方形为例)
1、创建一个UIView的子类,并重写下面的方法

+(Class)layerClass

{

    return [CAEAGLLayer class];

}


2、在init的方法中,从
基类获取layer属性,并将其转型至CAEAGLLayer
CAEAGLLayer*  eaglLayer = (CAEAGLLayer *)super.layer;
eaglLayer.opaque = YES; //无需Quartz处理透明度 

3、建立一个
EAGLContext 对象(GL上下文对象)
EAGLContext* context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];
/*
    后面的参数有两个选择
    kEAGLRenderingAPIOpenGLES1=1  表示用渲染库的API版本是1.1
    kEAGLRenderingAPIOpenGLES2=2  表示用渲染库的API版本是2.0
*/
//设定当期上下文对象
[EAGLContext setCurrentContext:m_context] 
//设定被渲染的层对象
[m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer]; 

4、创建帧缓冲管线以及渲染缓冲管线

//创建渲染缓冲管线

glGenRenderbuffersOES(1, &m_renderBuffer);

//绑定渲染缓冲管线
glBindRenderbufferOES(GL_RENDERBUFFER_OESm_renderBuffer); 

//创建帧缓冲管线

glGenFramebuffersOES(1, &m_frameBuffer);

//绑定帧缓冲管线

glBindFramebufferOES(GL_FRAMEBUFFER_OESm_frameBuffer);

//将渲染缓冲区附加到帧缓冲区上

glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OESGL_COLOR_ATTACHMENT0_OESGL_RENDERBUFFER_OESm_renderBuffer);

//创建显示区域
glViewport
(00, width, height);
//设定矩阵模式
glMatrixMode(GL_PROJECTION); 
//设定投影空间

glOrthof(-maxX, maxX, -maxY, maxY, -11);


5、渲染部分(绘制)

//清除颜色

glClearColor(0.5f0.5f0.5f1); 
//清除
glClear
(GL_COLOR_BUFFER_BIT); 
 //压入矩阵
glPushMatrix();
//设定特征数组
glEnableClientState(GL_VERTEX_ARRAY);
//指定顶点

glColor4f(01.0f01);

float triangles[][2] = {{0,0},{0,1},{1,1},{1,1},{1,0},{0,0}};
glVertexPointer(2GL_FLOAT, stride,triangles);
//绘制
glDrawArrays(GL_TRIANGLES0sizeof(triangles)/stride);
//取消特征数组
glDisableClientState(GL_VERTEX_ARRAY);
//弹出矩阵
glPopMatrix();
//强制刷新(不是必须步骤)
glFlush(); 


6、创建CADisplayLink*对象(该对象的主要功能是根据一个帧率,可以不断的进行重绘,默认是60帧,即每秒重绘60次)

CADisplayLink* displayLink;

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(绘制部分的函数)];

[displayLink addToRunLoop:[NSRunLoop currentRunLoopforMode:NSDefaultRunLoopMode]; 

7、 将该View放入某个controller中


全流程代码

@interface GLView : UIView

{

//    // 上下文对象

    EAGLContext* m_context;


}

@end


@implementation GLView



+(Class)layerClass

{

    return [CAEAGLLayer class];

}


- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        //从基类获取layer属性,并将其转型至CAEAGLLayer

        CAEAGLLayer*  eaglLayer = (CAEAGLLayer *)super.layer;

        

        //无需Quartz处理透明度

        eaglLayer.opaque = YES;

        

        //创建根据GL的版本1.1创建上下文对象

        m_context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];

        

        //设置当前的上下文对象,如果失败返回nil

        if (!m_context || ![EAGLContext setCurrentContext:m_context]) {

            return nil;

        }

        

        GLuint frameBuffer;//帧缓冲

        GLuint renderBuffer;//渲染缓冲

        //创建渲染缓冲管线

        glGenRenderbuffersOES(1, &renderBuffer);

        //绑定渲染缓冲管线

        glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderBuffer);

        

        //创建帧缓冲管线

        glGenFramebuffersOES(1, &frameBuffer);

        

        //绑定帧缓冲管线

        glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer);

        

        //将渲染缓冲区附加到帧缓冲区上

        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OESGL_COLOR_ATTACHMENT0_OESGL_RENDERBUFFER_OES, renderBuffer);

        

        //创建显示区域

        glViewport(00CGRectGetWidth(frame),CGRectGetHeight(frame));

        

        //设定当前矩阵模式

        glMatrixMode(GL_PROJECTION);

        

        const float maxX = 2;

        const float maxY = 3;

        

        //设置为正投影空间

        glOrthof(-maxX, maxX, -maxY, maxY, -11);

        glMatrixMode(GL_MODELVIEW);


        [m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];

        

        [self drawView:nil];

        

        CADisplayLink* displayLink;

        displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView:)];

        [displayLink addToRunLoop:[NSRunLoop currentRunLoopforMode:NSDefaultRunLoopMode];


    }

    return self;

}



-(void)drawView:(CADisplayLink *)displayLink

{

    if (displayLink != nil) {

    }

    //清楚颜色

    glClearColor(0.5f0.5f0.5f1);

    glClear(GL_COLOR_BUFFER_BIT);

    //压入当前矩阵

    glPushMatrix();

    //设定特征的数组

    glEnableClientState(GL_VERTEX_ARRAY);

    const int stride = 2 * sizeof(float);

    //绘制图形

    glColor4f(01.0f01);

    float triangles[][2] = {{0,0},{0,1},{1,1},{1,1},{1,0},{0,0}};

    // 指定顶点的坐标

    glVertexPointer(2GL_FLOAT, stride,triangles);

    //绘制图形(正方形)

    glDrawArrays(GL_TRIANGLES0sizeof(triangles)/stride);

    glDisableClientState(GL_VERTEX_ARRAY);

    glPopMatrix();

    //强制刷新

    glFlush();

    

    [m_context presentRenderbuffer:GL_RENDERBUFFER];

}


-(void)dealloc

{

    if ([EAGLContext currentContext] == m_context) {

        [EAGLContext setCurrentContext:nil];

    }

    [m_context release];

    [super dealloc];

}

@end



openGLES部分API展示
 1、
glViewport
功能:创建一个显示区域

原型:void glViewport (GLint x, GLint y, GLsizei width, GLsizei height);

参数:x和y表示图形的原点(即左下角的位置),width和height表示宽和高

 2
glMatrixMode
功能:设置矩阵模式

原型:void glMatrixMode (GLenum mode);

参数:mode有以下可选的值
            
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.

     GL_PROJECTION,对投影矩阵应用随后的矩阵操作.

     GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作. 

 
3、glOrthof

功能:设置正投影空间

原型:void glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);

参数:可以将当前的可视空间设置为正投影空间,会把二维的图形转为三维,将图像的矩阵乘以该矩阵


 
 4glClear

功能:清除模式

原型:void glClear (GLbitfield mask);

参数:mask可以取四种值

       GL_COLOR_BUFFER_BIT 当前可写的颜色缓冲

       GL_DEPTH_BUFFER_BIT 深度缓冲

       GL_STENCIL_BUFFER_BIT 累积缓冲

       GL_ACCUM_BUFFER_BIT 模板缓冲

5、
glEnableClientState
功能:设定特征数组,即调用DrawArraysglArrayElement, glDrawElements这三个方法时用何种数组

原型:void glEnableClientState (GLenum array);;

参数:array可以取四种值

            GL_VERTEX_ARRAY  矩阵

            GL_NORMAL_ARRAY  正常点

            GL_COLOR_ARRAY   颜色

            GL_TEXTURE_COORD_ARRAY

6、
glVertexPointer
功能:设定顶点坐标

原型:void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

参数:

       size:指定了每个顶点对应的坐标个数,只能是2,3,4中的一个,默认值是4

       type:指定了数组中每个顶点坐标的数据类型,可取常量:GL_BYTE, GL_SHORT,GL_FIXED,GL_FLOAT
             ;

       stride:指定了连续顶点间的字节排列方式,如果为0,数组中的顶点就会被认为是按照紧凑方式排列的,默
                               认值为
0    

       pointer:制订了数组中第一个顶点的首地址,默认值为0


7、DrawArrays
功能:绘制图形

原型:void glDrawArrays (GLenum mode, GLint first, GLsizei count);

参数:

       mode,绘制方式,OpenGL2.0以后提供以下参数:

        GL_POINTS 把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点
 
       GL_LINES  把每一个顶点作为一个独立的线段,顶点2n12n之间共定义了n条线段,总共绘制N/2条线
                                            段
 
       GL_LINE_LOOP 绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相
                                                    连,第
nn+1个顶点定义了线段n,总共  绘制n条线段

       GL_LINE_STRIP 绘制从第一个顶点到最后一个顶点依次相连的一组线段,第nn+1个顶点定义了线段n,  
                                                      总共绘制
n1条线段     
 
      GL_TRIANGLES 把每个顶点作为一个独立的三角形,顶点3n23n13n定义了第n个三角形,总共绘
                                                    制
N/3个三角形

       GL_TRIANGLE_STRIP 绘制一组相连的三角形,对于奇数n,顶点nn+1n+2定义了第n个三角形;对于
                                                                偶数
n,顶点n+1nn+2定义了第n个三角形,总共绘制N-2个三角形

       GL_TRIANGLE_FAN 绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1n+1
                                                             
n+2定义了第n个三角形,总共绘制N-2个三角形

       
       first
,从数组缓存中的哪一位开始绘制,一般为0

       count,数组中顶点的数量。


相关文章推荐

iOS --- OpenGLES之初步认识

iOS上绘制图形的方式很多,UIKit,CoreGraphics,SpriteKit,OpenGL ES,Metal等。OpenGL ES是一套非常底层但使用非常广泛的C语言API,专为移动设备定制,...

IOS-OpenGLES 基础教程(一)

http://www.helmsmansoft.com/index.php/archives/1417 今天起本站将推出IOS-OpenGLES基础教程,当然本人也是一面自学一面将学习中所用到的...

opengles绘图 (2)

1.决定你要支持的OpenGL ES的版本。目前,OpenGL ES包含1.1和2.0两个版本,iPhone 3G+和iPad开始支持OpenGL ES2.0。而且这两个版本之间的差异非常大,不仅仅在...

漫步IOS--数组、sizeof和函数形参

首先声明,该系列博客记录的重点是C、OBject-C(以后简称OC)相对于Java的不同,还有一些我在编码练习过程中遇到的问题还有解决方法,而并不是一份流水式的完全的学习笔记。还有一些内容是C和OC中...

sizeof()用法汇总

sizeof()用法汇总 sizeof()功能:计算数据空间的字节数 1.与strlen()比较       strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'...

JDBC应用程序常见接口API和基本操作步骤

常用JDBC API在java.sql包中包含体现JDBC基本功能的若干接口和类:1.Driver 接口:代表驱动程序2.DriverManager 类:驱动程序管理员3.Connection 接口:...

在IOS上利用ArcGIS API For IOS进行移动GIS开发新建程序的配置步骤

程序demo下载地址:http://www.arcgis.com/home/group.html?owner=iOSDevelopmentTeam&title=ArcGIS%20for%20iOS%2...

使用eBay API基本步骤介绍

使用eBay API基本步骤介绍 要开始使用eBay API,需要如下基本步骤: 1.    注册开发帐号: https://developer.ebay.com/join/Default.as...

Java Excel Api及详细教程,适合第一次在Eclipse上读取Excel同学,基本步骤!

有时在java开发中会操作excel表格,其实操作起来也特别简单。这里把前期操作步骤说一下,本文会简单的介绍一个开放源码项目:Java Excel Api,使用它大家就可以方便的操作Excel文件了。...
  • pzhtpf
  • pzhtpf
  • 2012年04月25日 21:43
  • 24089

程序设计方法包括三个基本步骤

  • 2011年12月20日 23:58
  • 194KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS-openGLES程序制作基本步骤以及某些API
举报原因:
原因补充:

(最多只允许输入30个字)