关闭

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

标签: Objective-cOpenGL
466人阅读 评论(0) 收藏 举报
分类:
最近研究了一下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,数组中顶点的数量。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42186次
    • 积分:943
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条
    文章分类