【问题标题】:Why does call glBindBuffer() two times?为什么调用 glBindBuffer() 两次?
【发布时间】:2018-03-23 08:04:48
【问题描述】:
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之后, 变量“axes”的信息存储在 GL_ARRAY_BUFFER 中。
之后,它们生成、绑定 VAO 并再次调用 glBindBuffer。
我不明白他们为什么这样做。
我知道 glBufferData() 删除当前缓冲存储(如果已经存在),并创建一个新的缓冲存储。这意味着在第二次调用 glBindBuffer 时,变量 'axes' 的信息会逐渐消失。
请帮帮我..

【问题讨论】:

  • glBindBuffer 的调用发生在当前绑定的VAO 的上下文中。所以第一次调用glBindBuffer 将绑定VBO_axes 到那个点绑定的VAO(大概是默认的VAO),而第二次调用glBindBuffer 将绑定到VAO_axes。 (不确定我在这里的术语是否完全正确,所以我将其作为评论而不是答案。)
  • @G.M.:“调用 glBindBuffer 发生在当前绑定的 VAO 的上下文中。”不,它没有。 glBindBuffer 仅在您绑定到 GL_ELEMENT_ARRAY_BUFFER 目标时才会影响 VAO 状态。 GL_ARRAY_BUFFER 绑定是 not part of VAO state.
  • @NicolBolas 我已纠正。感谢您的澄清。

标签: opengl


【解决方案1】:

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

但是,如果您绑定了正确的缓冲区,那么无论您之前做了什么,它都将始终有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 2021-11-25
    • 2012-12-12
    • 2015-12-24
    • 2012-12-10
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多