VAO和元素缓冲区对象 [英] VAOs and Element Buffer Objects

查看:93
本文介绍了VAO和元素缓冲区对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在阅读有关VAO如何与VBO一起工作的信息.据我了解,当我们调用glVertexAttribPointer时,VAO仅存储有关VBO的状态信息.我的问题是,什么时候它会存储有关EBO的状态(用于索引图形),当调用glVertexAttribPointer时,它是否同时保存两种状态?

I've been reading a bit about how VAOs work with VBOs. As far as I understand, the VAO only stores state information about a VBO when we call glVertexAttribPointer. My question is, when does it store state about an EBO (for indexed drawing), does it save state for both when glVertexAttribPointer is called?

//Vertices of the rectangle
std::vector<GLfloat> vertices
{
    0.5f,  0.5f, 0.0f,  // Top Right
    0.5f, -0.5f, 0.0f,  // Bottom Right
    -0.5f,  0.5f, 0.0f,  // Top Left 
    -0.5f, -0.5f, 0.0f,  // Bottom Left
};

//Indices of the triangle
std::vector<GLuint> indices
{
    0, 1, 3,
    0, 3, 2
};


GLuint VAO, VBO, EBO; 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);

glBindVertexArray(VAO); //Bind the VAO

//Bind the buffers
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);

glBindVertexArray(0); //Unbind the VAO

//Supply Index Buffer information
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

//Custom shader class that stores the program to be used at render time
Shader shader("..path_to_shader\\shaders\\vertexshader.vert", "..path_to_shader\\shaders\\fragmentshader.frag");

while (!glfwWindowShouldClose(window))
{
    glUseProgram(shader.Program());
    glBindVertexArray(VAO); //Bind the VAO to draw.
    glClearBufferfv(GL_COLOR, 0, &color[0]);

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);

    glfwPollEvents();
    glfwSwapBuffers(window);

    glBindVertexArray(0);
    glUseProgram(0);
}

推荐答案

来自 opengl.org :

顶点数组对象(VAO)是OpenGL对象,用于存储所有 提供顶点数据所需的状态(记录了一个小例外) 以下).它存储顶点数据的格式以及缓冲区 提供顶点数据数组的对象(见下文).

A Vertex Array Object (VAO) is an OpenGL Object that stores all of the state needed to supply vertex data (with one minor exception noted below). It stores the format of the vertex data as well as the Buffer Objects (see below) providing the vertex data arrays.

在下面,位于索引缓冲区

索引缓冲区绑定存储在VAO中.

The index buffer binding is stored within the VAO.

对于GL_ARRAY_BUFFER,当您调用glVertexAttribPointer时,VAO将保存绑定.基本上是因为GL_ARRAY_BUFFER绑定不是VAO状态的一部分.因此,调用glBindBuffer(GL_ARRAY_BUFFER, vertexBufferHandle)不会对VAO的状态产生任何作用.

For GL_ARRAY_BUFFER the VAO will save the binding when you call glVertexAttribPointer. It is basically because the GL_ARRAY_BUFFER binding is not part of the VAO's state. So calling glBindBuffer(GL_ARRAY_BUFFER, vertexBufferHandle) won't do anything with the VAO's state.

对于GL_ELEMENT_ARRAY_BUFFER并非如此: VAO(如果已绑定)将在您调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferHandle)时将索引缓冲区绑定保存到其状态.

For GL_ELEMENT_ARRAY_BUFFER it's not the case: the VAO (if bound) will save your index buffer binding to it's state when you call glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferHandle).

关于OpenGL 索引缓冲 opengl-tutorial.org 上的另一基本内容.

There are great tutorials about OpenGL indexed buffering and another basic stuff on opengl-tutorial.org.

这篇关于VAO和元素缓冲区对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