Opengl ES 初识(整理)

首先我们要知道openglesopengl三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该APIKhronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。opengles去除了四边形、多边形等复杂图形和许多非绝对必要的特性,只保留三角形的绘制。经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。

  直接切入主题开始学习OpenGL ES。它对现在的消费类电子,对爱疯、安卓、乐疯、小米等等等等的意义我就不说了。
  OpenGL的数据类型
  
  • GLenum: 用于GL枚举的无符号整型。通常用于通知OpenGL由指针传递的存储于数组中数据的类型(例如,GL_FLOAT用于指示数组由GLfloat组成)。
  • GLboolean: 用于单布尔值。OpenGL ES还定义了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平台和语言的差别。当向OpenGL传递布尔值时,请使用这些值而不是使用YES或NO(尽管由于它们的定义实际没有区别,即使你不小心使用了YES或NO。但是,使用GL-定义值是一个好的习惯。)
  • GLbitfield: 用于将多个布尔值(最多32个)打包到单个使用位操作变量的四字节整型。
  • GLbyte: 有符号单字节整型,包含数值从-128 到 127
  • GLshort: 有符号双字节整型,包含数值从−32,768 到 32,767
  • GLint: 有符号四字节整型,包含数值从−2,147,483,648 到 2,147,483,647
  • GLsizei: 有符号四字节整型,用于代表数据的尺寸(字节),类似于C中的size_t
  • GLubyte: 无符号单字节整型,包含数值从0 到 255。
  • GLushort: 无符号双字节整型,包含数值从0 到 65,535
  • GLuint: 无符号四字节整型,包含数值从0 到 4,294,967,295
  • GLfloat: 四字节精度IEEE 754-1985 浮点数
  • GLclampf: 这也是四字节精度浮点数,但OpenGL使用GLclampf特别表示数值为0.0 到 1.0
  • GLvoidvoid值用于指示一个函数没有返回值,或没有参数
  • GLfixed定点数 使用整型数存储实数。由于大部分计算机处理器在处理整型数比处理浮点数快很多,这通常是对3D系统的优化方式。但因为iPhone具有用于浮点运算的矢量处理器,我们将不讨论定点运算或GLfixed数据类型。
  • GLclampx: 另一种定点型,用于使用定点运算来表示0.0 到 1.0之间的实数。正如GLfixed,我们不会讨论或使用它。

OpenGL ES 目前不支持8字节(64位)数据类型,如long或double。OpenGL 其实具有这些大型数据类型,但考虑到大部分嵌入式设备屏幕尺寸以及可能为它们所写的程序类型而且使用它们有可能对性能造成不利的影响,最后的决定是在OpenGL ES中排除这些数据类型。


点或顶点

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

cartesian.png (436×359)

 

任何物体在三维空间中的方位可以由三个数值表示,物体的位置通常在OpenGL中由使用一个三维数组的三个GLfloat变量表示,数组中的第一项(索引0)为x位置,第二项(索引1)为y位置,第三项(索引2)为z位置。下面是一个创建OpenGL ES顶点的简单例子:

GLfloat vertex[3];
 vertex[0] = 10.0// x  
 vertex[1] = 23.75// y  
 vertex[2] = -12.532// z

我们可以定义一个数据结构了保存多个顶点,像这样:

typedef struct 
 GLfloat x; 
 GLfloat y; 
 GLfloat z; } Vertex3D;

通过这样做,我们的代码可读性更强:

Vertex3D vertex; 
vertex.x = 10.0
vertex.y = 23.75
vertex.z = -12.532;

三角形

由于OpenGL ES仅支持三角形,因此我们可以通过创建一个数据结构将三个顶点组合成一个三角形物体。

typedef struct 
 Vertex3D v1; 
 Vertex3D v2; 
 Vertex3D v3; } Triangle3D;

在OpenGL中有一个概念叫卷绕(winding), 它表示顶点绘制的次序是重要的。不像真实世界中的物体,OpenGL中的多边形通常都不会有两面。它们只有一面,被当做front face(前面), 三角形只有其front face面对观察者时才可见。可以设置OpenGL将多边形作为两面处理,但默认状态下,三角形只有一个可见面。通过知道哪一个面是多边形的前面或可见面,才能使OpenGL只做一半的计算。

尽管有时多边形也可以独立存在,需要绘制其背面,但通常三角形是一个大物体的一部分,其面对物体内部的一面永远也不可见。不被绘制的一面称为backface(背面),OpenGL是通过观察顶点的绘制次序来确定front face和backface的。以反时针次序绘制顶点的构成的面是frontface(默认,可以改变)。由于OpenGL可以很容易确定哪个三角形对用户可见,所以它使用了一种称为Backface Culling(隐面消除) 的技术来避免绘制视窗中多边形的不可见面。下一篇文章将讨论视窗,现在你可将其想象成一个虚拟摄像或观察OpenGL世界的虚拟窗口。


winding.png (482×214)

上图中,左边青色的三角形是backface,因此将不可见。而右方的三角形是frontface,所以将被绘制。

本系列的下一篇文章将设定一个OpenGL的虚拟世界并使用Vertex3D 和 Triangle3D进行一些基本绘图。再后,我们将讨论变换,它使用线性代数在虚拟世界中移动物体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值