OpenGL ES

由于项目中要用到滤镜,必须要了解一下基础的OpenGL ES,现在总结一下,供以后查询:


一、OpenGL ES各种数据类型

GLenum : 用于GL枚举的无符号整型。通常用于通知OpenGL由指针传递的存储于数组中数据的类型(例如,GL_FLOAT用于指示数组由GLfloat组成)。

GLboolean : 用于单布尔值。OpenGL ES还定义了其自己的值(GL_TRUEGL_FALSE)以避免平台和语言的差别。当向OpenGL传递布尔值时,请使用这些值而不是使用YESNO(尽管由于它们的定义实际没有区别,即使你不小心使用了YESNO。但是,使用GL-定义值是一个好的习惯。)

GLbitfield : 用于将多个布尔值(最多32个)打包到单个使用位操作变量的四字节整型。我们将在第一次使用位域变量时详细介绍,请参阅 wikipedia

GLbyte : 有符号单字节整型,包含数值从-128127

GLshort : 有符号双字节整型,包含数值从32,76832,767

GLint : 有符号四字节整型,包含数值从2,147,483,6482,147,483,647

GLsizei : 有符号四字节整型,用于代表数据的尺寸(字节),类似于C中的size_t

GLubyte : 无符号单字节整型,包含数值从0255

GLushort : 无符号双字节整型,包含数值从065,535

GLuint : 无符号四字节整型,包含数值从04,294,967,295

GLfloat : 四字节精度IEEE754-1985浮点数

GLclampf : 这也是四字节精度浮点数,但OpenGL使用GLclampf特别表示数值为0.01.0

GLvoid : void值用于指示一个函数没有返回值,或没有参数

GLfixed : 定点数使用整型数存储实数。由于大部分计算机处理器在处理整型数比处理浮点数快很多,这通常是对3D系统的优化方式。但因为iPhone具有用于浮点运算的矢量处理器,我们将不讨论定点运算或GLfixed数据类型。

GLclampx : 另一种定点型,用于使用定点运算来表示0.01.0之间的实数。正如GLfixed,我们不会讨论或使用它。


二、点或顶点

3D图像的最小单位称为点(point或者顶点vertex ,它们代表三维空间中的一个点并用来建造更复杂的物体,多边形就是由点构成,而物体是由多个多边形组成。尽管通常OpenGL支持多种多边形,但OpenGL ES只支持三边形(即三角形)


三、将沿z轴向下显示了三十个二十面体,透视效果

-(void)drawView:(GLView*)view

{

    static GLfloat rot =0.0;

    static const Vertex3D vertices[]= {

        {0, -0.525731,0.850651},

        // vertices[0]

        {0.850651,0,0.525731},

        // vertices[1]

        {0.850651,0, -0.525731},

        // vertices[2]

        {-0.850651, 0, -0.525731},

        // vertices[3]

        {-0.850651,0,0.525731},

        // vertices[4]

        {-0.525731,0.850651,0},

        // vertices[5]

        {0.525731,0.850651,0},

        // vertices[6]

        {0.525731, -0.850651,0},

        // vertices[7]

        {-0.525731, -0.850651,0},

        // vertices[8]

        {0, -0.525731, -0.850651},

        // vertices[9]

        {0, 0.525731, -0.850651},

        // vertices[10]

        {0, 0.525731, 0.850651}

        // vertices[11]

    };

    static const Color3D colors[] = {

        {1.0, 0.0,0.0,1.0},        {1.0,0.5,0.0,1.0},

        {1.0, 1.0,0.0,1.0},        {0.5,1.0,0.0,1.0},

        {0.0, 1.0,0.0,1.0},        {0.0,1.0,0.5,1.0},

        {0.0, 1.0,1.0,1.0},        {0.0,0.5,1.0,1.0},

        {0.0, 0.0,1.0,1.0},        {0.5,0.0,1.0,1.0},

        {1.0, 0.0,1.0,1.0},        {1.0,0.0,0.5,1.0}

    };

    

    static constGLubyte icosahedronFaces[] = {

        1, 2,6,       1,7,2,      3,4,5,      4, 3, 8,

        6, 5,11,      5,6,10,     9,10,2,     10, 9, 3,

        7, 8,9,       8,7,0,      11,0,1,      0, 11,4,

        6, 2,10,      1,6,11,     3,5,10,     5, 4, 11,

        2, 7,9,       7,1,0,      3,9,8,      4, 8, 0,

    };

    

    glLoadIdentity();

    glClearColor(0.7,0.7,0.7,1.0);

    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);

    glEnableClientState(GL_VERTEX_ARRAY);

    glEnableClientState(GL_COLOR_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, vertices);

    glColorPointer(4, GL_FLOAT, 0, colors);

    for (int i =1; i <=30; i++)    {

        glLoadIdentity();

        glTranslatef(0.0f,-1.5,-3.0f * (GLfloat)i);

        glRotatef(rot, 1.0, 1.0, 1.0);

        glDrawElements(GL_TRIANGLES,60,GL_UNSIGNED_BYTE, icosahedronFaces);

    }

    glDisableClientState(GL_VERTEX_ARRAY);

    glDisableClientState(GL_COLOR_ARRAY);

    

    static NSTimeInterval lastDrawTime;

    if (lastDrawTime)    {

        NSTimeInterval timeSinceLastDraw = [NSDatetimeIntervalSinceReferenceDate] - lastDrawTime;

        rot+=50 * timeSinceLastDraw;

    }

    lastDrawTime = [NSDatetimeIntervalSinceReferenceDate];

}


