【发布时间】:2013-12-05 05:09:13
【问题描述】:
当前绑定到 OpenGL 中GL_ELEMENT_ARRAY_BUFFER 目标的缓冲区是顶点数组对象(从这里开始的 VAO)中包含的状态的一部分。根据 OpenGL 4.4 核心配置文件规范,在没有绑定 VAO 的情况下尝试更改或访问 GL_ELEMENT_ARRAY_BUFFER 似乎是一个错误:
10.4 顶点数组对象
...
INVALID_OPERATION错误由任何命令生成 没有顶点数组时修改、绘制或查询顶点数组状态 是绑定的。这发生在初始 GL 状态,并且可能发生 BindVertexArray 的结果或 DeleteVertexArrays 的副作用。
OpenGL wiki 的 Buffer Object 页面支持此功能:
GL_ELEMENT_ARRAY_BUFFER
gl*Draw*Elements*形式的所有渲染函数都将使用指针 字段作为从绑定到 this 的缓冲区对象开始的字节偏移量 目标。用于索引渲染的索引将从缓冲区中获取 目的。 请注意,此绑定目标是顶点数组对象状态的一部分, 因此在此处绑定缓冲区之前必须绑定 VAO。
现在,如果不是这样就好了。它将使创建和管理与任何特定 VAO 分开的索引缓冲区变得容易。但是,如果在没有绑定 VAO 时仅将缓冲区绑定到 GL_ELEMENT_ARRAY_BUFFER 是禁止的,那么唯一的选择是表示索引缓冲区的类在创建/更新/等时绑定虚拟 VAO。
Nicol Bolas 的出色 OpenGL tutorial 表示这种使用方式实际上是有效的:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER): 在没有 VAO 绑定的情况下调用它不会失败。
这似乎与标准和 opengl.org wiki 相矛盾。标准中是否有我遗漏的支持这一点的内容,还是仅指不需要使用 VAO 的兼容性配置文件上下文?
【问题讨论】: