我确信如果你通过绑定一个缓冲区glBindBuffer()
,你可以放心地假设它保持绑定,直到目标通过另一个调用反弹glBindBuffer()
。因此,当我发现调用glBindVertexArray()
将绑定到 GL_ELEMENT_ARRAY 目标的缓冲区设置为 0 时,我感到非常惊讶。
这是最小的 C++ 示例代码:
GLuint buff;
glGenBuffers(1, &buff);
std::cout << "Buffer is " << buff << "\n";
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buff);
GLuint vao;
glGenVertexArrays(1, &vao);
GLint bound_buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound before glBindVertexArray: " << bound_buff << "\n";
glBindVertexArray(vao);
// ^- an implicit glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); ?
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound after glBindVertexArray: " << bound_buff << "\n";
我在初始化 OpenGL 3.2 设备上下文后立即运行此代码并获得以下输出:
Buffer is 1
Bound before glBindVertexArray: 1
Bound after glBindVertexArray: 0
另一方面,调用不会更改 GL_ARRAY_BUFFER。我检查了 OpenGL 3.2 规范 (2.10)glBindVertexArray
并没有发现任何意外的副作用。
- 这种行为是否符合规范?
- 如果是这样,调用 to 会产生哪些其他副作用
glBindVertexArray
? - 这背后的原因是什么?
我在带有 296.10 WHQL 驱动程序的 Win XPx64 机器上的 nvidia 卡上对此进行了测试。使用 nvidia GT330M 在 OS X Lion 上进行的快速测试给出了相同的结果。