GLES 顶点数组之 结构数组 与 数组结构

在OpenGL ES中指定顶点数据可以使用一个顶点数组对每个顶点指定,例如顶点位置信息 ,也可以将一个常量值用于一个图元的所有顶点,例如图元的颜色。

即常量顶点属性和顶点数组。


常量顶点属性

我们使用glVertexAttrib*命令来加载 index 指定的通用顶点属性。


顶点数组

顶点数组指定每个顶点的属性,是保存在应用程序地址空间的缓冲区。使用 glVertexAttribPointer 和 glVertexAttribIPointer 来指定。

分配和存储顶点数据有两种常用的方法,结构数组数组结构


结构数组:在一个缓冲区中,把每个顶点的多种属性作为一个结构,多个结构以数组的形式存储在缓冲区中。

数组结构:把多个顶点的每种顶点属性提取出来,不同的顶点属性分开存储在不同顶点属性的缓冲区中,然后组成一个结构。


用一张简图来表示结构数组和数组结构的区别:



下面在代码中来观察结构数组和数组结构的不同使用表现:

结构数组

#define  VERTEX_POS_SIZE 3 //x,y,z
#define  VERTEX_NORMAL_SIZE 3 //x,y,z
#define  VERTEX_TEXCOORD0_SIZE 2 //s and t
#define  VERTEX_TEXCOORD1_SIZE 2 //s and t

#define VERTEX_POS_INDEX 0
#define  VERTEX_NORMAL_INDEX 1
#define  VERTEX_TEXCOORD0_INDEX 2
#define  VERTEX_TEXCOORD1_INDEX 3

#define  VERTEX_POS_OFFSET 0
#define  VERTEX_NORMAL_OFFSET 3
#define  VERTEX_TEXCOORD0_OFFSET 6
#define  VERTEX_TEXCOORD1_OFFSET 8

#define  VERTEX_ATTRIBUTE_SIZE (VERTEX_POS_OFFSET+VERTEX_NORMAL_OFFSET+VERTEX_TEXCOORD0_OFFSET+VERTEX_TEXCOORD1_OFFSET)


//假设有1000个Vertex;
int numVertices=1000;
float* p=(float*)malloc(numVertices*VERTEX_ATTRIBUTE_SIZE*sizeof(float));

//设置顶点位置属性;
glVertexAttribPointer(VERTEX_POS_INDEX,VERTEX_POS_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p);

//设置顶点法线属性;
glVertexAttribPointer(VERTEX_NORMAL_INDEX,VERTEX_NORMAL_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p+VERTEX_NORMAL_OFFSET);

//设置TexCoord0;
glVertexAttribPointer(VERTEX_TEXCOORD0_INDEX,VERTEX_TEXCOORD0_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p+VERTEX_TEXCOORD0_OFFSET);

//设置TexCoord1;
glVertexAttribPointer(VERTEX_TEXCOORD1_INDEX,VERTEX_TEXCOORD1_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p+VERTEX_TEXCOORD1_OFFSET);

数组结构:

#define  VERTEX_POS_SIZE 3 //x,y,z
#define  VERTEX_NORMAL_SIZE 3 //x,y,z
#define  VERTEX_TEXCOORD0_SIZE 2 //s and t
#define  VERTEX_TEXCOORD1_SIZE 2 //s and t

#define VERTEX_POS_INDEX 0
#define  VERTEX_NORMAL_INDEX 1
#define  VERTEX_TEXCOORD0_INDEX 2
#define  VERTEX_TEXCOORD1_INDEX 3

#define  VERTEX_POS_OFFSET 0
#define  VERTEX_NORMAL_OFFSET 3
#define  VERTEX_TEXCOORD0_OFFSET 6
#define  VERTEX_TEXCOORD1_OFFSET 8

#define  VERTEX_ATTRIBUTE_SIZE (VERTEX_POS_OFFSET+VERTEX_NORMAL_OFFSET+VERTEX_TEXCOORD0_OFFSET+VERTEX_TEXCOORD1_OFFSET)


//假设有1000个Vertex;
int numVertices=1000;

/********* 数组结构 Start ******/

float* position=(float*)malloc(numVertices*VERTEX_POS_SIZE*sizeof(float));
float* normal=(float*)malloc(numVertices*VERTEX_NORMAL_SIZE*sizeof(float));
float* texcoord0=(float*)malloc(numVertices*VERTEX_TEXCOORD0_SIZE*sizeof(float));
float* texcoord1=(float*)malloc(numVertices*VERTEX_TEXCOORD1_SIZE*sizeof(float));

glVertexAttribPointer(VERTEX_POS_INDEX,VERTEX_POS_SIZE,GL_FLOAT,GL_FALSE,VERTEX_POS_SIZE*sizeof(float),position);
glVertexAttribPointer(VERTEX_NORMAL_INDEX,VERTEX_NORMAL_SIZE,GL_FLOAT,GL_FALSE,VERTEX_NORMAL_SIZE*sizeof(float),normal);
glVertexAttribPointer(VERTEX_TEXCOORD0_INDEX,VERTEX_TEXCOORD0_SIZE,GL_FLOAT,GL_FALSE,VERTEX_TEXCOORD0_SIZE*sizeof(float),texcoord0);
glVertexAttribPointer(VERTEX_TEXCOORD1_INDEX,VERTEX_TEXCOORD1_SIZE,GL_FLOAT,GL_FALSE,VERTEX_TEXCOORD1_SIZE*sizeof(float),texcoord1);


/********* 数组结构 End ******/

因为在结构数组中,每个定点的属性数据可以顺序方式读取,所以在 大部分情况下,使用结构数组更高效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值