一 OpenGL数据类型和简单绘制

一 基本数据类型GLenum: 用于GL枚举的无符号整型。GLboolean: 用于单布尔值。OpenGL ES还定义了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平台和语言的差别。GLbitfield: 用于将多个布尔值(最多32个)打包到单个使用位操作变量的四字节整型。GLbyte: 有符号单字节整型。GLshort: 有符号双字节整型。GLint: 有符号四字节整型。GLsizei: 有符号四字节整型,用于代表数据的尺寸(字节),类似于C中的size_t。GLubyte: 无符号单字节整型。GLushort: 无符号双字节整型。GLuint: 无符号四字节整型。GLfloat: 四字节精度浮点数。GLclampf: 0.0到1.0之间的四字节精度浮点数。GLvoid: void值用于指示一个函数没有返回值,或没有参数。GLfixed: 定点数,使用整型数存储实数。GLclampx: 定点型,用于使用定点运算来表示0.0 到 1.0之间的实数。二 结构体1 点typedef struct {GLfloat x;GLfloat y;GLfloat z;} Vertex3D;static inline Vertex3D Vertex3DMake(CGFloat inX, CGFloat inY, CGFloat inZ){Vertex3D ret;ret.x = inX;ret.y = inY;ret.z = inZ;return ret;};static inline GLfloat Vertex3DCalculateDistanceBetweenVertices (Vertex3D first, Vertex3D second){GLfloat deltaX = second.x – first.x;GLfloat deltaY = second.y – first.y;GLfloat deltaZ = second.z – first.z;return sqrtf(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ );};示例:Vertex3D vertex;vertex.x = 10.0;vertex.y = 23.75;vertex.z = -12.532;

2 三角形

typedef struct {Vertex3D v1;Vertex3D v2;Vertex3D v3;} Triangle3D;<pre name="code" class="cpp">static inline Triangle3D Triangle3DMake(Vertex3D v1, Vertex3D v2, Vertex3D v3){Triangle3D tri;tri.v1 = v1;tri.v2 = v2;tri.v3 = v3;return tri;}三 绘制三角形OpenGL ES只支持三边形(即三角形),,下面我们就来绘制一个三角形。 // 创建一个三角形Vertex3D vertex1 = Vertex3DMake(0.0, 1.0, -3.0);Vertex3D vertex2 = Vertex3DMake(1.0, 0.0, -3.0);Vertex3D vertex3 = Vertex3DMake(-1.0, 0.0, -3.0);Triangle3D triangle = Triangle3DMake(vertex1, vertex2, vertex3);// 绘制三角形glLoadIdentity();// 加载单位矩阵,清除虚拟世界中的一切旋转,移动或其他变化并将观察者置于原点glClearColor(0.7, 0.7, 0.7, 1.0);// 设置背景色的RGBAglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 通知OpenGL清除以前的一切图形并将其设为clear颜色。glEnableClientState(GL_VERTEX_ARRAY);// 启动OpenGL的vertex arrays(顶点数组)特性glColor4f(1.0, 0.0, 0.0, 1.0);// 设置了绘图时所需的颜色RGBAglVertexPointer(3, GL_FLOAT, 0, &triangle);// 设置绘制路径glDrawArrays(GL_TRIANGLES, 0, 9);// 绘制三角形glDisableClientState(GL_VERTEX_ARRAY);// 禁止先前启动的顶点数组特效四 绘制矩阵OpenGL ES并不支持矩阵,所以我们只能通过三角形来定义矩阵。 Triangle3D triangle[2];triangle[0].v1 = Vertex3DMake(0.0, 1.0, -3.0);triangle[0].v2 = Vertex3DMake(1.0, 0.0, -3.0);triangle[0].v3 = Vertex3DMake(-1.0, 0.0, -3.0);triangle[1].v1 = Vertex3DMake(-1.0, 0.0, -3.0);triangle[1].v2 = Vertex3DMake(1.0, 0.0, -3.0);triangle[1].v3 = Vertex3DMake(0.0, -1.0, -3.0);glLoadIdentity();glClearColor(0.7, 0.7, 0.7, 1.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnableClientState(GL_VERTEX_ARRAY);glColor4f(1.0, 0.0, 0.0, 1.0);glVertexPointer(3, GL_FLOAT, 0, &triangle);glDrawArrays(GL_TRIANGLES, 0, 18);glDisableClientState(GL_VERTEX_ARRAY);更高效的方法是这样的,首先我们定义一个函数:static inline void Vertex3DSet(Vertex3D *vertex, CGFloat inX, CGFloat inY, CGFloat inZ){vertex->x = inX;vertex->y = inY;vertex->z = inZ;}然后将绘制的代码修改如下: Triangle3D *triangles = malloc(sizeof(Triangle3D) * 2);Vertex3DSet(&triangles[0].v1, 0.0, 1.0, -3.0);Vertex3DSet(&triangles[0].v2, 1.0, 0.0, -3.0);Vertex3DSet(&triangles[0].v3, -1.0, 0.0, -3.0);Vertex3DSet(&triangles[1].v1, -1.0, 0.0, -3.0);Vertex3DSet(&triangles[1].v2, 1.0, 0.0, -3.0);Vertex3DSet(&triangles[1].v3, 0.0, -1.0, -3.0);glLoadIdentity();glClearColor(0.7, 0.7, 0.7, 1.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnableClientState(GL_VERTEX_ARRAY);glColor4f(1.0, 0.0, 0.0, 1.0);glVertexPointer(3, GL_FLOAT, 0, triangles);glDrawArrays(GL_TRIANGLES, 0, 18);glDisableClientState(GL_VERTEX_ARRAY);if (triangles != NULL)free(triangles);

人格的完善是本,财富的确立是末。

一 OpenGL数据类型和简单绘制

相关文章:

你感兴趣的文章:

标签云: