美文网首页
OpenGL ES(六)-绘图方式

OpenGL ES(六)-绘图方式

作者: king_jensen | 来源:发表于2019-06-17 11:54 被阅读0次
logo.jpg

序列绘图

序列绘图,顾名思义就是将顶点一个个按顺序排列存放在顶点缓存中。绘图时,我们按照组成图元顶点数量(点:一个顶点;线:两个顶点;三角形:三个顶点)一个个读取下来,并绘制形成图形。

jzt.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个这三个顶点组成。

sy.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]);  
    }  
}  

相关文章

网友评论

      本文标题:OpenGL ES(六)-绘图方式

      本文链接:https://www.haomeiwen.com/subject/sbvpfctx.html