为什么两次调用glBindBuffer()?

时间:2018-03-23 08:04:48

标签: opengl

void prepare_axes(void) { 
axes[0][0] = -win_width / 2.5f; axes[0][1] = 0.0f; 
axes[1][0] = win_width / 2.5f; axes[1][1] = 0.0f;    
axes[2][0] = 0.0f; axes[2][1] = -win_height / 2.5f;     
axes[3][0] = 0.0f; axes[3][1] = win_height / 2.5f;

// Initialize vertex buffer object.     
glGenBuffers(1, &VBO_axes);
glBindBuffer(GL_ARRAY_BUFFER, VBO_axes);
glBufferData(GL_ARRAY_BUFFER, sizeof(axes), axes, GL_STATIC_DRAW);

// Initialize vertex array object.  
glGenVertexArrays(1, &VAO_axes); 
glBindVertexArray(VAO_axes);

glBindBuffer(GL_ARRAY_BUFFER, VBO_axes); 
glVertexAttribPointer(LOC_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
}

我正在研究OpenGL源代码,但我不明白为什么两次调用glBindBuffer(GL_Array_Buffer,VBO_axes)。
根据我的理解,他们第一次调用glGenBuffer,glBindBuffer和glBufferData后, 变量'轴的信息'存储在GL_ARRAY_BUFFER中。
之后,他们生成,绑定VAO并再次调用glBindBuffer 我无法理解为什么他们这样做。
我知道glBufferData()会删除当前缓冲区存储(如果已有),并创建一个新的缓冲区存储区。这意味着变量'轴的信息。第二次调用glBindBuffer时会消失。
请帮帮我..

1 个答案:

答案 0 :(得分:0)

从技术上讲,在这种情况下,他们不会 进行额外绑定。但是,这样做是个好主意,因为它很容易意外破坏无法使用它的代码。如果程序员想要更改缓冲区创建代码以使用GL_ARRAY_BUFFER绑定创建两个缓冲区对象,则后续代码将被破坏。

但是,如果你绑定了正确的缓冲区,那么无论你以前做过什么,它都会一直有效。