OpenGL ES

OpenGLES基础与实践
本文介绍了OpenGLES的基本数据类型、顶点概念,并通过绘制二十面体的实例,详细解释了关键OpenGL函数的用途。

由于项目中要用到滤镜,必须要了解一下基础的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)相对应



### 关于 OpenGL ES 的入门教程和技术文档 #### 开发环境搭建 为了更好地学习和实践 OpenGL ES,可以参考以下资料来搭建开发环境。通过构建 OpenGL ES 环境[^1] 和设置投影与相机视图,开发者能够快速上手并编写基本的渲染代码。 #### 学习路径建议 对于初学者而言,《OpenGL ES 3.0 Programming Guide》是一本非常有价值的参考资料[^2]。此书涵盖了从基础概念到高级技术的内容,适合希望深入理解 OpenGL ES 工作原理的学习者。此外,在线教程 LearnOpenGL ES 提供了许多实用的例子和详细的解释,可以帮助读者逐步掌握核心技能。 #### 编写首个 Android 应用程序 如果目标是在 Android 平台上实现基于 OpenGL ES 的功能,则可以从创建最简单的项目入手[^3]。该过程通常涉及初始化 GLSurfaceView 组件及其关联 Renderer 类型对象的操作;接着定义顶点数据结构并通过着色器完成绘制操作。 #### 实际应用案例分析 值得注意的是,随着硬件性能提升以及市场需求变化,如今许多图像编辑类应用程序内部仍然广泛采用此类图形库来进行复杂视觉效果处理工作,例如脸部美化调整等功能即依赖于此种底层技术支持得以实现良好用户体验[^4]。 ```java // Java端配置GLSurfaceView实例化部分展示如下: mGLView = new GLSurfaceView(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ mGLView.setEGLContextClientVersion(2); //指定使用ES2 API级别 } MyRenderer renderer=new MyRenderer(); mGLView.setRenderer(renderer); public class MyRenderer implements GLSurfaceView.Renderer { @Override public void onDrawFrame(GL10 gl){} @Override public void onSurfaceChanged(GL10 gl, int width, int height){} @Override public void onSurfaceCreated(GL10 gl, EGLConfig config){} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值