【发布时间】: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