一 数据类型和简单绘制

一 基本数据类型

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;

static inline Triangle3D Triangle3DMake(Vertex3D v1, Vertex3D v2, Vertex3D v3);

三 绘制三角形

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);// 设置背景色的RGBA
    glClear(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);// 设置了绘图时所需的颜色RGBA
    glVertexPointer(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);

时间: 2024-11-07 17:41:56

一 数据类型和简单绘制的相关文章

在AJAX里 使用【 XML 】 返回数据类型 实现简单的下拉菜单数据

在AJAX里 使用XML返回数据类型 实现简单的下拉菜单数据 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <

在AJAX里 使用【 JSON 】 返回数据类型 实现简单的下拉菜单数据

在AJAX里 使用JSON返回数据类型 实现简单的下拉菜单数据 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &l

Redis之五种数据类型的简单增删改查

开心一笑 乌龟受伤.让蜗牛去买药.过了2个小时.蜗牛还没回来.乌龟急了骂道:他妈的再不回来老子就死了!这时门外传来了蜗牛的声音:你他妈再说老子不去了! 提出问题 Redis五种数据类型的简单增删改查命令??? 解决问题 假设你已经安装Redis服务器: 假设你已经打开Redis cli命令行工具: 假设你对Redis有所了解: Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" O

0092 数据类型、简单数据类型概述

8.1 数据类型简介 为什么需要数据类型 ? 在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型. 简单来说,数据类型就是数据的类别型号.比如姓名"张三",年龄18,这些数据的类型是不一样的. 变量的数据类型 ? 变量是用来存储值的所在处,它们有名字和数据类型.变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中.JavaScript 是一种弱类型或者说动态语言.这意味着不用提前声明变量的类型,

OpenGL简单绘制游戏角色阴影

在游戏开发中很多Q版游戏绘制角色阴影会简单的绘制一个半透明的椭圆,如下图: 这种方法的优点是实现简单,但表现效果明显不够真实.作为Q版风格尚可被玩家接受,而对于写实类游戏,多采用由美术提供针对性制作的图片作为阴影图层.这种方案效果最为理想,缺点是需要多制作大量的图片资源,使游戏包增加不少. 在最近的开发中,我想到了另一种角色阴影图形的绘制方法,这里把它分享给大家. 原理很简单,就是利用OpenGL的图像变形技术,通过把角色自身的图片进行调整,使之变成一个阴影图像. 先上效果图: 具体实现: Op

数据类型之简单数据类型

ECMAScript中有五种简单数据类型(基本数据类型):Undefined,Null,Boolean,Number,String. Undefined 类型 Undefined类型只有一个值,即Undefined.使用 var 声明变量但没有对其初始化时,这个变量的值就是 undefined. 例如: var message ; alert(message == undefined); //true 上面的代码只是声明了 message,没有对其初始化,所以 message 的值就是 unde

[Echarts可视化] 一.入门篇之简单绘制中国地图和贵州地区

最近发生了很多事情,去到了一个新环境学习.但是不论在哪里,我都需要不忘初心,坚持做自己喜欢的事情,在CSDN写博客.教学.爱娜.生活等等.        这篇文章主要是通过Echarts可视化介绍入门知识.中国地图和贵州地区各省份的数据分析.其中贵州地图才是这篇文章的核心内容.这是一篇入门文章,希望对您有所帮助,如果文章中存在不足之处,还请海涵~        官网地址:http://echarts.baidu.com/index.html 一. 入门介绍-第一张图 强烈推荐大家阅读官网的教程进

理解各种数据类型和简单类的内存存放.

基本数据类型.int ,char short. int a;a 标签代表一个地址的数据,里面的数据类型是int.所以占4个字节.a=3;给基本数据类型的标签赋直.就等于给标签代表的地址的数据赋直.a 标签既然代表一个地址的数据,那么它的地址用&a来获得.&a: 0x22ff1c: 03 00 00 00&(&a)会错误.因为&a并不是内存某个地方. 数组类型. int a[3]首先,a[0],a[1],a[2] 和基本数据类型一样理解.a[0] 标签代表一个地址的数

iOS OpenGL ES简单绘制纹理

OpenGL 中任何复杂的图形都是由点,线 和三角形组成的. 那么一个矩形 就需要有两个三角形组成. 纹理, 可以理解为一张图片, 我么可以将整张or部分图片绘制到圆形, 矩形等目标图形中. 下图表示了顶点数据 对应 的纹理中的点. 左侧代表定点数据, 其坐标原点是屏幕中央 ; 右侧图片(纹理), 坐标原点是左下角 GLKBaseEffect让我们避开了写shader Language 着色器语言, 相当于对glsl的封装 typedef struct { GLKVector3 positonC