由于项目中要用到滤镜,必须要了解一下基础的OpenGL ES,现在总结一下,供以后查询:
一、OpenGL ES各种数据类型
GLenum : 用于GL枚举的无符号整型。通常用于通知OpenGL由指针传递的存储于数组中数据的类型(例如,GL_FLOAT用于指示数组由GLfloat组成)。
GLboolean : 用于单布尔值。OpenGL ES还定义了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平台和语言的差别。当向OpenGL传递布尔值时,请使用这些值而不是使用YES或NO(尽管由于它们的定义实际没有区别,即使你不小心使用了YES或NO。但是,使用GL-定义值是一个好的习惯。)
GLbitfield : 用于将多个布尔值(最多32个)打包到单个使用位操作变量的四字节整型。我们将在第一次使用位域变量时详细介绍,请参阅 wikipedia
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 : 四字节精度IEEE754-1985浮点数
GLclampf : 这也是四字节精度浮点数,但OpenGL使用GLclampf特别表示数值为0.0到1.0
GLvoid : void值用于指示一个函数没有返回值,或没有参数
GLfixed : 定点数使用整型数存储实数。由于大部分计算机处理器在处理整型数比处理浮点数快很多,这通常是对3D系统的优化方式。但因为iPhone具有用于浮点运算的矢量处理器,我们将不讨论定点运算或GLfixed数据类型。
GLclampx : 另一种定点型,用于使用定点运算来表示0.0到1.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)相对应