//三维坐标中坐标点

typedef struct {

    GLfloat x;

    GLfloat y;

    GLfloat z;

} Vertex3D;



// 三维坐标系中的三角形

typedef struct {

    Vertex3D v1;

    Vertex3D v2;

    Vertex3D v3;

} Triangle3D;


四、主要函数解释

//1

glLoadIdentity () :此函数加载单元矩阵,  将其视为OpenGL复位开关”,它将清除虚拟世界中的一切旋转,移动或其他变化并将观察者置于原点


//2

glClearColor (0.7 , 0.7 , 0.7 , 1.0 ) OpenGL所有的绘制工作是在一个灰色背景上进行

//2.1

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) :记住在绘制一帧之前,必须清除这两个缓存以保证不会和以前的内容混杂.

清除以前的一切图形并将其设为clear颜色,用于绘图各方面的内存块,将这两个值进行逻辑或是通知OpenGL清除两个不同的缓存:颜色缓存(color buffer/深度缓存(depth buffer

颜色缓存保存当前帧各像素的颜色,基本上就是你在屏幕上看到的,深度缓存(有时也称为“z-buffer”)保存每个潜在像素离观察者距离的信息,使用此信息可以确定一个像素是否需要被绘制出来


//3

glEnableClientState (GL_VERTEX_ARRAY) :要启动OpenGL的一项称为Vertex arrays(顶点数组)


//4

glColor4f (1.0 , 0.0 ,0.0 ,1.0 ) :设置了绘图时所需的颜色


//5

glVertexPointer (3 , GL_FLOAT, 0 , &triangle) :传递此三角形对象的地址

glVertexPointer() 的第一个参数指示了多少个GLfloat代表一个顶点,根据你是在进行二维或三维绘图,可以传递2或者3,三维中,因此每个顶点用三个数值表示,所以我们传递3给函数,然后,传递一个枚举值告诉OpenGL顶点是由GLfloat构成,OpenGL ES允许你在当地数组中使用大部分的数据类型,但除 GL_FLOAT外,下一个参数可为0


//6

glDrawArrays (GL_TRIANGLES, 0 , 9 ) :通知OpenGL通过刚才提交的顶点数组来绘制三角形


//7

glDisableClientState (GL_VERTEX_ARRAY) :禁止先前启动了的特性以保证不会被其他地方的代码弄混,glEnableClientState (GL_VERTEX_ARRAY)相对应



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值