欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VAO,VBO,EBO

程序员文章站 2024-03-16 17:40:34
...

1.缓冲区的使用:

       //创建顶点缓冲区
       GLuint VBO,VAO,EBO;
       glGenVertexArrays(1,&VAO);
       glGenBuffers(1,&VBO); //该函数用于生成缓冲区对象名称
       glGenBuffers(1,&EBO);
       //绑定缓冲区
       glBindVertexArray(VAO);
       glBindBuffer(GL_ARRAY_BUFFER,VBO);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
       //缓冲区写入数据
       glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
       glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
       //缓冲区绑定至变量(设置顶点属性指针)
       glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void *)0);
       //开启变量
       glEnableVertexAttribArray(0);

2.VAO,VBO,EBO搭配使用

// ..:: 初始化代码 :: ..
// 1. 绑定顶点数组对象
glBindVertexArray(VAO);
// 2. 把我们的顶点数组复制到一个顶点缓冲中,供OpenGL使用
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 3. 复制我们的索引数组到一个索引缓冲中,供OpenGL使用
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 4. 设定顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//5.解绑VAO
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);

[...]

// ..:: 绘制代码(渲染循环中) :: ..
glUseProgram(shaderProgram);
//使用VAO进行绘制
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)
glBindVertexArray(0);

说明:VAO相当于一个中介,解决的是当我们绘制多个物体时的重复性工作,每个物体都要进行VBO,EBO的设置流程然后进行绘制,VAO将VBO和EBO中的设置进行保存,当需要绘制时直接使用VAO就可以进行绘制,(注意:当target是GL_ELEMENT_ARRAY_BUFFER时,VAO会自动存储glBindBuffer的调用,包括解绑的调用,也就是说不可以在解绑VAO之前解绑EBO,否则VAO中就会缺失EBO的数据)OpenGL要求我们必须使用VAO

注意:一定要在绑定VBO,EBO之前绑定VAO