![](https://img.haomeiwen.com/i2500437/0c36abf51a1037da.jpg)
序列绘图
序列绘图
,顾名思义就是将顶点一个个按顺序排列存放在顶点缓存中。绘图时,我们按照组成图元顶点数量(点:一个顶点;线:两个顶点;三角形:三个顶点)一个个读取下来,并绘制形成图形。
![](https://img.haomeiwen.com/i2500437/25698313e77a8751.png)
三角形X的坐标如下: vBackLeft(-1.0,-1.0,-1.0)vBackRight(1.0,-1.0,-1.0) vFrontRight(1.0,-1.0,1.0)
三角形Y的坐标如下: vFrontLeft(-1.0,-1.0,1.0)vBackLeft(-1.0,-1.0,-1.0) vFrontRight(1.0,-1.0,1.0
三角形面四侧:vApx(0.0,1.0,0.0) vBackRight(1.0,-1.0,-1.0) vBackLeft(-1.0,-1.0,-1.0)
vApx(0.0,1.0,0.0)vBackLeft(-1.0,-1.0,-1.0) vFrontLeft(-1.0,-1.0,1.0)
vApx(0.0,1.0,0.0) vFrontLeft(-1.0,-1.0,1.0)vFrontRight(1.0,-1.0,1.0)
vApx(0.0,1.0,0.0) vFrontRight(1.0,-1.0,1.0)vBackLeft(-1.0,-1.0,-1.0)
序列绘图
需要在顶点数组(顶点缓存区)中添加18个点。
关键代码:
glGenBuffers(1,&vboId);
glBindBuffer(GL_ARRAY_BUFFER,vboId);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STREAM_DRAW);
glEnableVertexAttribArray(0);//启用顶点位置属性索引
glVertexAttribPointer(0,4,GL_FLOAT,GL_FALSE,0,0);
//开始绘制
glDrawArrays(GL_TRIANGLES, 0, 3);
序列绘图采用glDrawArrays
函数,可以用如下伪代码解释:
void glDrawArrays(GLenum type, GLint start, GLint count)
{
for(GLint element = start; element < start + count; element++)
{
VertexShader(positionAttribArray[element], colorAttribArray[element]);
}
}
索引绘图
索引绘图
,顶点同样也是存放在顶点数组(顶点缓存区)中。但是在绘图过程中,顶点读取顺序并不是按照序列顺序读取,而是根据我们提供的顶点索引读取,比方我们要绘制一个三角形,我们可以用第3个、第5个、第2个这三个顶点组成。
![](https://img.haomeiwen.com/i2500437/65bd11bb6d0da4c2.png)
索引绘图只需要存储5个顶点,以及索引关系。
索引绘制需要做两件事:一个构造良好的索引数组和一个新的索引绘制命令。
索引数组
,存储在缓存对象中,它有一个特别的缓存对象,GL_ELEMENT_ARRAY_BUFFER
. 你可以使用这个缓存对象来作为正常的缓存对象使用,就像GL_ARRAY_BUFFE
。但是对于OpenGL
他有特殊含义,那就是索引绘图必须使用这个缓存对象。
为了进行索引绘图,我们需要将索引数组绑定到GL_ELEMENT_ARRAY_BUFFER,然后调用glDrawElements。
函数原型如下:
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
GLvoid *elementArray;
void glDrawElements(GLenum type, GLint count, GLenum type, GLsizeiptr indices)
{
GLtype *ourElementArray = (type*)((GLbyte *)elementArray + indices);
for(GLint elementIndex = 0; elementIndex < count; elementIndex++)
{
GLint element = ourElementArray[elementIndex];
VertexShader(positionAttribArray[element], colorAttribArray[element]);
}
}
网友评论